Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.verifow.com/llms.txt

Use this file to discover all available pages before exploring further.

Overview

The Transactions module is the entry point for all AML/CFT screening. Every financial transaction your institution processes should be submitted to the /screen endpoint. The platform returns a verdict in under 200ms with a risk score, outcome, and triggered rules.

Common Workflows

Real-time screening: Your core banking system calls /screen on every outgoing transfer → The API returns an outcome → Your system routes the transaction based on APPROVE, REVIEW, ESCALATE, or BLOCK. Post-hoc review: A compliance officer queries the transaction list to review recent screenings, drill into a specific transaction, and view the full verdict breakdown.

Permissions

ActionWho Can Do It
Screen transactionAll authenticated users
List transactionsAll authenticated users
Get transaction detailAll authenticated users

Endpoints

MethodEndpointDescription
POST/api/v1/transactions/screenSubmit a transaction for screening
GET/api/v1/transactionsList screened transactions
GET/api/v1/transactions/:idRetrieve a specific transaction

Screen Transaction

Submit a single transaction for real-time screening. The response includes the final outcome, risk breakdown per engine, triggered rules, and recommended actions. Request Body
FieldTypeRequiredDescription
externalIdstringYour unique transaction reference
typestringTRANSFER, CASH_DEPOSIT, CASH_WITHDRAWAL, INTERNATIONAL_TRANSFER, BILL_PAYMENT
channelstringMOBILE_APP, INTERNET_BANKING, USSD, ATM, POS, BRANCH
amountnumberAmount in base currency unit (e.g. 5000000 = ₦5M)
currencystringISO 4217 code. Defaults to NGN
senderAccountNumberstringSender’s bank account number (NUBAN, 10 digits)
senderBvnstringSender’s BVN. Enables identity risk scoring
senderNamestringSender’s full name. Screened against sanctions
receiverAccountNumberstringReceiver’s account number
receiverNamestringReceiver’s full name. Also screened
receiverBankCodestringReceiver’s bank CBN code (e.g. "058")
receiverCountrystringISO 3166-1 alpha-2. Triggers FTR if ≠ NG
narrationstringTransaction description
deviceIdstringDevice fingerprint for behavioral analysis
ipAddressstringClient IP for geo-anomaly detection
timestampstringISO 8601 timestamp
Example Request
curl -X POST /v1/transactions/screen \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "TXN-2026-001",
    "type": "TRANSFER",
    "channel": "MOBILE_APP",
    "amount": 5000000,
    "currency": "NGN",
    "senderAccountNumber": "0123456789",
    "senderBvn": "22012345678",
    "senderName": "John Doe",
    "receiverAccountNumber": "9876543210",
    "receiverName": "Jane Smith",
    "receiverCountry": "NG",
    "narration": "Payment for goods",
    "timestamp": "2026-05-16T12:00:00Z"
  }'
Example Response — 200 OK
{
  "success": true,
  "data": {
    "transactionId": "fae50ecb-d997-4700-bae7-49650678bb06",
    "externalId": "TXN-0791-389803",
    "outcome": "REVIEW",
    "riskLevel": "MEDIUM",
    "aggregateScore": 32,
    "actions": ["NOTIFY_OFFICER"],
    "riskBreakdown": [
      {
        "category": "Regulatory Compliance",
        "score": 0,
        "outcome": "APPROVE",
        "rulesTriggered": 0,
        "latencyMs": 3
      },
      {
        "category": "Sanctions & PEP Screening",
        "score": 0,
        "outcome": "APPROVE",
        "rulesTriggered": 0,
        "latencyMs": 3020
      },
      {
        "category": "KYC Verification",
        "score": 40,
        "outcome": "REVIEW",
        "rulesTriggered": 1,
        "latencyMs": 0
      },
      {
        "category": "Custom Rules",
        "score": 0,
        "outcome": "APPROVE",
        "rulesTriggered": 0,
        "latencyMs": 10074
      },
      {
        "category": "Decision Engine",
        "score": 0,
        "outcome": "APPROVE",
        "rulesTriggered": 0,
        "latencyMs": 48
      },
      {
        "category": "Behavioral Analysis",
        "score": 0,
        "outcome": "APPROVE",
        "rulesTriggered": 1,
        "latencyMs": 206
      }
    ],
    "triggeredRules": [
      {
        "name": "No KYC Application Found",
        "category": "KYC Verification",
        "riskScore": 40,
        "details": "No KYC record found for sender (BVN: 22075678966)",
        "createdBy": null
      }
    ],
    "totalLatencyMs": 13447
  }
}
Example Response — 400 Bad Request
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Validation failed",
    "details": [
      { "field": "amount", "message": "amount must be a positive number" }
    ]
  }
}
Example Response — 409 Conflict
{
  "success": false,
  "error": {
    "code": "DUPLICATE_EXTERNAL_ID",
    "message": "This externalId has already been processed",
    "data": {
      "transactionId": "fae50ecb-d997-4700-bae7-49650678bb06",
      "outcome": "REVIEW",
      "riskLevel": "MEDIUM",
      "aggregateScore": 32
    }
  }
}
Idempotency: Sending the same externalId twice returns the cached verdict without re-screening. This makes retries safe.

