This page describes the complete production integration workflow for KYC Protect, applicable to both business entities and individual persons:
- Authenticate - Generate authentication token
- Create Profile - Establish entity profile for grouping and monitoring
- Run AML Screening - Execute comprehensive AML search (business or individual)
- Link Search to Profile - Associate search results with profile
- Review AML Hits - Retrieve and analyze screening matches
- Update Hit Decisions - Classify matches (true match, false positive, undecided)
- Enable AML Monitoring - Configure ongoing monitoring schedules
- Enable KYC Monitoring - Set up country-specific compliance monitoring
- Retrieve KYC Alerts - Get list of monitoring alerts for the profile
- Update Alert Status - Classify and resolve KYC alerts
ℹ️ Important: This workflow is identical for both business and individual screening. The only differences are in Steps 2-3 (profile creation and AML search endpoints/parameters). All other steps use the same APIs and follow the same pattern.
| Attribute | Value |
|---|---|
| Arazzo Version | 1.0.1 |
| Workflow Count | 2 (Business & Individual) |
| Workflow Steps | 10 (Complete integration with alert management) |
| Applies To | Business Entities & Individual Persons |
| OpenAPI Sources | 1 |
| Source Type | openapi |
| Main Use Case | Complete KYC Protect Integration |
| Workflow Style | Multi-step Integration with Profile Management |
| Authentication | Token-based |
| Profile Management | Yes |
| Monitoring | Yes (AML & KYC) |
| Alert Management | Yes |
| Intended Audience | Integration Teams, Developers, Compliance Officers |
Diagram summary: Authenticate, create a profile, run AML screening, link searches to the profile, review and update hits, add searches to AML monitoring and update schedules, and optionally add profiles to KYC monitoring to review alerts and update alert statuses.
| Step | Endpoint (Business) | Endpoint (Individual) | Purpose |
|---|---|---|---|
| 1 | POST /authenticate | POST /authenticate | Generate authentication token |
| 2 | POST /compliance/kyc-protect/profiles | POST /compliance/kyc-protect/profiles | Create entity profile |
| 3 | POST /compliance/kyc-protect/searches/businesses | POST /compliance/kyc-protect/searches/individuals | Run AML screening |
| 4-10 | Identical for both entity types | Identical for both entity types | Link, review, classify, monitor, alert management |
Diagram summary: This sequence diagram shows the complete integration flow for both business and individual entities, with the only variation being the specific search endpoint used in Step 3.
Diagram summary: This decision flow shows success and failure paths for each stage, applicable to both business and individual workflows. Note: If country doesn't support KYC monitoring at decision point O, the workflow skips Steps 8-10 and completes successfully at Step 7.
All endpoints follow standard Connect API error patterns. Errors include a correlationId for support tracking.
| Code | Meaning | Typical Cause | Action |
|---|---|---|---|
| 400 | Bad Request | Invalid parameters, validation failure | Check request body against schema, verify enum values (threshold: 75/80/85/90/95/100, decision: trueMatch/falsePositive/undecided, alert status: open/closedProcessed/closedUnprocessed) |
| 401 | Unauthorized | Invalid/expired token | Re-authenticate using Step 1 |
| 403 | Forbidden | Insufficient permissions or credits | Verify account permissions and credit balance |
| 404 | Not Found | Resource doesn't exist | Verify resource ID from previous step output |
| 409 | Conflict | Duplicate resource (e.g., profile name) | Use unique identifiers or retrieve existing resource |
| 500 | Internal Server Error | System issue | Retry with exponential backoff (2s, 4s, 8s), contact support if persists |
{
"correlationId": "550e8400-e29b-41d4-a716-446655440000",
"message": "Validation failed",
"details": "threshold must be one of: 75, 80, 85, 90, 95, 100"
}- 401 (Unauthorized): Re-authenticate once, then fail
- 403 (Forbidden): Do not retry (permission issue)
- 404 (Not Found): Do not retry in workflow (indicates data flow error)
- 409 (Conflict): Do not retry (resource already exists)
- 500/503 (Server Errors): Retry up to 3 times with exponential backoff
Before using any of the endpoints, you must authenticate. This ensures you have the necessary permissions to access the data.
Applies To: Business & Individual workflows
POST /authenticate{
"username": "your-username",
"password": "your-password"
}{
"token": "eyJhbGciOi..."
}| Condition |
|---|
HTTP Status Code = 200 |
| Authentication token returned |
| Output | Description |
|---|---|
token | Bearer token used for subsequent API requests |
| Status | Cause |
|---|---|
| 401 | Invalid credentials |
Profiles are required for grouping searches, monitoring, and audit trails. The profile structure differs slightly between business and individual entities.
Key Difference: Use appropriate type and details structure for your entity.
POST /compliance/kyc-protect/profiles⚠️ Required:
details.legalNameis always required, for every profiletype— includingindividual. It holds the full name of the business or person. There is no separatefirstName/lastNamepair at the profile level.
{
"name": "Creditsafe Ltd",
"type": "company",
"details": {
"legalName": "Creditsafe Ltd",
"organizationNumber": "03495298",
"vatNo": "GB12345678"
}
}{
"name": "John Smith",
"type": "individual",
"details": {
"legalName": "John Smith",
"dateOfBirth": "1980-05-15",
"countryCode": "GB"
}
}| Value | Description | Entity Category |
|---|---|---|
company | Limited company | Business |
plc | Public limited company | Business |
partnership | Partnership | Business |
soleTrader | Sole trader business | Business |
trust | Trust entity | Business |
otherEntity | Other entity type | Business |
individual | Individual person | Individual |
| Condition |
|---|
HTTP Status Code = 201 |
Profile id returned |
| Output | Description |
|---|---|
profileId | Unique profile identifier for subsequent operations |
| Status | Cause |
|---|---|
| 400 | Missing required fields (name, type) or invalid profile type |
| 401 | Token expired |
| 409 | Profile name already exists |
Execute comprehensive AML screening. Choose the appropriate endpoint based on entity type.
Key Difference: Use /searches/businesses for companies or /searches/individuals for persons.
POST /compliance/kyc-protect/searches/businesses{
"countryCodes": ["GB"],
"threshold": 85,
"name": "Creditsafe",
"datasets": ["AM"]
}| Property | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Business name to screen |
threshold | integer | Yes | Match threshold (75, 80, 85, 90, 95, or 100) |
datasets | array | Yes | AML datasets to screen against |
countryCodes | array | No | Country filter for screening |
POST /compliance/kyc-protect/searches/individuals{
"threshold": 80,
"name": "Donald Trump",
"datasets": ["AM", "PEP"]
}{
"threshold": 80,
"firstName": "Donald",
"lastName": "Trump",
"dateOfBirth": "1946-06-14",
"gender": "male",
"datasets": ["AM", "PEP", "SAN"]
}| Property | Type | Required | Description |
|---|---|---|---|
name | string | Conditional | Full name (required if firstName/lastName not provided) |
firstName | string | Conditional | First name (required if name not provided) |
lastName | string | Conditional | Last name (required if name not provided) |
middleName | string | No | Middle name |
dateOfBirth | string | No | Date of birth (YYYY-MM-DD format) |
gender | string | No | Gender ("male" or "female") |
threshold | integer | Yes | Match threshold (75, 80, 85, 90, 95, or 100) |
datasets | array | Yes | AML datasets (PEP available for individuals) |
countryCodes | array | No | Country filter for screening |
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "Creditsafe Ltd",
"threshold": 85,
"type": "business",
"datasets": ["AM"],
"status": "new",
"riskRating": "veryLow",
"totalHitCount": 1
}Note: Response structure is identical. The
typefield indicates"business"or"individual".
| Condition |
|---|
HTTP Status Code = 201 |
Search id returned |
| Output | Description |
|---|---|
searchId | Unique AML search identifier |
totalHitCount | Number of AML matches returned |
riskRating | Calculated AML risk level |
| Status | Cause |
|---|---|
| 400 | Invalid threshold (must be 75, 80, 85, 90, 95, or 100) or invalid dataset code |
| 401 | Token expired |
| 403 | Insufficient credits |
ℹ️ Important: Steps 4-10 use identical endpoints and processes for both business and individual entities. Simply use the
searchIdfrom Step 3 in the appropriate endpoint path.
Attach the search to the profile for future monitoring.
Applies To: Business & Individual workflows (identical)
POST /compliance/kyc-protect/profiles/{profileId}/searches/link{
"searchIds": ["497f6eca-6276-4993-bfeb-53cbbbba6f08"]
}| Status | Cause |
|---|---|
| 400 | Invalid searchId or profileId format |
| 409 | Search already linked to profile |
Retrieve screening hits for review.
Applies To: Business & Individual workflows (use appropriate path)
GET /compliance/kyc-protect/searches/businesses/{searchId}/hits
GET /compliance/kyc-protect/searches/individuals/{searchId}/hits{
"items": [
{
"id": "hit-123",
"hitScore": 92,
"name": "Creditsafe Holdings Ltd",
"match": "Creditsafe Holdings Ltd",
"countries": ["GB"],
"datasets": ["AM"],
"decision": "undecided",
"note": null,
"modifiedAt": "2026-07-16T10:30:00Z",
"createdAt": "2026-07-16T09:00:00Z"
}
],
"totalSize": 1
}Note: The response is a paginated collection (
items+totalSize), not a bare array. Hits do not carry ariskRating— that field belongs to the profile/search, not the individual hit.
| Status | Cause |
|---|---|
| 404 | Search not found |
Classify each hit with a decision.
Applies To: Business & Individual workflows (use appropriate path)
PUT /compliance/kyc-protect/searches/{businesses|individuals}/{searchId}/hits/{hitId}{
"decision": "trueMatch",
"note": "Confirmed match after manual review"
}| Decision | Description | Can be Changed |
|---|---|---|
undecided | Initial state | Cannot be re-applied once changed |
trueMatch | Confirmed match | Can be changed to falsePositive |
falsePositive | Confirmed non-match | Can be changed to trueMatch |
| Status | Cause |
|---|---|
| 400 | Invalid decision value (must be trueMatch, falsePositive, or undecided) |
| 404 | Search or hit not found |
Configure ongoing monitoring schedules.
Applies To: Business & Individual workflows (identical)
⚠️ Prerequisite: The search must already be linked to a profile (Step 4) before it can be added to monitoring.
POST /compliance/kyc-protect/schedules{
"items": [
{
"searchId": "search-456",
"threshold": 85,
"datasets": ["AM", "SAN"],
"isEmailRequired": true,
"emailRecipients": ["alerts@yourdomain.com"]
}
]
}Body is { "items": [...] } — an array of schedule objects, one per search. There is no frequency (daily/weekly/monthly) setting; monitoring runs on Creditsafe's schedule and re-screens using the threshold/datasets given here.
| Property (per item) | Type | Required | Description |
|---|---|---|---|
searchId | string (uuid) | Yes | The search to schedule for monitoring |
threshold | integer | Yes | Match threshold (75, 80, 85, 90, 95, or 100) |
datasets | array | Yes | AML datasets to screen against |
sanctionBodies | array | No | Sanction bodies to search; when omitted, Settings preferences (or all) apply |
isEmailRequired | boolean | No | Send an email when the schedule runs (ignored if no emailRecipients) |
emailRecipients | array | No | Email addresses to notify when the schedule runs |
isDobRequired | boolean | No | Default false; valid alongside dateOfBirth only |
| Status | Cause |
|---|---|
| 400 | Invalid threshold (must be 75, 80, 85, 90, 95, or 100), invalid dataset code, or search not linked to a profile |
Set up country-specific compliance monitoring (if supported).
Applies To: Business & Individual workflows (identical)
- Profile must have a valid
safeNumber - Country must support KYC monitoring
GET /compliance/kyc-protect/lookup/kycMonitoring/countryCodesIf country not supported: Skip Steps 8-10 (KYC monitoring unavailable). Workflow completes at Step 7.
POST /compliance/kyc-protect/kycMonitoring/profiles/bulk{
"items": ["profile-123"]
}Note: The array key is
items(list of profile IDs), notprofileIds.
| Status | Cause |
|---|---|
| 400 | Country not supported for KYC monitoring or profile missing safeNumber |
| 404 | Profile not found |
| 409 | Profile already enrolled in monitoring |
Retrieve monitoring alerts generated for the profile.
Applies To: Business & Individual workflows (identical)
GET /compliance/kyc-protect/kycMonitoring/profiles/{profileId}/alerts| Parameter | Description |
|---|---|
profileId | Profile identifier from Step 2 |
| Parameter | Type | Description |
|---|---|---|
statuses | array | Filter by status: open, closedProcessed, closedUnprocessed |
page | integer | Page number for pagination |
pageSize | integer | Number of alerts per page |
GET /compliance/kyc-protect/kycMonitoring/profiles/profile-123/alerts?statuses=open
Authorization: Bearer <token>{
"items": [
{
"id": "alert-456",
"profileId": "profile-123",
"safeNumber": "GB1234567",
"companyId": "company-789",
"ruleName": "directorChange",
"previousValue": "Jane Doe",
"newValue": "John Smith",
"eventAt": "2026-07-16T10:30:00Z",
"status": "open",
"note": null,
"createdAt": "2026-07-16T10:30:05Z",
"createdById": 1015,
"createdBy": "compliance.user@company.com",
"modifiedAt": null,
"modifiedById": null,
"modifiedBy": null
}
],
"totalSize": 1
}Note: There is no
alertType,description, orseverityfield. The alert object identifies the change viaruleName(what triggered it),previousValue/newValue(what changed), andeventAt(when the underlying change happened, as distinct fromcreatedAt— when the alert record itself was created).
| Condition |
|---|
HTTP Status Code = 200 |
| Alerts collection returned (can be empty) |
| Output | Description |
|---|---|
alerts | Collection of KYC monitoring alerts |
firstAlertId | Alert identifier from the first item in alerts |
| Status | Cause |
|---|---|
| 404 | Profile not found or not enrolled in KYC monitoring |
| 409 | Conflict |
Update the status of a KYC alert after review.
Applies To: Business & Individual workflows (identical)
PUT /compliance/kyc-protect/kycMonitoring/profiles/{profileId}/alerts/{alertId}| Parameter | Description |
|---|---|
profileId | Profile identifier from Step 2 |
alertId | Alert identifier from Step 9 |
Only status and note are accepted — the endpoint does not accept alertType or any other field.
| Property | Type | Required | Description |
|---|---|---|---|
status | string | No | Status of the alert |
note | string | No | Note associated with the alert |
{
"status": "closedProcessed",
"note": "Director change verified and documented in compliance records"
}| Status | Description | Use Case |
|---|---|---|
open | Alert requires review | Initial state |
closedProcessed | Alert reviewed and actioned | Compliance action taken |
closedUnprocessed | Alert reviewed, no action needed | False positive or not relevant |
{
"id": "alert-456",
"profileId": "profile-123",
"safeNumber": "GB1234567",
"companyId": "company-789",
"ruleName": "directorChange",
"previousValue": "Jane Doe",
"newValue": "John Smith",
"eventAt": "2026-07-16T10:30:00Z",
"status": "closedProcessed",
"note": "Director change verified and documented in compliance records",
"createdAt": "2026-07-16T10:30:05Z",
"createdById": 1015,
"createdBy": "compliance.user@company.com",
"modifiedAt": "2026-07-16T11:00:00Z",
"modifiedById": 1015,
"modifiedBy": "compliance.user@company.com"
}Note: There is no
alertType,updatedAt, orupdatedByfield. The response is the full alert object (same shape as Step 9) withmodifiedAt/modifiedById/modifiedBynow populated.
| Condition |
|---|
HTTP Status Code = 200 |
| Alert status successfully updated |
| Output | Description |
|---|---|
alertUpdated | Confirmation that alert status was updated |
| Status | Cause |
|---|---|
| 400 | Invalid status value |
| 404 | Alert or profile not found |
| 409 | Conflict |
| Threshold | Behavior | Recommended Use |
|---|---|---|
| 75 | Very broad matches | Initial screening |
| 80 | Broad matches | Standard screening |
| 85 | Balanced precision | Recommended for production |
| 90 | Precise matches | Low false-positive tolerance |
| 95-100 | Very precise/exact | Highly specific screening |
| Dataset Code | Description | Available For |
|---|---|---|
AM | Adverse Media | Business & Individual |
SAN | Sanctions | Business & Individual |
PEP | Politically Exposed Persons | Individual only |
PEP-CURRENT | Current PEPs | Individual only |
PEP-FORMER | Former PEPs | Individual only |
DD | Disqualified Directors | Business only |
Diagram summary: Data flows from authentication through profile creation, search execution, linking, hit management, and monitoring setup.
Required:
- username, password
- profileName, profileType (company/plc/etc.)
- legalName
- threshold (75-100)
- datasets (array)
- hitDecision (undecided/trueMatch/falsePositive)
- alertStatus (open/closedProcessed/closedUnprocessed)
Optional:
- organizationNumber, vatNo
- searchCountryCodes
- hitNote
- emailRecipients, isEmailRequired (schedule notifications)
- alertNoteRequired:
- username, password
- profileName
- legalName
- name OR (firstName + lastName) (for AML search)
- threshold (75-100)
- datasets (array)
- hitDecision
- alertStatus (open/closedProcessed/closedUnprocessed)
Optional:
- dateOfBirth, countryCode (profile details)
- middleName, gender (AML search only)
- searchCountryCodes
- hitNote
- emailRecipients, isEmailRequired (schedule notifications)
- alertNote- Profile Naming: Include legal name and identifier (registration number or DOB)
- Hit Decisions: Always include descriptive notes for audit trails
- Dataset Selection: Use AM + SAN minimum; add PEP for individuals
- Monitoring: Keep schedule
threshold/datasetsaligned to your current risk criteria — there is no separate run-frequency setting - Thresholds: Use 85 for balanced production screening
- Alert Management: Review KYC alerts promptly and document actions taken
- Alert Status: Use
closedProcessedwhen action taken,closedUnprocessedfor false positives
All requests following authentication must include:
Authorization: Bearer <token>