Veridact API Reference
Programmatically run CDD, EDD, M&A due diligence screenings, and person background checks. Integrate Veridact's sanctions, PEP, adverse media, ICIJ offshore leaks, and FCRA-compliant person checks directly into your compliance workflows.
Authentication
All v1 API requests require a Bearer token in the Authorization header. Keys start with vrd_ and are shown only once on creation. Store them in environment variables — never hardcode in source.
# Set your API key as an environment variable export VERIDACT_API_KEY="vrd_your_api_key_here" # Use in every request curl -H "Authorization: Bearer $VERIDACT_API_KEY" \ https://veridact.solutions/api/v1/screenings
const VERIDACT_API_KEY = process.env.VERIDACT_API_KEY; // Reusable helper with auth header const veridact = async (path, options = {}) => { const res = await fetch(`https://veridact.solutions/api/v1${path}`, { ...options, headers: { 'Authorization': `Bearer ${VERIDACT_API_KEY}`, 'Content-Type': 'application/json', ...(options.headers || {}) } }); if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`); return res.json(); };
import os, requests BASE_URL = "https://veridact.solutions/api/v1" HEADERS = { "Authorization": f"Bearer {os.environ['VERIDACT_API_KEY']}", "Content-Type": "application/json" } # Reusable session session = requests.Session() session.headers.update(HEADERS)
Rate Limits
API requests are rate-limited per API key. Screening submissions also count against your plan's monthly quota. All rate limit state is returned in response headers.
Retry-After and implement exponential backoff with jitter. Never retry immediately.
Error Handling
All errors return JSON with success: false and a human-readable message. The code field is a stable machine-readable error identifier.
{
"success": false,
"message": "API key not found or has been revoked.",
"code": "invalid_api_key"
}
Quick Start
Run your first CDD screening in under 2 minutes.
curl -X POST https://veridact.solutions/api/v1/screening/cdd \ -H "Authorization: Bearer vrd_your_key" \ -H "Content-Type: application/json" \ -d '{ "query": "Sberbank", "entity_type": "company", "jurisdiction": "Russia" }'
const res = await fetch('https://veridact.solutions/api/v1/screening/cdd', { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.VERIDACT_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ query: 'Sberbank', entity_type: 'company', jurisdiction: 'Russia' }) }); const { screening } = await res.json(); console.log(`Risk: ${screening.risk_level} (${screening.risk_score}/100)`);
import os, requests res = requests.post( "https://veridact.solutions/api/v1/screening/cdd", headers={"Authorization": f"Bearer {os.environ['VERIDACT_API_KEY']}"}, json={"query": "Sberbank", "entity_type": "company", "jurisdiction": "Russia"} ) screening = res.json()["screening"] print(f"Risk: {screening['risk_level']} ({screening['risk_score']}/100)")
{
"success": true,
"screening": {
"id": 2847,
"search_query": "Sberbank",
"entity_type": "company",
"jurisdiction": "Russia",
"risk_level": "high",
"risk_score": 61,
"status": "completed",
"sanctions_hits": 1,
"pep_hits": 0,
"adverse_media_hits": 0,
"offshore_leaks_hits": 0,
"created_at": "2026-04-29T14:00:00.000Z"
}
}
CDD Screening
Screen an individual or company against 15+ global databases including OFAC SDN, EU Sanctions, UN 1267/1988, BIS Entity List, PEP databases, adverse media, and ICIJ offshore leaks (Panama Papers, Paradise Papers, Pandora Papers, Offshore Leaks, Bahamas Leaks).
| Field | Type | Required | Description |
|---|---|---|---|
| query | string | Required | Entity name to screen (min 2 chars) |
| entity_type | string | Optional | individual (default), company, or organization |
| jurisdiction | string | Optional | Country or jurisdiction (improves risk scoring accuracy) |
curl -X POST https://veridact.solutions/api/v1/screening/cdd \ -H "Authorization: Bearer $VERIDACT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "Roman Abramovich", "entity_type": "individual", "jurisdiction": "Russia" }'
const data = await veridact('/screening/cdd', { method: 'POST', body: JSON.stringify({ query: 'Roman Abramovich', entity_type: 'individual', jurisdiction: 'Russia' }) }); const { screening } = data;
res = session.post(
f"{BASE_URL}/screening/cdd",
json={
"query": "Roman Abramovich",
"entity_type": "individual",
"jurisdiction": "Russia"
}
)
res.raise_for_status()
screening = res.json()["screening"]
{
"success": true,
"screening": {
"id": 2848,
"search_query": "Roman Abramovich",
"entity_type": "individual",
"jurisdiction": "Russia",
"risk_level": "high", // "low" | "medium" | "high" | "critical"
"risk_score": 52, // 0–100
"status": "completed",
"sanctions_hits": 0,
"pep_hits": 0,
"adverse_media_hits": 1,
"offshore_leaks_hits": 3,
"summary": "CDD screening completed...",
"created_at": "2026-04-29T14:01:00.000Z"
}
}
EDD Screening
Enhanced Due Diligence runs all CDD checks plus an AI-powered deep analysis covering beneficial ownership, source of wealth/funds, AML risk assessment, and compliance recommendations. Requires Professional or Enterprise plan.
| Field | Type | Required | Description |
|---|---|---|---|
| query | string | Required | Entity name to screen |
| entity_type | string | Optional | individual or company |
| jurisdiction | string | Optional | Country or jurisdiction |
| source_of_wealth | string | Optional | Declared source of wealth (improves AI analysis) |
| source_of_funds | string | Optional | Declared source of transaction funds |
| purpose_of_relationship | string | Optional | Business relationship purpose |
| beneficial_ownership | string | Optional | Known ownership structure details |
| pep_relationships | string | Optional | Disclosed PEP connections |
curl -X POST https://veridact.solutions/api/v1/screening/edd \ -H "Authorization: Bearer $VERIDACT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "Volkov Industries GmbH", "entity_type": "company", "jurisdiction": "Germany", "source_of_wealth": "Manufacturing and exports since 1998", "source_of_funds": "Corporate revenue from EU operations", "purpose_of_relationship": "Long-term supply agreement" }'
const { screening } = await veridact('/screening/edd', { method: 'POST', body: JSON.stringify({ query: 'Volkov Industries GmbH', entity_type: 'company', jurisdiction: 'Germany', source_of_wealth: 'Manufacturing and exports since 1998' }) }); // screening.edd_analysis contains the AI deep-dive text console.log(screening.edd_analysis);
res = session.post(
f"{BASE_URL}/screening/edd",
json={
"query": "Volkov Industries GmbH",
"entity_type": "company",
"jurisdiction": "Germany",
"source_of_wealth": "Manufacturing and exports since 1998"
}
)
screening = res.json()["screening"]
print(screening.get("edd_analysis")) # AI deep-dive analysis text
M&A Due Diligence
AI-powered M&A due diligence for acquisition targets. Runs full CDD plus AI analysis across financial, legal, reputational, and integration risk domains. Enterprise plan only.
| Field | Type | Required | Description |
|---|---|---|---|
| target_name | string | Required | Acquisition target company name |
| target_jurisdiction | string | Optional | Target company jurisdiction |
| target_industry | string | Optional | Target industry (e.g. "FinTech", "Energy") |
| acquirer_name | string | Optional | Acquiring entity name |
| deal_type | string | Optional | acquisition, merger, joint_venture, restructuring |
| deal_value | string | Optional | Deal value (e.g. "$50M") |
| additional_context | string | Optional | Any additional context for the AI analysis |
curl -X POST https://veridact.solutions/api/v1/screening/ma \ -H "Authorization: Bearer $VERIDACT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "target_name": "CloudSync Technologies Ltd", "target_jurisdiction": "United Kingdom", "target_industry": "SaaS / Cloud Infrastructure", "acquirer_name": "Acme Corp", "deal_type": "acquisition", "deal_value": "$120M" }'
const { screening } = await veridact('/screening/ma', { method: 'POST', body: JSON.stringify({ target_name: 'CloudSync Technologies Ltd', target_jurisdiction: 'United Kingdom', target_industry: 'SaaS / Cloud Infrastructure', deal_type: 'acquisition', deal_value: '$120M' }) }); // screening.ma_analysis has the AI due diligence report
res = session.post(
f"{BASE_URL}/screening/ma",
json={
"target_name": "CloudSync Technologies Ltd",
"target_jurisdiction": "United Kingdom",
"deal_type": "acquisition",
"deal_value": "$120M"
}
)
screening = res.json()["screening"]
Get Screening
Retrieve a screening result by ID including full sanctions, PEP, adverse media, and offshore leaks details.
curl https://veridact.solutions/api/v1/screening/2848 \
-H "Authorization: Bearer $VERIDACT_API_KEY"
const { screening } = await veridact('/screening/2848');
res = session.get(f"{BASE_URL}/screening/2848") screening = res.json()["screening"]
Download PDF Report
Download a full 13-section PDF compliance report for a completed screening.
curl -L https://veridact.solutions/api/v1/screening/2848/report \
-H "Authorization: Bearer $VERIDACT_API_KEY" \
-o report.pdf
const res = await fetch( 'https://veridact.solutions/api/v1/screening/2848/report', { headers: { 'Authorization': `Bearer ${process.env.VERIDACT_API_KEY}` }, redirect: 'follow' } ); const pdfBuffer = await res.arrayBuffer(); fs.writeFileSync('report.pdf', Buffer.from(pdfBuffer));
res = session.get(
f"{BASE_URL}/screening/2848/report",
allow_redirects=True
)
with open("report.pdf", "wb") as f:
f.write(res.content)
List Screenings
Retrieve a paginated list of all screenings. Filter by risk level, screening type, or search by entity name.
| Parameter | Type | Description |
|---|---|---|
| page | integer | Page number (default: 1) |
| limit | integer | Results per page (default: 20, max: 100) |
| risk_level | string | Filter: low, medium, high, critical |
| screening_type | string | Filter: edd, ma (default: all) |
| search | string | Search by entity name (partial match) |
curl "https://veridact.solutions/api/v1/screenings?risk_level=high&limit=10" \
-H "Authorization: Bearer $VERIDACT_API_KEY"
const { screenings, pagination } = await veridact( '/screenings?risk_level=high&limit=10' ); console.log(`${pagination.total} high-risk screenings`);
res = session.get(
f"{BASE_URL}/screenings",
params={"risk_level": "high", "limit": 10}
)
data = res.json()
screenings = data["screenings"]
pagination = data["pagination"]
{
"success": true,
"screenings": [ /* array of screening objects */ ],
"pagination": {
"page": 1,
"limit": 10,
"total": 47,
"pages": 5
}
}
Run Person Background Check NEW
FCRA-compliant person background checks across 20+ sources: criminal courts (federal + 10 states), sex offender registries (NSOPW), professional licenses (NPI, FINRA BrokerCheck, 10 profession boards), civil/bankruptcy records, adverse media, social/web presence, and ICIJ offshore leaks. Returns severity-coded findings with corroboration status.
| Field | Type | Required | Description |
|---|---|---|---|
| full_name | string | Required | Full legal name of the subject |
| purpose | string | Required | FCRA permissible purpose: employment, business_due_diligence, volunteer_screening, licensing |
| fcra_consent | boolean | Required | Must be true — confirms you have obtained required consent |
| date_of_birth | string | Optional | ISO date: YYYY-MM-DD (improves accuracy) |
| locations | string[] | Optional | States/countries the subject has resided in (e.g. ["California", "New York"]) |
| associated_domain | string | Optional | Business domain associated with the subject (triggers WHOIS lookup) |
curl -X POST https://veridact.solutions/api/v1/person-checks \ -H "Authorization: Bearer $VERIDACT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "full_name": "James R. Wilson", "purpose": "employment", "fcra_consent": true, "date_of_birth": "1982-04-15", "locations": ["California", "Texas"] }'
const { person_check } = await veridact('/person-checks', { method: 'POST', body: JSON.stringify({ full_name: 'James R. Wilson', purpose: 'employment', fcra_consent: true, date_of_birth: '1982-04-15', locations: ['California', 'Texas'] }) }); console.log(`Check ID: ${person_check.id}, Result: ${person_check.result}`);
res = session.post(
f"{BASE_URL}/person-checks",
json={
"full_name": "James R. Wilson",
"purpose": "employment",
"fcra_consent": True,
"date_of_birth": "1982-04-15",
"locations": ["California", "Texas"]
}
)
person_check = res.json()["person_check"]
{
"success": true,
"person_check": {
"id": "VDC-A8F3C2B1-P",
"full_name": "James R. Wilson",
"purpose": "employment",
"result": "clean", // "clean" | "adverse_found" | "inconclusive"
"confidence": "high", // "high" | "medium" | "low"
"status": "completed",
"red_flag_count": 0,
"warning_count": 0,
"findings": [], // array of finding objects with severity, category, corroboration
"sources_checked": 22,
"created_at": "2026-04-29T14:05:00.000Z"
}
}
Get Person Check
Retrieve a person check result by its ID, including all findings with severity classification, source attribution, and corroboration status.
curl "https://veridact.solutions/api/v1/person-checks/VDC-A8F3C2B1-P" \
-H "Authorization: Bearer $VERIDACT_API_KEY"
const { person_check } = await veridact('/person-checks/VDC-A8F3C2B1-P');
res = session.get(f"{BASE_URL}/person-checks/VDC-A8F3C2B1-P") person_check = res.json()["person_check"] for finding in person_check.get("findings", []): print(f"[{finding['severity'].upper()}] {finding['category']}: {finding['description']}")
List Person Checks
Retrieve a paginated list of all person background checks for your account.
| Parameter | Type | Description |
|---|---|---|
| page | integer | Page number (default: 1) |
| limit | integer | Results per page (default: 20, max: 100) |
| result | string | Filter: clean, adverse_found, inconclusive |
curl "https://veridact.solutions/api/v1/person-checks?result=adverse_found&limit=20" \
-H "Authorization: Bearer $VERIDACT_API_KEY"
const { person_checks, pagination } = await veridact( '/person-checks?result=adverse_found&limit=20' );
res = session.get(
f"{BASE_URL}/person-checks",
params={"result": "adverse_found", "limit": 20}
)
person_checks = res.json()["person_checks"]
Webhooks
Receive real-time HTTP notifications when screenings and person checks complete. Configure a webhook URL when generating an API key at Portal → API & Integrations.
| Event | Trigger |
|---|---|
| cdd.completed | CDD screening finished |
| edd.completed | EDD screening finished |
| ma.completed | M&A screening finished |
| person_check.completed | Person background check finished |
{
"event": "cdd.completed",
"screening_id": 2848,
"screening": {
"id": 2848,
"search_query": "Roman Abramovich",
"risk_level": "high",
"risk_score": 52,
"status": "completed",
"created_at": "2026-04-29T14:01:00.000Z"
},
"timestamp": "2026-04-29T14:01:00.123Z",
"signature": "sha256=3c7b9e2a..." // HMAC-SHA256 signature
}
| Header | Value |
|---|---|
| X-Veridact-Event | Event type (e.g. cdd.completed) |
| X-Veridact-Signature | HMAC-SHA256 signature (format: sha256=hex_digest) |
| X-Veridact-Timestamp | Unix timestamp of delivery attempt |
2xx immediately and process asynchronously.
Webhook Signature Verification
Every webhook payload is signed using HMAC-SHA256. Always verify the signature before processing to prevent spoofed payloads. Your webhook secret is shown once when you configure the webhook URL.
400 Bad Request if verification fails.
const crypto = require('crypto'); // Express webhook handler app.post('/webhooks/veridact', express.raw({ type: 'application/json' }), (req, res) => { const signature = req.headers['x-veridact-signature']; const webhookSecret = process.env.VERIDACT_WEBHOOK_SECRET; // Compute expected signature const expected = 'sha256=' + crypto .createHmac('sha256', webhookSecret) .update(req.body) // raw buffer, not parsed JSON .digest('hex'); // Use timingSafeEqual to prevent timing attacks const sigBuffer = Buffer.from(signature || ''); const expBuffer = Buffer.from(expected); if (sigBuffer.length !== expBuffer.length || !crypto.timingSafeEqual(sigBuffer, expBuffer)) { return res.status(400).json({ error: 'Invalid signature' }); } const payload = JSON.parse(req.body); // Acknowledge immediately, process async res.sendStatus(200); processWebhookAsync(payload); });
import hmac, hashlib, os from flask import Flask, request, abort app = Flask(__name__) @app.route('/webhooks/veridact', methods=['POST']) def webhook(): signature = request.headers.get('X-Veridact-Signature', '') secret = os.environ['VERIDACT_WEBHOOK_SECRET'].encode() # Compute expected signature expected = 'sha256=' + hmac.new( secret, request.data, # raw bytes, not parsed JSON hashlib.sha256 ).hexdigest() # Use compare_digest to prevent timing attacks if not hmac.compare_digest(signature, expected): abort(400) payload = request.get_json() # Acknowledge immediately, process async process_webhook_async.delay(payload) return '', 200
# The algorithm in pseudocode: # # 1. Read the raw request body as bytes (before JSON parsing) # 2. Compute: expected = "sha256=" + HMAC_SHA256(secret, raw_body).hexdigest() # 3. Compare: signature == expected (use constant-time comparison) # 4. Reject with 400 if they don't match # # Key points: # - Use raw bytes, NOT the parsed/re-serialized JSON # - Always use constant-time comparison (prevents timing attacks) # - Respond 200 immediately, process payload asynchronously # - Optionally check X-Veridact-Timestamp is within ±5 min to prevent replay
X-Veridact-Timestamp header is within ±5 minutes of your server's current time. Reject events outside this window. Store processed event IDs to deduplicate retries.
OpenAPI Specification
The complete API is described as an OpenAPI 3.0 specification. Use it to auto-generate client SDKs in any language, import into Postman, or integrate with API gateways.
No authentication required to access the spec. Use with any OpenAPI toolchain:
# Import into Postman: # 1. Open Postman → Import # 2. Enter URL: https://veridact.solutions/api/v1/openapi.json # 3. Import as Postman Collection # 4. Set VERIDACT_API_KEY variable in your environment
# Generate a TypeScript SDK using openapi-generator: npx @openapitools/openapi-generator-cli generate \ -i https://veridact.solutions/api/v1/openapi.json \ -g typescript-fetch \ -o ./veridact-sdk # Python SDK: openapi-generator generate \ -i https://veridact.solutions/api/v1/openapi.json \ -g python \ -o ./veridact-python-sdk
curl https://veridact.solutions/api/v1/openapi.json \ -o veridact-openapi.json
Changelog
Version history and release notes for the Veridact API.
POST /api/v1/person-checks, GET /api/v1/person-checks/:id, GET /api/v1/person-checks endpointsinfo, warning, red_flag with cross-source corroborationperson_check.completed webhook event/api/v1/openapi.jsonoffshore_leaks_hits field to all screening responsesrisk_score calculation (+8 to +25 points based on investigation type)signature field and X-Veridact-Signature headerPOST /api/v1/screening/cdd, POST /api/v1/screening/edd, POST /api/v1/screening/maGET /api/v1/screening/:id/report