VeriLink API Platform · v1 · Identity + AML

Identity & Compliance
Intelligence as Infrastructure

One authenticated API for biometric KYC, real-time AML sanctions screening, and business KYB intelligence — governed by xCrypt licensing and built for regulated industries.

99.9%
Uptime SLA
<1s
Response Time
12
Endpoints
4
Risk Tiers
// POST /v1/person/full — AML screening response { "success": true, "request_id": "aml_ba45c3c02952d2b5", "decision": "possible_match", "severity": "high", "summary": { "aml_hits": 3, "media_hits": 2, "top_score": 1.0 }, "tenant": { "tenant_id": "your_company" }, "meta": { "version": "v1", "generated_at": "2026-04-09T12:00:00Z" } }
Platform capabilities

Three Pillars of Verified Trust

From biometric liveness to OFAC sanctions — a single integration delivers the full compliance stack built for regulated industries.

Biometric Identity Verification

Face liveness detection, MRZ passport scanning, and CIF data transfer. Returns structured identity payloads with optional face encodings and GPS location.

KYC · AUTHENTICATE · CIF
AML Person Screening

Screen individuals against global sanctions (OFAC, UN, EU, UK), PEP databases, and adverse media. Structured decision output with severity scoring.

SANCTIONS · PEP · MEDIA
Business KYB & Risk

Corporate entity AML screening with registration number cross-reference. Combined full screening merges AML and adverse media risk intelligence for KYB workflows.

KYB · CORPORATE AML · MEDIA
How it works

Every Request: Authenticated, Governed & Traced

All API calls are validated against your xCrypt license before screening runs. Tenant isolation, rate limiting, and audit trails come built-in.

Client
Your App
ApiKey + LicKey
on every request
Gateway
xCrypt Auth
License validation
rate limiting
Core
VeriLink API
Identity + biometric
verification layer
AML
Person Screen
Sanctions + Media
KYB
Business Screen
Corporate risk
Output
Decision Model
clear · review
possible_match · high_risk
Identity API

app.verilink.online

Biometric identity verification, CIF data push and pull. All requests require Verilink ApiKey and LicKey headers, validated via xCrypt.

Authentication: Every request must include your ApiKey and LicKey. Credentials are validated against xCrypt — expired or invalid keys return HTTP 403 immediately.
POST Identity Verification
https://app.verilink.online/authenticate

Triggers a biometric verification request sent to the user's VeriLink mobile app. The payload is JSON-encoded then Base64-encoded before sending. Returns a success status once the request is dispatched.

Request Fields
FieldTypeRequiredDescription
CompanystringRequiredYour company name
TrgEmailstringRequiredTarget user email (must be VeriLinked)
UserFullNamestringRequiredFirstName_LastName (underscores)
UniqueIDstringRequiredYour unique identifier — no spaces
ApiKeystringRequiredYour VeriLink API key
LicKeystringRequiredYour VeriLink license key
ReturnUrlstringOptionalYour callback endpoint URL
ReturnIdentifierstringOptionalCompany token (from dashboard)
ImageUrlstringOptionalURL to user image for matching
Verify.FaceboolOptionalRequest face match
Verify.LivelinessboolOptionalRequest liveness check
NeededInfo.IdNumberboolOptionalReturn ID number in payload
NeededInfo.LocationboolOptionalReturn GPS location
Code Examples
$veriData = (object)[];
$veriData->Company         = "YourCompany";
$veriData->TrgEmail        = "user@example.com";
$veriData->UserFullName    = "John_Michael_Doe";
$veriData->UniqueID        = "ref-10042-kyc";
$veriData->ApiKey          = YOUR_API_KEY;
$veriData->LicKey          = YOUR_LICENSE_KEY;
$veriData->ReturnUrl       = "https://yourdomain.com/verilink-callback";
$veriData->ReturnIdentifier = YOUR_COMPANY_TOKEN;

$veriData->Verify = (object)["Face" => true, "Liveliness" => true];
$veriData->NeededInfo = (object)["IdNumber" => true, "Location" => false];

$encodedData = base64_encode(json_encode($veriData));

