Skip to main content
POST
/
kyc
/
watchlists
Create Watchlist
curl --request POST \
  --url https://api.example.com/kyc/watchlists

Endpoint

POST /kyc/watchlists

Authentication

Requires watchlist:create permission.

Request Body

Webhook URLs and notification emails are configured at the tenant level, not per-watchlist. Contact support to configure your notification channels.

Request Example

curl -X POST https://stg.kyc.legaltalent.ai/kyc/watchlists \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "High Risk Customers",
    "check_frequency": "daily",
    "lists_to_monitor": ["ofac", "un"]
  }'

Additional Request Examples

Watchlist with Initial Subjects

curl -X POST https://stg.kyc.legaltalent.ai/kyc/watchlists \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Vendor Monitoring",
    "subjects": [
      {
        "full_name": "John Doe",
        "identifier": "12345678",
        "identifier_type": "document"
      },
      {
        "full_name": "Acme Corporation",
        "identifier": "TAX-987654",
        "identifier_type": "tax_id"
      }
    ],
    "lists_to_monitor": ["ofac", "un", "eu"],
    "check_frequency": "weekly",
    "status": "active"
  }'

Watchlist with Alerts

curl -X POST https://stg.kyc.legaltalent.ai/kyc/watchlists \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Executive Monitoring",
    "check_frequency": "daily",
    "lists_to_monitor": ["ofac", "un"],
    "alert_config": {
      "on_new_match": true,
      "on_status_change": true
    }
  }'
Notification webhooks and emails are configured at the tenant level. The alert_config only controls when to send alerts, not where.

Crypto Wallet Monitoring

curl -X POST https://stg.kyc.legaltalent.ai/kyc/watchlists \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Crypto Wallets",
    "subjects": [
      {
        "full_name": "Bitcoin Wallet 1",
        "identifier": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
        "identifier_type": "wallet"
      }
    ],
    "lists_to_monitor": ["ofac"],
    "check_frequency": "daily"
  }'

Usage Examples

Python

import requests

url = "https://stg.kyc.legaltalent.ai/kyc/watchlists"
headers = {
    "Authorization": "Bearer YOUR_TOKEN",
    "Content-Type": "application/json"
}

