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

Cases are the core workflow unit for compliance teams. A case is automatically created whenever a transaction receives a REVIEW, ESCALATE, or BLOCK outcome. Cases can also be created manually by compliance officers for ad-hoc investigations.

Common Workflows

Automatic case creation: A transaction triggers a sanctions hit → The system creates a SANCTIONS_HIT case → Compliance officers are notified via email and dashboard → An officer claims the case, investigates, and resolves it. Manual investigation: An analyst notices a pattern → Creates a REGULATORY_INQUIRY case → Attaches related transactions → Adds investigation notes → Escalates to a senior officer.

Permissions

ActionWho Can Do It
Create caseBANK_ADMIN, COMPLIANCE_OFFICER, ANALYST
List, view casesAll authenticated users
Update status, assignBANK_ADMIN, COMPLIANCE_OFFICER
Add notesAll authenticated users

Case Lifecycle

OPEN → IN_PROGRESS → PENDING_REVIEW → ESCALATED → RESOLVED_TRUE_POSITIVE / RESOLVED_FALSE_POSITIVE → CLOSED

Endpoints

MethodEndpointDescription
POST/api/v1/casesCreate a new case
GET/api/v1/casesList cases with filters
GET/api/v1/cases/:idRetrieve case details
PATCH/api/v1/cases/:id/statusUpdate case status
PATCH/api/v1/cases/:id/assignAssign case to a user
POST/api/v1/cases/:id/notesAdd a note to a case

Create Case

Manually create a compliance case. Auto-created cases use the same structure. Request Body
FieldTypeRequiredDescription
typestringCase type (see table below)
prioritystringLOW, MEDIUM, HIGH, CRITICAL
titlestringShort summary
descriptionstringDetailed explanation
relatedTransactionIdstringUUID of triggering transaction
relatedKycApplicationIdstringUUID of related KYC application
tagsstring[]Labels for categorization
Case Types
TypeWhen It’s Created
SUSPICIOUS_TRANSACTIONTransaction BLOCKED by screening
AML_ALERTTransaction ESCALATED
SANCTIONS_HITSanctions list match detected
PEP_MATCHPolitically Exposed Person matched
FRAUD_ALERTBehavioral anomaly detected
KYC_REVIEWKYC verification issue
REGULATORY_INQUIRYManual regulatory investigation
BEHAVIORAL_ANOMALYDevice/velocity anomaly flagged
Example Request
curl -X POST /v1/cases \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "SUSPICIOUS_TRANSACTION",
    "priority": "HIGH",
    "title": "Large cash deposit — possible structuring",
    "description": "Customer made 4 deposits totaling ₦4.8M in 3 hours",
    "relatedTransactionId": "fae50ecb-d997-4700-bae7-49650678bb06",
    "tags": ["structuring", "cash"]
  }'
Example Response — 201 Created
{
  "success": true,
  "data": {
    "id": "case_12345abcde",
    "caseNumber": "CASE-2026-00001",
    "type": "SUSPICIOUS_TRANSACTION",
    "priority": "HIGH",
    "title": "Large cash deposit — possible structuring",
    "description": "Customer made 4 deposits totaling ₦4.8M in 3 hours",
    "status": "OPEN",
    "assignedTo": null,
    "relatedTransactionId": "fae50ecb-d997-4700-bae7-49650678bb06",
    "relatedKycApplicationId": null,
    "tags": ["structuring", "cash"],
    "resolvedAt": null,
    "createdAt": "2026-05-16T14:30:00Z",
    "updatedAt": "2026-05-16T14:30:00Z"
  }
}

List Cases

Retrieve cases with powerful filtering options. Query Parameters
ParameterTypeDefaultDescription
statusstringOPEN, IN_PROGRESS, PENDING_REVIEW, ESCALATED, RESOLVED_TRUE_POSITIVE, RESOLVED_FALSE_POSITIVE, CLOSED
typestringFilter by case type
prioritystringLOW, MEDIUM, HIGH, CRITICAL
assigneeIdstringFilter by assigned user
pageinteger1Page number
limitinteger20Items per page
Example Request
curl -X GET "/v1/cases?status=OPEN&priority=CRITICAL&page=1&limit=20" \
  -H "Authorization: Bearer <access_token>"
Example Response — 200 OK
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "case_12345abcde",
        "caseNumber": "CASE-2026-00001",
        "type": "SUSPICIOUS_TRANSACTION",
        "priority": "HIGH",
        "title": "Large cash deposit — possible structuring",
        "status": "OPEN",
        "assignedTo": null,
        "tags": ["structuring", "cash"],
        "resolvedAt": null,
        "createdAt": "2026-05-16T14:30:00Z",
        "updatedAt": "2026-05-16T14:30:00Z",
        "assignee": null
      }
    ],
    "total": 15,
    "page": 1,
    "limit": 20,
    "totalPages": 1
  }
}

Get Case Detail