$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_URL            => "https://app.verilink.online/authenticate",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => ["data" => $encodedData],
]);
$response = curl_exec($curl);
curl_close($curl);
$result = json_decode($response, true);
const veriData = {
  Company:          "YourCompany",
  TrgEmail:         "user@example.com",
  UserFullName:     "John_Michael_Doe",
  UniqueID:         "ref-10042-kyc",
  ApiKey:           YOUR_API_KEY,
  LicKey:           YOUR_LICENSE_KEY,
  ReturnUrl:        "https://yourdomain.com/verilink-callback",
  Verify:           { Face: true, Liveliness: true },
  NeededInfo:       { IdNumber: true, Location: false }
};

const encoded = btoa(JSON.stringify(veriData));
const form = new FormData();
form.append("data", encoded);

const res  = await fetch("https://app.verilink.online/authenticate", {
  method: "POST",
  body:   form
});
const data = await res.json();
// { "success": true, "message": "Data received and sent to user." }
# 1. Build + encode the JSON payload (bash)
PAYLOAD=$(echo '{"Company":"YourCompany","TrgEmail":"user@example.com",
"UserFullName":"John_Michael_Doe","UniqueID":"ref-10042-kyc",
"ApiKey":"YOUR_API_KEY","LicKey":"YOUR_LIC_KEY",
"Verify":{"Face":true,"Liveliness":true},
"NeededInfo":{"IdNumber":true,"Location":false}}' | base64 -w 0)

# 2. POST encoded data
curl -X POST https://app.verilink.online/authenticate \
     -F "data=${PAYLOAD}"
Success Response
{ "success": true, "message": "Data received and sent to user." }
Error Response
{ "success": false, "message": "Unique ID already exists", "code": 10 }
POST CIF Data Transfer
https://app.verilink.online/cif/transfer

Push a Customer Information File (CIF) record to the VeriLink platform. Used to pre-populate identity data for downstream verification flows.

Requires same ApiKey and LicKey authentication headers in the request body.
Code Examples
$cifData = [
    "ApiKey"    => YOUR_API_KEY,
    "LicKey"    => YOUR_LICENSE_KEY,
    "FirstName" => "Jane",
    "LastName"  => "Doe",
    "Email"     => "jane@example.com",
    "IdNumber"  => "8501015800082",
    "UniqueID"  => "cif-jane-001"
];

$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_URL            => "https://app.verilink.online/cif/transfer",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => json_encode($cifData),
    CURLOPT_HTTPHEADER     => ["Content-Type: application/json"],
]);
$response = curl_exec($curl);
curl_close($curl);
const res = await fetch("https://app.verilink.online/cif/transfer", {
  method:  "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    ApiKey:    YOUR_API_KEY,
    LicKey:    YOUR_LICENSE_KEY,
    FirstName: "Jane",
    LastName:  "Doe",
    Email:     "jane@example.com",
    IdNumber:  "8501015800082",
    UniqueID:  "cif-jane-001"
  })
});
const data = await res.json();
curl -X POST https://app.verilink.online/cif/transfer \
     -H "Content-Type: application/json" \
     -d '{"ApiKey":"YOUR_KEY","LicKey":"YOUR_LIC",
          "FirstName":"Jane","LastName":"Doe",
          "Email":"jane@example.com",
          "IdNumber":"8501015800082","UniqueID":"cif-jane-001"}'
GET CIF Data Retrieval
https://app.verilink.online/cif/retrieve?UniqueID={id}&ApiKey={key}&LicKey={lic}

Retrieve a previously stored CIF record by its UniqueID. Returns the full structured identity payload that was generated during verification.

Code Examples
$params = http_build_query([
    "UniqueID" => "cif-jane-001",
    "ApiKey"   => YOUR_API_KEY,
    "LicKey"   => YOUR_LICENSE_KEY,
]);
$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_URL            => "https://app.verilink.online/cif/retrieve?" . $params,
    CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($curl);
curl_close($curl);
$cif = json_decode($response, true);
const params = new URLSearchParams({
  UniqueID: "cif-jane-001",
  ApiKey:   YOUR_API_KEY,
  LicKey:   YOUR_LICENSE_KEY
});
const res  = await fetch(`https://app.verilink.online/cif/retrieve?${params}`);
const data = await res.json();
curl "https://app.verilink.online/cif/retrieve\
?UniqueID=cif-jane-001&ApiKey=YOUR_KEY&LicKey=YOUR_LIC"
AML API — Person Screening

aml.verilink.online

Screen individuals against global sanctions databases, PEP registers, and adverse media sources. All AML endpoints return the same structured decision model.