# Simple watchlist
payload = {
    "name": "High Risk Customers",
    "check_frequency": "daily",
    "lists_to_monitor": ["ofac", "un"]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

# Watchlist with subjects
payload = {
    "name": "Vendor Monitoring",
    "subjects": [
        {
            "full_name": "John Doe",
            "identifier": "12345678",
            "identifier_type": "document"
        },
        {
            "full_name": "Acme Corporation",
            "identifier": "TAX-987654",
            "identifier_type": "tax_id"
        }
    ],
    "lists_to_monitor": ["ofac", "un", "eu"],
    "check_frequency": "weekly",
    "status": "active"
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

# Watchlist with alerts
payload = {
    "name": "Executive Monitoring",
    "check_frequency": "daily",
    "lists_to_monitor": ["ofac", "un"],
    "alert_config": {
        "on_new_match": True,
        "on_status_change": True
    }
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

JavaScript

const url = 'https://stg.kyc.legaltalent.ai/kyc/watchlists';

// Simple watchlist
const simplePayload = {
  name: 'High Risk Customers',
  check_frequency: 'daily',
  lists_to_monitor: ['ofac', 'un']
};

fetch(url, {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(simplePayload)
})
  .then(response => response.json())
  .then(data => console.log(data));

// Watchlist with subjects
const payloadWithSubjects = {
  name: 'Vendor Monitoring',
  subjects: [
    {
      full_name: 'John Doe',
      identifier: '12345678',
      identifier_type: 'document'
    },
    {
      full_name: 'Acme Corporation',
      identifier: 'TAX-987654',
      identifier_type: 'tax_id'
    }
  ],
  lists_to_monitor: ['ofac', 'un', 'eu'],
  check_frequency: 'weekly',
  status: 'active'
};

fetch(url, {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(payloadWithSubjects)
})
  .then(response => response.json())
  .then(data => console.log(data));

// Watchlist with alerts
const payloadWithAlerts = {
  name: 'Executive Monitoring',
  check_frequency: 'daily',
  lists_to_monitor: ['ofac', 'un'],
  alert_config: {
    on_new_match: true,
    on_status_change: true
  }
};

fetch(url, {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(payloadWithAlerts)
})
  .then(response => response.json())
  .then(data => console.log(data));

Response

Success Response (201 Created)

{
  "status": "success",
  "data": {
    "watchlist_id": "550e8400-e29b-41d4-a716-446655440000",
    "tenant_id": "tenant123",
    "name": "High Risk Customers",
    "subjects": [
      {
        "subject_id": "660e8400-e29b-41d4-a716-446655440001",
        "full_name": "John Doe",
        "identifier": "12345678",
        "identifier_type": "document",
        "added_at": "2024-11-22T10:30:00Z"
      }
    ],
    "lists_to_monitor": ["ofac", "un"],
    "check_frequency": "daily",
    "last_checked_at": null,
    "next_check_due": 1732278600000,
    "last_results": null,
    "alert_config": {
      "on_new_match": true,
      "on_status_change": true
    },
    "status": "active",
    "created_at": "2024-11-22T10:30:00Z",
    "updated_at": "2024-11-22T10:30:00Z"
  }
}

Response Fields

FieldTypeDescription
watchlist_idstringUnique identifier for the watchlist
tenant_idstringYour tenant identifier
namestringWatchlist name
subjectsarrayList of subjects being monitored
lists_to_monitorarrayLists to check against
check_frequencystringScreening frequency
last_checked_atstring/nullLast check timestamp (ISO 8601)
next_check_duenumber/nullNext check timestamp (Unix milliseconds)
last_resultsobject/nullMost recent screening results
alert_configobjectAlert configuration
statusstringWatchlist status (active or paused)
created_atstringCreation timestamp (ISO 8601)
updated_atstringLast update timestamp (ISO 8601)

Error Responses

400 Bad Request

{
  "status": "error",
  "error": {
    "type": "ValidationError",
    "message": "Watchlist name is required",
    "code": "VALIDATION_ERROR"
  }
}
Common validation errors:
  • Missing or empty name field
  • Invalid check_frequency value
  • Invalid lists_to_monitor values
  • Invalid subject data

403 Forbidden

{
  "message": "User is not authorized to perform this action"
}
Your token lacks the watchlist:create permission.

Subject Fields

When adding subjects during creation:
FieldTypeRequiredDescription
full_namestringYes*Full name of the subject
identifierstringNoDocument ID, wallet address, email, etc.
identifier_typestringNoType: “document”, “wallet”, “email”, “tax_id”, etc.
*Required if no identifier is provided

Best Practices

You can create a watchlist without subjects and add them later using the Add Subjects endpoint. This is useful when setting up infrastructure before onboarding subjects.
  • Daily: High-risk entities, regulatory requirements, active monitoring
  • Weekly: Standard monitoring, cost optimization
  • On Update: Static lists, manual control, lowest cost
Set up webhooks and email notifications when creating the watchlist to ensure you don’t miss critical alerts during the first screening cycle.
Only monitor lists relevant to your jurisdiction and risk profile:
  • US entities: Include ofac
  • International: Include un and eu
  • Uruguay PEPs: Include senaclaft_uy

Status Codes

CodeDescription
201Created - Watchlist created successfully
400Bad Request - Invalid parameters
401Unauthorized - Missing or invalid token
403Forbidden - Insufficient permissions
500Internal Server Error

Next Steps

After creating a watchlist:
  1. Add subjects to begin monitoring
  2. Get watchlist details to verify configuration
  3. Set up webhook endpoint to receive alerts
  4. Monitor screening activity with the Usage API