Skip to main content

Overview

Step-by-Step Flow

Step 0: Create Verification

Your application creates a verification via API:
curl -X POST 'https://clear-api.nfigate.com/api/v1/verifications' \
  -H 'X-API-Key: nfi_...' \
  -d '{
    "subjectType": "kyc",
    "subjectReference": "user-123"
  }'

Step 1: ID Selection

User selects:
  • Residence Country - Where they currently live
  • Document Country - Issuing country of ID
  • Document Type - Passport, National ID, or Driver’s License
Document requirements vary by country. Not all document types are available in all countries.

Step 2: Liveness Check

User performs biometric verification:
  • Real-time face detection
  • Liveness challenge (turn head, blink, etc.)
  • Selfie capture with automatic quality checks
Technical Requirements:
  • Modern browser with camera access
  • Good lighting conditions
  • Stable internet connection

Step 3: Document Upload

User uploads ID documents:
  • Front side (required for all)
  • Back side (required for National ID and Driver’s License)
Supported Formats:
  • JPG/JPEG
  • PNG
  • PDF
  • Max file size: 10MB
Quality Checks:
  • Document edges visible
  • Text readable
  • No glare or blur
  • All corners in frame

Step 4: Review & Submit

User reviews all information before submission:
  • Preview of uploaded documents
  • Option to retake photos
  • Consent confirmation
  • Final submission

Step 5: Review

Submitted for manual or automated review:
  • Document authenticity check
  • Biometric matching (selfie vs. document photo)
  • Data extraction verification

Status Tracking

Progress Steps

StepNameDescription
0IntroIntroduction screen
1ID SelectionCountry and document selection
2Liveness CheckBiometric verification
3Document UploadID document capture
4Review & SubmitFinal review and submission

Current Step in API

{
  "data": {
    "currentStep": 2,
    "status": "pending"
  }
}

Webhook Events

EventDescription
verification.createdVerification created
verification.startedUser began the flow
verification.submittedUser completed all steps
verification.approvedVerification approved
verification.rejectedVerification rejected
verification.action_neededCorrections requested

Submitted Data Structure

When verification is complete, you’ll receive:
{
  "submittedData": {
    "residenceCountry": "Singapore",
    "documentCountry": "Singapore",
    "documentType": "passport",
    "frontImageUrl": "https://storage.../front.jpg",
    "backImageUrl": "https://storage.../back.jpg",
    "selfieImageUrl": "https://storage.../selfie.jpg",
    "livenessImages": [
      "https://storage.../liveness1.jpg",
      "https://storage.../liveness2.jpg"
    ],
    "submittedAt": "2024-01-15T10:30:00Z",
    "subjectType": "KYC"
  }
}

Document Types by Country

Singapore

  • Passport
  • National Registration Identity Card (NRIC)
  • Driver’s License

Malaysia

  • Passport
  • MyKad (National ID)
  • Driver’s License

Indonesia

  • Passport
  • KTP (National ID)
  • Driver’s License
Contact support for the full list of supported countries and document types.

Security Features

  • Anti-spoofing: Liveness detection prevents photo attacks
  • Document verification: MRZ checks on passports
  • Data encryption: All images encrypted at rest
  • Secure transmission: TLS 1.3 for all uploads
  • Fraud detection: Automated risk scoring

Time to Complete

StepEstimated Time
ID Selection1-2 minutes
Liveness Check2-3 minutes
Document Upload3-5 minutes
Review1 minute
Total7-11 minutes
Review time: Typically 1-5 minutes for automated checks, up to 24 hours for manual review.

Best Practices

  1. Pre-verify camera access before sending users to the link
  2. Provide clear instructions about document requirements
  3. Set expectations for review timeline
  4. Follow up with users who don’t complete within 24 hours
  5. Handle action_needed status promptly

Troubleshooting

IssueSolution
Camera not workingCheck browser permissions, try different browser
Document rejectedEnsure good lighting, all edges visible
Liveness failedEnsure face is centered, follow prompts slowly
Upload failsCheck file size (less than 10MB), try lower quality

Implementation Example

// Create KYC verification
const createKycVerification = async (user) => {
  const response = await fetch('https://clear-api.nfigate.com/api/v1/verifications', {
    method: 'POST',
    headers: {
      'X-API-Key': API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      subjectType: 'kyc',
      subjectReference: user.id,
      metadata: {
        userEmail: user.email,
        tier: user.verificationTier,
      },
    }),
  });
  
  const data = await response.json();
  
  // Store verification ID
  await db.users.update(user.id, {
    kycVerificationId: data.data.id,
    kycStatus: 'pending',
  });
  
  // Send verification email
  await sendEmail({
    to: user.email,
    template: 'kyc-verification',
    data: {
      verificationUrl: data.data.verificationUrl,
      expiresIn: '7 days',
    },
  });
  
  return data.data;
};