KYC Verification
Know Your Customer (KYC) verification is required for users to access full wallet functionality. The app implements a multi-step verification process with document capture and biometric validation.
Verification Levels
| Level | Requirements | Limits |
|---|---|---|
| Basic | Phone verified | E50 daily |
| Standard | ID + Selfie | E2,000 daily |
| Premium | Full KYC + Address | E10,000 daily |
Verification Flow
┌─────────────────────────────────────────────────────────────────┐
│ KYC Verification Flow │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Profile │────▶│ ID Doc │────▶│ Selfie │ │
│ │ Form │ │ Capture │ │ Capture │ │
│ └─────────────┘ └─────────────┘ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Submitted │◀────│ Liveness │ │
│ │ Review │ │ Check │ │
│ └──────┬──────┘ └─────────────┘ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Approved │ │ Pending │ │ Rejected │ │
│ │ │ │ Review │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘Step 1: Profile Form
Users complete their personal information:
Required Fields:
- Full name (as on ID)
- Date of birth
- Gender
- Nationality
- Physical address
Optional Fields:
- Email address
- Alternative phone number
Step 2: Document Capture
Supported Documents
| Document Type | Front | Back |
|---|---|---|
| National ID | Required | Required |
| Passport | Required | Not needed |
| Driver's License | Required | Required |
Capture Requirements
| Requirement | Value |
|---|---|
| Image Quality | Minimum 1200x800 pixels |
| File Format | JPEG, PNG |
| File Size | Max 5MB per image |
| Lighting | Well-lit, no shadows |
| Angle | Flat, no tilting |
OCR Processing
The app uses ML Kit for automatic data extraction from documents.
Step 3: Selfie Capture
Requirements
| Requirement | Description |
|---|---|
| Face Detection | Face must be detected in frame |
| Lighting | Even lighting on face |
| Expression | Neutral expression |
| Obstructions | No glasses, hats, or masks |
Face Matching
The selfie is compared against the ID document photo using facial recognition. Match threshold is 85% similarity.
Step 4: Liveness Detection
To prevent spoofing attacks, the app performs liveness checks:
Active Liveness
User performs prompted actions:
- Blink eyes
- Turn head left/right
- Smile
Passive Liveness
Background analysis during capture:
- Texture analysis (detect printed photos)
- Depth estimation (detect screens)
- Motion analysis (detect videos)
Verification Status
| Status | Description | User Action |
|---|---|---|
not_started | KYC not initiated | Start verification |
in_progress | Documents submitted | Wait for review |
pending_review | Manual review needed | Wait |
approved | Verification complete | Full access |
rejected | Verification failed | Resubmit |
API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/verification/status | GET | Get current status |
/verification/profile | POST | Submit profile data |
/verification/document | POST | Upload ID document |
/verification/selfie | POST | Upload selfie |
/verification/liveness | POST | Submit liveness data |
Error Handling
| Error | Cause | Resolution |
|---|---|---|
VERIF_001 | Blurry document | Retake photo |
VERIF_002 | Face not detected | Adjust position |
VERIF_003 | Liveness failed | Retry check |
VERIF_004 | Document expired | Use valid document |
VERIF_005 | Face mismatch | Contact support |
Related Files
| File | Purpose |
|---|---|
lib/screens/kyc/kyc_intro_screen.dart | Intro screen |
lib/screens/kyc/profile_form_screen.dart | Profile form |
lib/screens/kyc/document_capture_screen.dart | Document capture |
lib/screens/kyc/selfie_capture_screen.dart | Selfie capture |
lib/screens/kyc/liveness_screen.dart | Liveness check |
lib/screens/kyc/verification_status_screen.dart | Status screen |
lib/controllers/verification_controller.dart | Controller |
lib/services/verification_service.dart | Verification service |
lib/services/liveness_service.dart | Liveness service |