Skip to main content

Introduction

Verifow is an enterprise-grade Anti-Money Laundering (AML) and Combating the Financing of Terrorism (CFT) platform built for African financial institutions. Our API enables you to:
  • Screen transactions through a multi-layer compliance pipeline in under 200ms
  • Verify identities via BVN, NIN, and biometric liveness checks
  • Onboard businesses with CAC lookup, director verification, and beneficial owner screening
  • Monitor compliance via real-time dashboards and webhook notifications
This guide covers everything you need to integrate:
  1. Authentication
  2. Transaction Screening
  3. KYC Verification
  4. KYB Verification
  5. Direct Lookup
  6. Liveness Check
  7. How Screening Works
  8. Tenant Configuration
  9. Rules
  10. Cases
  11. Reports
  12. Watchlists
  13. Interdictions
  14. Dashboard
  15. Customers
  16. Behavioral Profiles
  17. Network
  18. Compliance
  19. AI Assist
  20. Engines
  21. Countries
  22. Webhooks
  23. Error Handling

Authentication

The API supports two authentication methods. All endpoints (except /health) require authentication.

Method 1: Dashboard Session (HttpOnly Cookies)

Used when calling the API from the dashboard on behalf of a logged-in user. POST /api/v1/auth/login validates the email and password and — on success — sets two HttpOnly cookies: Tokens are never returned in the response body and are not readable from JavaScript — the browser sends the cookies automatically. MFA challenge flow: if the tenant’s MFA policy requires it, login does not set the cookies immediately. Instead the response carries mfaRequired (or mfaSetupRequired) with a short-lived tempToken. Submit the TOTP code together with the tempToken to POST /api/v1/auth/mfa/verify — or enrol via POST /api/v1/auth/mfa/setup — to complete the login and receive the cookie pair. Session lifecycle:
  • POST /api/v1/auth/refresh — reads the ratel_refresh_token cookie and issues a fresh access/refresh cookie pair. Refresh tokens rotate: the old refresh token is invalidated on every refresh.
  • POST /api/v1/auth/logout — ends the session and clears the cookies.

Method 2: API Key (Backend Integrations)

Used for server-to-server integrations from your core banking system.
Create keys with POST /api/v1/auth/api-keys or from Dashboard → API Keys. The plaintext key is returned exactly once in the creation response — store it securely; only a hash is persisted. API keys are tenant-scoped and carry the same permissions as the user who created them. Revoke a key with DELETE /api/v1/auth/api-keys/:id.
Keep your credentials secret. Never expose tokens or API keys in client-side code (mobile apps, browser JavaScript). All API calls must originate from your backend servers.

Transaction Screening

Screen Transaction

POST /api/v1/transactions/screen Submit a single transaction for real-time AML/CFT screening. The response includes the final outcome, risk breakdown per engine, triggered rules, and recommended actions. Request Body
Currency conversion: All ₦-denominated CBN thresholds (CTR, tier limits, structuring sums) are evaluated against the NGN-equivalent amount, converted with your tenant’s configured FX rates (PATCH /api/v1/tenants/me/fx-rates). For non-NGN transactions the applied conversion is echoed in riskBreakdown[].fx. If no rate is configured for a currency, the raw amount is still evaluated, but the verdict carries the FX_RATE_MISSING action — a foreign currency is never silently treated as 1:1 NGN.
Behavioral Metadata The behavioral engine scores each account from the context you forward — send what your core banking already knows. Rich context means sharper detection and fewer false alarms.
Only forward real values — never placeholders. Missing fields simply degrade that signal; synthetic values actively poison the scoring.
Example Request — Individual Transaction

Business Transactions (KYB)

For corporate senders, set metadata.entityType to "BUSINESS" and provide the company’s CAC registration number in metadata.senderRcNumber. The platform runs the transaction through the KYB identity-risk engine in addition to KYC and sanctions screening. If your bank has already verified the business outside of Verifow, send senderKybStatus: "VERIFIED" to bypass the Verifow KYB lookup. You should still send the sender’s KYC fields (senderKycStatus, senderKycTier, senderKycVerifiedAt, senderKycExternalRef) when available, because authorized signatories and directors may still be evaluated under individual KYC rules. Example Request — Business Transaction
Business Screening Payload Fields
Regulatory transparency: When you assert senderKycStatus or senderKybStatus in the payload, you are attesting that your bank has independently verified the customer or business. Verifow will rely on these assertions instead of performing its own lookup when the tenant is configured for HYBRID or EXTERNAL mode.
If senderKybStatus is omitted for a business transaction, Verifow will attempt a local KYB lookup using metadata.senderRcNumber. If no KYB record exists, the transaction will be scored as high risk.