List Transactions

Retrieve a paginated list of all screened transactions in your tenant. Query Parameters
ParameterTypeDefaultDescription
pageinteger1Page number
limitinteger20Items per page (max 100)
outcomestringFilter by APPROVE, REVIEW, ESCALATE, BLOCK
typestringFilter by transaction type
fromstringISO 8601 start date
tostringISO 8601 end date
Example Request
curl -X GET "/v1/transactions?outcome=BLOCK&page=1&limit=10" \
  -H "Authorization: Bearer <access_token>"
Example Response — 200 OK
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "fae50ecb-d997-4700-bae7-49650678bb06",
        "externalId": "TXN-0791-389803",
        "type": "TRANSFER",
        "channel": "MOBILE_APP",
        "amount": "5000000",
        "currency": "NGN",
        "senderAccountNumber": "0123456789",
        "senderName": "John Doe",
        "receiverName": "Jane Smith",
        "receiverCountry": "NG",
        "transactionTimestamp": "2026-05-16T12:00:00Z",
        "verdict": {
          "outcome": "BLOCK",
          "riskLevel": "CRITICAL",
          "aggregateScore": 95,
          "totalLatencyMs": 145
        },
        "createdAt": "2026-05-16T12:00:00Z"
      }
    ],
    "total": 3,
    "page": 1,
    "limit": 10,
    "totalPages": 1
  }
}

Get Transaction Detail

Retrieve the full screening result for a single transaction, including the complete verdict with engine breakdowns. Path Parameters
ParameterTypeDescription
idstringTransaction UUID
Example Request
curl -X GET /v1/transactions/fae50ecb-d997-4700-bae7-49650678bb06 \
  -H "Authorization: Bearer <access_token>"
Example Response — 200 OK
{
  "success": true,
  "data": {
    "id": "fae50ecb-d997-4700-bae7-49650678bb06",
    "tenantId": "660e8400-e29b-41d4-a716-446655440001",
    "externalId": "TXN-0791-389803",
    "type": "TRANSFER",
    "channel": "MOBILE_APP",
    "amount": "5000000",
    "currency": "NGN",
    "senderAccountNumber": "0123456789",
    "senderBvn": "22012345678",
    "senderName": "John Doe",
    "senderBankCode": null,
    "receiverAccountNumber": "9876543210",
    "receiverBvn": null,
    "receiverName": "Jane Smith",
    "receiverBankCode": null,
    "receiverCountry": "NG",
    "narration": "Payment for goods",
    "deviceId": null,
    "ipAddress": null,
    "latitude": null,
    "longitude": null,
    "transactionTimestamp": "2026-05-16T12:00:00Z",
    "metadata": null,
    "createdAt": "2026-05-16T12:00:00Z",
    "verdict": {
      "id": "vtx_001",
      "transactionId": "fae50ecb-d997-4700-bae7-49650678bb06",
      "outcome": "REVIEW",
      "riskLevel": "MEDIUM",
      "aggregateScore": 32,
      "engineVerdicts": [
        {
          "category": "KYC Verification",
          "score": 40,
          "outcome": "REVIEW",
          "rulesTriggered": 1,
          "latencyMs": 0
        }
      ],
      "actions": ["NOTIFY_OFFICER"],
      "totalLatencyMs": 13447,
      "processedAt": "2026-05-16T12:00:01Z"
    }
  }
}
Transaction data is immutable once screened. If you need to re-evaluate, submit a new transaction with a different externalId.