AML Authentication: Pass ApiKey and LicKey as HTTP headers on all AML requests.
POST Person — AML Screening Only
https://aml.verilink.online/v1/person/aml

Screens an individual against AML watchlists only (sanctions + PEP). Excludes adverse media for faster, lower-cost screening.

Request Body
FieldTypeRequiredDescription
referencestringRequiredYour client reference
full_namestringRequiredFull legal name
dobstringOptionalDate of birth (YYYY-MM-DD)
countrystringOptionalISO 3166-1 alpha-2 country code
Code Examples
$payload = json_encode([
    "reference" => "client-00142",
    "full_name" => "Vladimir Petrov",
    "dob"       => "1971-03-15",
    "country"   => "RU"
]);
$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_URL            => "https://aml.verilink.online/v1/person/aml",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $payload,
    CURLOPT_HTTPHEADER     => [
        "Content-Type: application/json",
        "ApiKey: " . YOUR_API_KEY,
        "LicKey: " . YOUR_LICENSE_KEY,
    ],
]);
$response = curl_exec($curl);
curl_close($curl);
$result = json_decode($response, true);
const res = await fetch("https://aml.verilink.online/v1/person/aml", {
  method:  "POST",
  headers: {
    "Content-Type": "application/json",
    "ApiKey": YOUR_API_KEY,
    "LicKey": YOUR_LICENSE_KEY
  },
  body: JSON.stringify({
    reference: "client-00142",
    full_name: "Vladimir Petrov",
    dob:       "1971-03-15",
    country:   "RU"
  })
});
const data = await res.json();
curl -X POST https://aml.verilink.online/v1/person/aml \
     -H "Content-Type: application/json" \
     -H "ApiKey: YOUR_API_KEY" \
     -H "LicKey: YOUR_LICENSE_KEY" \
     -d '{"reference":"client-00142","full_name":"Vladimir Petrov",
          "dob":"1971-03-15","country":"RU"}'
POST Person — Adverse Media Only
https://aml.verilink.online/v1/person/media

Performs adverse media screening only for an individual. Useful when a subject has already cleared sanctions but you want ongoing media monitoring.

Request Body
{
  "reference": "media-00201",
  "full_name": "John Smith",
  "country":  "ZA"
}
POST Person — Full Screening (AML + Media) Recommended
https://aml.verilink.online/v1/person/full

Performs comprehensive person screening — combines AML sanctions/PEP screening with adverse media in a single request. Returns merged decision model.

Code Examples
$payload = json_encode([
    "reference" => "full-00301",
    "full_name" => "Jane Kimani",
    "dob"       => "1985-07-20",
    "country"   => "KE"
]);
$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_URL            => "https://aml.verilink.online/v1/person/full",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $payload,
    CURLOPT_HTTPHEADER     => [
        "Content-Type: application/json",
        "ApiKey: " . YOUR_API_KEY,
        "LicKey: " . YOUR_LICENSE_KEY,
    ],
]);
$response = curl_exec($curl);
curl_close($curl);
const res = await fetch("https://aml.verilink.online/v1/person/full", {
  method:  "POST",
  headers: {
    "Content-Type": "application/json",
    "ApiKey": YOUR_API_KEY,
    "LicKey": YOUR_LICENSE_KEY
  },
  body: JSON.stringify({
    reference: "full-00301",
    full_name: "Jane Kimani",
    dob:       "1985-07-20",
    country:   "KE"
  })
});
const data = await res.json();
curl -X POST https://aml.verilink.online/v1/person/full \
     -H "Content-Type: application/json" \
     -H "ApiKey: YOUR_API_KEY" \
     -H "LicKey: YOUR_LICENSE_KEY" \
     -d '{"reference":"full-00301","full_name":"Jane Kimani",
          "dob":"1985-07-20","country":"KE"}'
AML API — Business Screening

KYB — Corporate Risk Intelligence

Screen business entities against sanctions lists and adverse media. Supports registration number cross-referencing for enhanced confidence scoring.

POST Business — AML Screening Only
https://aml.verilink.online/v1/business/aml

Screens a business entity against AML sanctions lists. Registration number is optional but improves match precision.

Request Body
{
  "reference":           "biz-001",
  "company_name":        "Rosneft",
  "registration_number": "123456",
  "country":             "RU"
}
POST Business — Adverse Media Only
https://aml.verilink.online/v1/business/media

Performs adverse media screening only for a business or organisation. Returns media-sourced risk signals independent of sanctions data.