Example Response — 200 OK (REVIEW)
Example Response — 200 OK (BLOCK with Sanctions Hit)
Example Response — 400 Bad Request
Example Response — 409 Conflict (Duplicate externalId)
Idempotency: externalId is unique per tenant. Re-submitting the same externalId returns 409 Conflict — with the original verdict embedded in error.data — instead of re-screening. This makes retries after network failures safe: send the identical payload again and either you get the fresh verdict (200) or the duplicate guard tells you it was already processed (409).

List Transactions

GET /api/v1/transactions Retrieve a paginated, tenant-scoped history of all screened transactions. Query Parameters Example Response — 200 OK

Get Transaction Detail

GET /api/v1/transactions/:id Retrieve the full screening result for a single transaction, including the complete verdict with engine breakdowns. Path Parameters Example Response — 200 OK
Transaction data is immutable once screened. If you need to re-evaluate, submit a new transaction with a different externalId.

KYC Verification

KYC (Know Your Customer) verification validates individual customer identities through BVN, NIN, and biometric liveness checks against national identity providers.

KYC Application Statuses


Submit KYC Application

POST /api/v1/kyc/applications Create a new KYC application for an individual customer. Request Body Example Request
Example Response — 201 Created

List KYC Applications

GET /api/v1/kyc/applications Query Parameters

Get KYC Application

GET /api/v1/kyc/applications/:id Retrieve a KYC application with full verification results and uploaded documents. Example Response — 200 OK

Update KYC Application

PATCH /api/v1/kyc/applications/:id Update applicant details on an existing KYC application. All fields are optional — send only what changes. Request Body

Verify BVN

POST /api/v1/kyc/applications/:id/verify-bvn Verify the applicant’s BVN against the configured identity provider (embedded or BYOL). Path Parameters Request Body Example Request
Example Response — 200 OK

Verify NIN

POST /api/v1/kyc/applications/:id/verify-nin Verify the applicant’s NIN against the configured identity provider. Request Body Example Response — 200 OK

Liveness Check

POST /api/v1/kyc/applications/:id/liveness-check Run a biometric liveness detection and face-match check. This verifies that the applicant is a real person (not a photo or video spoof) and optionally matches their selfie against an uploaded ID document.

How It Works

  1. Liveness Detection: The provider analyzes a selfie image to detect presentation attacks (printed photos, screens, masks, deepfakes).
  2. Face Match (optional): If a document image is provided, the system compares the selfie face against the document photo.
  3. Status Update: On success, the application status advances to LIVENESS_PASSED.

When to Use

Path Parameters Request Body Example Request
Example Response — 200 OK (Pass)
Example Response — 200 OK (Fail — Spoof Detected)
A failed liveness check does not automatically reject the application. The status remains PENDING (or its previous state) so a compliance officer can review and decide whether to request a retry or reject.

Combined Biometric Verification

POST /api/v1/kyc/applications/:id/biometric-verify Runs liveness first (local, free) and only then the BVN registry-photo face match (paid provider call) using the same selfie — a failed anti-spoof check never burns a paid call. One selfie, one API call, billed as a single liveness check. The request body is the same as the liveness check above. Returns a single decision — PASSED, FAILED_LIVENESS, or FAILED_MATCH — plus a structured reasonCode for client retry guidance: NO_FACE, MULTIPLE_FACES, CHALLENGE_FAILED, SPOOF_SUSPECTED, LIVENESS_FAILED, NO_MATCH, LIVENESS_ONLY.

Face Match (BVN Registry)

POST /api/v1/kyc/applications/:id/face-match Matches a live selfie against the applicant’s BVN registry photo via the identity provider chain. The comparison happens provider-side — the registry photo is never stored. Requires a verified BVN on the application. Billed per call like a liveness check; the result is persisted as a FACE_MATCH entry in the application’s evidence trail. Request Body

Tier Requirements & Upgrade


Risk History


KYC Provider Configuration

Manage the identity-provider chain used for BVN/NIN verification and biometric checks. PATCH /kyc/providers/config Request Body

Approve KYC Application

PATCH /api/v1/kyc/applications/:id/approve Final approval of a KYC application. Requires BANK_ADMIN or COMPLIANCE_OFFICER role. Example Response — 200 OK
Approving a KYC application updates the customer’s risk profile. Future transactions from this customer will reflect the APPROVED status (score 0, no KYC-related risk).

Reject KYC Application

PATCH /api/v1/kyc/applications/:id/reject Reject a KYC application that fails verification. Requires BANK_ADMIN or COMPLIANCE_OFFICER role. Request Body Example Response — 200 OK

KYB Verification

KYB (Know Your Business) verifies corporate entities before they transact. It integrates with the Corporate Affairs Commission (CAC) to validate company registration, verify directors through KYC identity checks, and screen beneficial owners against global sanctions lists.

KYB Application Statuses

KYB Screening Trigger

KYB checks run automatically during transaction screening when the transaction metadata indicates a business entity:

Submit KYB Application

POST /api/v1/kyc/kyb/applications Create a new KYB application for a corporate entity. Request Body Example Request
Example Response — 201 Created

