1. Environment
VERIFAI_BASE_URL=https://verifai.iqtbots.ai VERIFAI_API_KEY=vf_test_your_secret_here VERIFAI_COLLECTION_ID=your-collection-uuid
Works with Django, Flask, or FastAPI via requests. OpenAPI: https://verifai.iqtbots.ai/api/schema/
VERIFAI_BASE_URL=https://verifai.iqtbots.ai VERIFAI_API_KEY=vf_test_your_secret_here VERIFAI_COLLECTION_ID=your-collection-uuid
# verifai_client.py
import os
from typing import Any
import requests
BASE_URL = os.environ["VERIFAI_BASE_URL"].rstrip("/")
API_KEY = os.environ["VERIFAI_API_KEY"]
COLLECTION_ID = os.environ["VERIFAI_COLLECTION_ID"]
DEFAULT_THRESHOLD = 0.4
class VerifaiError(Exception):
def __init__(self, code: str, message: str):
self.code = code
self.message = message
super().__init__(message)
def _headers() -> dict[str, str]:
return {"Authorization": f"Bearer {API_KEY}"}
def _check(payload: dict[str, Any]) -> dict[str, Any]:
if not payload.get("success"):
err = payload.get("error") or {}
raise VerifaiError(err.get("code", "unknown"), err.get("message", "Verifai request failed"))
return payload["data"]
def enroll_person(*, external_id: str, image_path: str, display_name: str | None = None) -> dict[str, Any]:
data = {"external_id": external_id}
if display_name:
data["display_name"] = display_name
with open(image_path, "rb") as image:
response = requests.post(
f"{BASE_URL}/api/v1/collections/{COLLECTION_ID}/persons/",
headers=_headers(),
data=data,
files={"image": image},
timeout=60,
)
return _check(response.json())
def verify_person(*, external_id: str, image_path: str, threshold: float = DEFAULT_THRESHOLD) -> dict[str, Any]:
with open(image_path, "rb") as image:
response = requests.post(
f"{BASE_URL}/api/v1/verify/",
headers=_headers(),
data={
"collection_id": COLLECTION_ID,
"external_id": external_id,
"threshold": str(threshold),
},
files={"image": image},
timeout=60,
)
return _check(response.json())
# Django example
from verifai_client import VerifaiError, verify_person
def face_login(request):
photo = request.FILES["image"]
path = default_storage.save("tmp/" + photo.name, photo)
try:
data = verify_person(external_id=str(request.user.pk), image_path=path)
except VerifaiError as exc:
return JsonResponse({"error": exc.code}, status=422)
finally:
default_storage.delete(path)
if data.get("matched"):
return JsonResponse({"ok": True, "similarity": data["similarity"]})
return JsonResponse({"ok": False}, status=401)