1. Environment

VERIFAI_BASE_URL=https://verifai.iqtbots.ai
VERIFAI_API_KEY=vf_test_your_secret_here
VERIFAI_COLLECTION_ID=your-collection-uuid

2. Client module

// verifai.js
const BASE = process.env.VERIFAI_BASE_URL.replace(/\/$/, '');
const API_KEY = process.env.VERIFAI_API_KEY;
const COLLECTION_ID = process.env.VERIFAI_COLLECTION_ID;

async function verifaiRequest(path, formData) {
  const res = await fetch(`${BASE}${path}`, {
    method: 'POST',
    headers: { Authorization: `Bearer ${API_KEY}` },
    body: formData,
  });
  return res.json();
}

export async function enrollPerson({ externalId, buffer, filename, displayName }) {
  const form = new FormData();
  form.append('external_id', externalId);
  if (displayName) form.append('display_name', displayName);
  form.append('image', new Blob([buffer]), filename || 'face.jpg');
  return verifaiRequest(`/api/v1/collections/${COLLECTION_ID}/persons/`, form);
}

export async function verifyPerson({ externalId, buffer, filename, threshold = 0.4 }) {
  const form = new FormData();
  form.append('collection_id', COLLECTION_ID);
  form.append('external_id', externalId);
  form.append('threshold', String(threshold));
  form.append('image', new Blob([buffer]), filename || 'probe.jpg');
  return verifaiRequest('/api/v1/verify/', form);
}

3. Route handlers

// Express + multer for file upload
import multer from 'multer';
import { enrollPerson, verifyPerson } from './verifai.js';

const upload = multer({ storage: multer.memoryStorage() });

app.post('/api/face/enroll', upload.single('image'), async (req, res) => {
  const result = await enrollPerson({
    externalId: String(req.user.id),
    buffer: req.file.buffer,
    filename: req.file.originalname,
    displayName: req.user.name,
  });
  res.status(result.success ? 200 : 422).json(result);
});

app.post('/api/face/verify', upload.single('image'), async (req, res) => {
  const result = await verifyPerson({
    externalId: String(req.user.id),
    buffer: req.file.buffer,
    filename: req.file.originalname,
  });
  if (result.success && result.data?.matched) {
    return res.json({ ok: true, similarity: result.data.similarity });
  }
  res.status(401).json(result);
});