Retrieve a case including its full timeline history and related transaction. Path Parameters
ParameterTypeDescription
idstringCase UUID
Example Request
curl -X GET /v1/cases/case_12345abcde \
  -H "Authorization: Bearer <access_token>"
Example Response — 200 OK
{
  "success": true,
  "data": {
    "id": "case_12345abcde",
    "caseNumber": "CASE-2026-00001",
    "type": "SUSPICIOUS_TRANSACTION",
    "priority": "HIGH",
    "title": "Large cash deposit — possible structuring",
    "description": "Customer made 4 deposits totaling ₦4.8M in 3 hours",
    "status": "OPEN",
    "assignedTo": null,
    "relatedTransactionId": "fae50ecb-d997-4700-bae7-49650678bb06",
    "relatedKycApplicationId": null,
    "tags": ["structuring", "cash"],
    "resolvedAt": null,
    "createdAt": "2026-05-16T14:30:00Z",
    "updatedAt": "2026-05-16T14:30:00Z",
    "assignee": null,
    "relatedTransaction": {
      "id": "fae50ecb-d997-4700-bae7-49650678bb06",
      "externalId": "TXN-0791-389803",
      "amount": "5000000",
      "currency": "NGN",
      "senderName": "John Doe",
      "verdict": {
        "outcome": "REVIEW",
        "riskLevel": "MEDIUM",
        "aggregateScore": 32,
        "totalLatencyMs": 13447
      }
    },
    "timeline": [
      {
        "id": "evt_001",
        "caseId": "case_12345abcde",
        "eventType": "CASE_CREATED",
        "actorId": "550e8400-e29b-41d4-a716-446655440000",
        "description": "Case created manually",
        "previousValue": null,
        "newValue": null,
        "metadata": null,
        "createdAt": "2026-05-16T14:30:00Z",
        "actor": {
          "id": "550e8400-e29b-41d4-a716-446655440000",
          "email": "officer@bank.com",
          "firstName": "Jane",
          "lastName": "Smith"
        }
      }
    ]
  }
}

Update Case Status

Move a case through its lifecycle. Include a resolution note when closing. Path Parameters
ParameterTypeDescription
idstringCase UUID
Request Body
FieldTypeRequiredDescription
statusstringNew status
resolutionNotestringRequired when resolving or closing
Example Request
curl -X PATCH /v1/cases/case_12345abcde/status \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "IN_PROGRESS"
  }'
Example Response — 200 OK
{
  "success": true,
  "data": {
    "id": "case_12345abcde",
    "caseNumber": "CASE-2026-00001",
    "type": "SUSPICIOUS_TRANSACTION",
    "priority": "HIGH",
    "title": "Large cash deposit — possible structuring",
    "status": "IN_PROGRESS",
    "assignedTo": null,
    "relatedTransactionId": "fae50ecb-d997-4700-bae7-49650678bb06",
    "relatedKycApplicationId": null,
    "tags": ["structuring", "cash"],
    "resolvedAt": null,
    "createdAt": "2026-05-16T14:30:00Z",
    "updatedAt": "2026-05-16T16:00:00Z"
  }
}
Status transitions are validated. You cannot jump from OPEN directly to CLOSED without passing through the required intermediate states.

Assign Case

Assign a case to a specific compliance officer. Path Parameters
ParameterTypeDescription
idstringCase UUID
Request Body
FieldTypeRequiredDescription
assigneeIdstringUser UUID to assign
Example Request
curl -X PATCH /v1/cases/case_12345abcde/assign \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "assigneeId": "550e8400-e29b-41d4-a716-446655440000"
  }'
Example Response — 200 OK
{
  "success": true,
  "data": {
    "id": "case_12345abcde",
    "caseNumber": "CASE-2026-00001",
    "type": "SUSPICIOUS_TRANSACTION",
    "priority": "HIGH",
    "title": "Large cash deposit — possible structuring",
    "status": "OPEN",
    "assignedTo": "550e8400-e29b-41d4-a716-446655440000",
    "relatedTransactionId": "fae50ecb-d997-4700-bae7-49650678bb06",
    "relatedKycApplicationId": null,
    "tags": ["structuring", "cash"],
    "resolvedAt": null,
    "createdAt": "2026-05-16T14:30:00Z",
    "updatedAt": "2026-05-16T16:15:00Z"
  }
}

Add Note

Append an investigation note to a case. This creates a timeline event. Path Parameters
ParameterTypeDescription
idstringCase UUID
Request Body
FieldTypeRequiredDescription
contentstringNote text
Example Request
curl -X POST /v1/cases/case_12345abcde/notes \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Spoke with customer. Provided source of funds documentation."
  }'
Example Response — 201 Created
{
  "success": true,
  "data": {
    "id": "evt_002",
    "caseId": "case_12345abcde",
    "eventType": "NOTE_ADDED",
    "actorId": "550e8400-e29b-41d4-a716-446655440000",
    "description": "Spoke with customer. Provided source of funds documentation.",
    "previousValue": null,
    "newValue": null,
    "metadata": null,
    "createdAt": "2026-05-16T17:00:00Z"
  }
}