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. Liveness Check
  6. How Screening Works
  7. Webhooks
  8. Error Handling

Authentication

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

Method 1: Bearer Token (Dashboard Sessions)

Used when calling the API from the dashboard or on behalf of a logged-in user.
Obtain a token by calling POST /api/v1/auth/login with email and password.

Method 2: API Key (Backend Integrations)

Used for server-to-server integrations from your core banking system.
Generate API keys from Dashboard → API Keys. API keys are tenant-scoped and carry the same permissions as the user who created them.
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 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 — 409 Conflict (Idempotent)
Idempotency: Sending the same externalId twice returns the cached verdict without re-screening. This makes retries safe.

List Transactions

GET /api/v1/transactions Retrieve a paginated list of all screened transactions in your tenant. 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

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.

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

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

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 with kycTrustMode.

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.

Webhooks

Verifow sends real-time notifications to your backend when a compliance officer resolves a case linked to one of your transactions.
Setup: Configure your Webhook URL and Webhook Secret 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

Every webhook includes an X-Signature header — 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.