Update KYB Application

PATCH /api/v1/kyc/kyb/applications/:id Update an existing KYB application. All fields are optional — send only what changes: companyName, rcNumber, tin, address, incorporationDate, businessActivity, operatingCountry, directors, beneficialOwners, notes.

Run KYB Screening

POST /api/v1/kyc/kyb/applications/:id/run-screening Runs the KYB screening pipeline for the application — CAC verification, director identity checks, and beneficial-owner sanctions screening.

Verify CAC

POST /api/v1/kyc/kyb/applications/:id/verify-cac Run a CAC lookup by RC number to fetch company details, directors, and beneficial owners. Request Body Example Response — 200 OK

Verify Directors

POST /api/v1/kyc/kyb/applications/:id/verify-directors Verify each director’s identity via BVN/NIN against identity providers. Request Body Example Response — 200 OK

Screen Beneficial Owners

POST /api/v1/kyc/kyb/applications/:id/screen-beneficial-owners Screen beneficial owners against global sanctions and PEP watchlists. Request Body Example Response — 200 OK

Approve KYB Application

PATCH /api/v1/kyc/kyb/applications/:id/approve Requires BANK_ADMIN or COMPLIANCE_OFFICER role. Example Response — 200 OK

Reject KYB Application

PATCH /api/v1/kyc/kyb/applications/:id/reject Requires BANK_ADMIN or COMPLIANCE_OFFICER role. Request Body Example Response — 200 OK

Direct Lookup

Verify identities and companies on demand — outside of a KYC/KYB application flow. Each lookup is charged per call from the tenant wallet at the configured verification price; a response (match or no-match) is charged, provider outages are not. Results are saved as reusable customer profiles.

BVN Lookup

POST /api/v1/lookup/bvn Verify an 11-digit BVN against the identity provider chain and save the result as a customer profile. Request Body

NIN Lookup

POST /api/v1/lookup/nin Verify an 11-digit NIN against the identity provider chain and save the result as a customer profile. Same request body and wallet-prepaid charging rules as the BVN lookup.

CAC Lookup

POST /api/v1/lookup/cac Look up a company by RC number in the CAC registry and save the result as a business customer profile (directors, shareholders, and beneficial owners included). Wallet-prepaid per lookup. Request Body

Lookup History & Saved Profiles

Create Application from a Lookup Profile

Request Body (both endpoints)

How Screening Works

Every transaction passes through multiple screening layers in sequence. The entire pipeline completes in 80–200ms (p95).

The Pipeline

Mandatory Regulatory Rules

These 9 rules are always active and cannot be disabled:

Identity Risk Scoring

Individual (KYC)

Business (KYB)

KYC Trust Modes

Tenants can configure how KYC status is resolved during transaction screening: Set the mode via PATCH /api/v1/tenants/me/kyc-config with the kycTrustMode field.

Score Aggregation

Score Floor Guarantee: Final Score = MAX(weighted_average, max_engine_score × 0.8) The highest-severity outcome from any engine becomes the final decision.

Tenant Configuration

Tenants manage their own configuration through dedicated self-service endpoints — there is no general GET /api/v1/tenants/me or PATCH /api/v1/tenants/me route.

Rules

Tenant custom rules complement the mandatory CBN regulatory rules.

Cases

Investigation cases are created automatically from screening verdicts (CREATE_CASE action / BLOCK outcomes) or manually.

Resolution Workflow

Resolutions follow a propose → approve/reject workflow:

Reports

Regulatory and management reporting.

Downloads

NFIU goAML Filing


Watchlists

Tenant-managed local watchlists, screened alongside the global sanctions lists.

Interdictions

Interdiction actions (e.g. account freezes or blocks) are queued from cases and executed against your systems.

Dashboard


Customers


Behavioral Profiles


Network


Compliance


AI Assist


Engines


Countries


Webhooks

Verifow sends real-time notifications to your backend for screening outcomes and case events.
Setup: Configure your webhookUrl and webhookSecret via PATCH /api/v1/tenants/me/webhooks, or in the Developer Webhooks section of the API Keys page in your Dashboard.

Events

Payload

Delivery Guarantees

Your endpoint must return a 2xx status code. Any non-2xx response will trigger automatic retries. If all 5 attempts fail, the event is retained in the dead-letter queue for 7 days.

Signature Verification

When a webhookSecret is set, every webhook includes an X-Ratel-Signature: sha256=<hex> header (also mirrored as X-Signature) — an HMAC-SHA256 hash of the raw JSON body, signed with your Webhook Secret.

Error Handling

Standard HTTP status codes indicate success or failure:
Fail-Open Policy: If the Sanctions or Behavioral engines experience upstream downtime, Verifow implements a fail-open policy — your legitimate transactions continue processing without interruption, while partial screenings are logged for retroactive review.

Verifow — Enterprise-grade AML/CFT compliance for African financial institutions. For support, contact adams@bevars.com.