Skip to main content

Installation

npm install @verilock/node-sdk

Configuration

import Verilock from '@verilock/node-sdk';

const verilock = new Verilock({
  apiKey: 'qi_live_...',       // or set VERILOCK_API_KEY env var
  baseUrl: 'https://verilock.io/api/v1', // optional
  timeout: 30_000,             // optional, ms (default: 30000)
  maxRetries: 2,               // optional, retries on 429/5xx
});
Use a qi_test_ key during development. Test keys return simulated results and are free to use.

Quick Start

import Verilock from '@verilock/node-sdk';

const verilock = new Verilock({ apiKey: process.env.VERILOCK_API_KEY! });

// Create a KYC session
const session = await verilock.sessions.create({
  applicant_email: 'john@example.com',
  applicant_name: 'John Doe',
  redirect_url: 'https://example.com/callback',
});

// Redirect the user to complete verification
console.log(session.session_url);

// Later, retrieve the result
const result = await verilock.sessions.retrieve(session.id);
console.log(result.status); // 'approved' | 'rejected' | 'pending' | ...

KYC Sessions

Create a session

const session = await verilock.sessions.create({
  applicant_email: 'jane@example.com',
  applicant_name: 'Jane Smith',
  redirect_url: 'https://example.com/done',
});
// session.session_url -> hosted verification link

List sessions

const { data, pagination } = await verilock.sessions.list({
  status: 'approved',
  page: 1,
  per_page: 25,
});

Retrieve a session

const session = await verilock.sessions.retrieve('sess_abc123');

Upload a document

import { readFileSync } from 'fs';

await verilock.sessions.uploadDocument({
  session_id: 'sess_abc123',
  file: readFileSync('./id_front.jpg'),
  side: 'front',
  document_type: 'passport',
});

Upload a selfie

await verilock.sessions.uploadSelfie({
  session_id: 'sess_abc123',
  file: readFileSync('./selfie.jpg'),
});

Submit for evaluation

const result = await verilock.sessions.submit('sess_abc123');
console.log(result.status); // 'processing'
Call submit() only after all required documents and selfie have been uploaded. The session enters asynchronous processing and you will receive a webhook when it completes.

AML Screening

Screen a person

const result = await verilock.aml.screen({
  name: 'John Doe',
  date_of_birth: '1990-01-15',
  nationality: 'US',
});

if (result.status === 'match') {
  console.log(`Found ${result.matches_found} matches`);
}

Retrieve a screening

const screening = await verilock.aml.retrieve('aml_abc123');

Submit a decision

await verilock.aml.decide('aml_abc123', {
  decision: 'false_positive',
  reason: 'Name similarity only, different date of birth.',
});

Transaction Monitoring

Screen a transaction

const result = await verilock.transactions.screen({
  transaction_ref: 'TX-001',
  sender_name: 'Alice Corp',
  receiver_name: 'Bob Ltd',
  amount: 15000,
  currency: 'USD',
});

if (result.risk_level === 'high') {
  console.log(`${result.alerts_count} alerts triggered`);
}

Batch screening

const batch = await verilock.transactions.screenBatch({
  transactions: [
    { transaction_ref: 'TX-002', sender_name: 'Alice', receiver_name: 'Bob', amount: 500, currency: 'EUR' },
    { transaction_ref: 'TX-003', sender_name: 'Carol', receiver_name: 'Dave', amount: 12000, currency: 'USD' },
  ],
});

List, retrieve, and decide

const { data } = await verilock.transactions.list({ risk_level: 'high' });

const detail = await verilock.transactions.retrieve('txn_abc123');

await verilock.transactions.decide('txn_abc123', {
  decision: 'approve',
  reason: 'Verified sender identity manually.',
});

Premium Features

Premium features require a paid plan. Calls made without an active subscription return an InsufficientBalanceError.
// Biometric face authentication
const match = await verilock.biometric.verify({ session_id: 'sess_abc123', selfie: fileBuffer });

// Government database validation
const dbCheck = await verilock.database.validate({ document_number: 'AB123456', country: 'US' });

// 1:N face duplicate detection
const duplicates = await verilock.faceSearch.search({ selfie: fileBuffer });

// Crypto wallet compliance screening
const walletResult = await verilock.wallet.screen({ address: '0xabc...', chain: 'ethereum' });

// Reusable KYC credentials
const credential = await verilock.credentials.issue({ session_id: 'sess_abc123' });

// Age verification from selfie
const age = await verilock.ageVerify.verify({ selfie: fileBuffer, min_age: 18 });

Error Handling

All SDK errors extend VerilockError. Use specific classes for granular handling.
import Verilock, {
  VerilockError,
  AuthenticationError,
  InsufficientBalanceError,
  NotFoundError,
  ValidationError,
  RateLimitError,
} from '@verilock/node-sdk';

try {
  const session = await verilock.sessions.create({
    applicant_email: 'john@example.com',
    redirect_url: 'https://example.com/callback',
  });
} catch (err) {
  if (err instanceof InsufficientBalanceError) {
    console.error(`Balance: ${err.balance}, required: ${err.required}`);
  } else if (err instanceof ValidationError) {
    console.error('Field errors:', err.errors);
  } else if (err instanceof RateLimitError) {
    console.error(`Retry after ${err.retryAfter}s`);
  } else if (err instanceof AuthenticationError) {
    console.error('Invalid API key');
  } else if (err instanceof NotFoundError) {
    console.error('Resource not found');
  } else if (err instanceof VerilockError) {
    console.error(`API error [${err.code}]: ${err.message}`);
  }
}

TypeScript Types

The SDK exports all request and response types for full type safety.
import type {
  CreateSessionParams,
  CreateSessionResponse,
  Session,
  ScreenPersonParams,
  AmlScreeningResult,
  ScreenTransactionParams,
  TransactionScreeningResult,
  PaginatedResponse,
} from '@verilock/node-sdk';
All resource methods accept an optional RequestOptions parameter as the last argument for per-request overrides such as custom headers or abort signals.