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
- Authentication
- Transaction Screening
- KYC Verification
- KYB Verification
- Direct Lookup
- Liveness Check
- How Screening Works
- Tenant Configuration
- Rules
- Cases
- Reports
- Watchlists
- Interdictions
- Dashboard
- Customers
- Behavioral Profiles
- Network
- Compliance
- AI Assist
- Engines
- Countries
- Webhooks
- 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 theratel_refresh_tokencookie 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.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.
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.
Example Request — Individual Transaction
Business Transactions (KYB)
For corporate senders, setmetadata.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
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)
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
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
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
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
- Liveness Detection: The provider analyzes a selfie image to detect presentation attacks (printed photos, screens, masks, deepfakes).
- Face Match (optional): If a document image is provided, the system compares the selfie face against the document photo.
- Status Update: On success, the application status advances to
LIVENESS_PASSED.
When to Use
Path Parameters
Request Body
Example Request
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
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 generalGET /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
Signature Verification
When awebhookSecret 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.