Request Body
{
  "reference":    "biz-002",
  "company_name": "Rosneft",
  "country":      "RU"
}
POST Business — Full Screening (AML + Media) Recommended
https://aml.verilink.online/v1/business/full

Performs full business screening — combines AML sanctions with adverse media. The recommended endpoint for KYB compliance workflows.

Code Examples
$payload = json_encode([
    "reference"           => "biz-003",
    "company_name"        => "Acme Holdings Ltd",
    "registration_number" => "2019/455821/07",
    "country"             => "ZA"
]);
$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_URL            => "https://aml.verilink.online/v1/business/full",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $payload,
    CURLOPT_HTTPHEADER     => [
        "Content-Type: application/json",
        "ApiKey: " . YOUR_API_KEY,
        "LicKey: " . YOUR_LICENSE_KEY,
    ],
]);
$response = curl_exec($curl);
curl_close($curl);
const res = await fetch("https://aml.verilink.online/v1/business/full", {
  method:  "POST",
  headers: {
    "Content-Type": "application/json",
    "ApiKey": YOUR_API_KEY,
    "LicKey": YOUR_LICENSE_KEY
  },
  body: JSON.stringify({
    reference:           "biz-003",
    company_name:        "Acme Holdings Ltd",
    registration_number: "2019/455821/07",
    country:             "ZA"
  })
});
const data = await res.json();
curl -X POST https://aml.verilink.online/v1/business/full \
     -H "Content-Type: application/json" \
     -H "ApiKey: YOUR_API_KEY" \
     -H "LicKey: YOUR_LICENSE_KEY" \
     -d '{"reference":"biz-003","company_name":"Acme Holdings Ltd",
          "registration_number":"2019/455821/07","country":"ZA"}'
AML Response Model All screening endpoints

Every AML endpoint returns the same structured decision model. Machine-readable and built for audit logging from day one.


{
  "success":       true,
  "request_id":    "aml_ba45c3c02952d2b5",
  "reference":     "client-00142",
  "request_type":  "person",          // person | business
  "screening_mode": "full",            // aml | media | full
  "tenant": {
    "tenant_id":   "your_company",
    "tenant_name": "Your Company Name"
  },
  "decision":       "possible_match",   // clear | review | possible_match | high_risk
  "severity":       "high",             // low | medium | high
  "summary": {
    "aml_hits":   3,
    "media_hits": 2,
    "top_score":  1.0
  },
  "meta": {
    "version":      "v1",
    "generated_at": "2026-04-09T12:00:00+00:00"
  }
}
Error Response Shape

{
  "success":    false,
  "request_id": "aml_40ceabb19a344e73",
  "error": {
    "code":    "FORBIDDEN",
    "message": "License verification failed",
    "details": { "xcrypt_status": "invalid" }
  },
  "meta": { "version": "v1" }
}
Error Codes Reference
Identity API Error Codes
CodeDescriptionResolution
10Unique ID already existsChoose a different UniqueID
14Invalid license or API keyCheck dashboard credentials
401Company not found or inactiveContact VeriLink support
403License expired or suspendedRenew via xCrypt dashboard
AML API HTTP Error Codes
HTTPCodeDescription
401UNAUTHORIZEDMissing authentication header
403FORBIDDENInvalid key, expired license, or endpoint not permitted
403TENANT_DISABLEDIdentity or linked license is inactive
422INVALID_PAYLOADMissing or invalid required fields
429RATE_LIMIT60 req/min exceeded — retry after header included
502AUTH_UPSTREAM_ERRORxCrypt verification failed or returned invalid response
500INTERNAL_ERRORUnexpected server error
Risk Intelligence

Four-Tier AML Decision Engine

Every AML screening request returns a machine-readable decision tier with severity scoring, hit counts, and confidence score — built for automated compliance workflows.

Clear
No Match Found
No sanctions, PEP records or adverse media returned. Subject passes screening with zero flag events.
Review
Low Confidence Hit
Partial name or indirect media match. Compliance officer review recommended before proceeding.
Possible Match
High Score Hit
Match confidence ≥0.80 against sanctions or PEP database. Manual identity confirmation required.
High Risk
Confirmed Flag
Confirmed match with score = 1.0 or multiple corroborating sources. Onboarding should be blocked pending legal review.

Ready to Integrate?

Access the VeriLink API through an xCrypt-governed license. Built for financial institutions, legal firms, and regulated platforms.