Identite & KYC
Processus de verification d'identite reglementaire pour les services financiers. Integration Onfido avec verification automatisee et revue manuelle.
Vue d'ensemble
En tant que plateforme fintech, YaniPay est soumise aux reglementations KYC (Know Your Customer) et AML (Anti-Money Laundering). Le module d'identite permet de verifier l'identite des utilisateurs avant d'activer les fonctionnalites financieres (paiements, cartes, transferts).
Conformite reglementaire
Conforme aux directives europeennes AMLD5/AMLD6 et aux reglementations francaises de l'ACPR.
Verification IA Onfido
Verification automatisee des documents et du selfie par intelligence artificielle via Onfido.
Revue admin
Workflow de revue manuelle par les administrateurs pour les cas ambigus ou les verifications echouees.
Donnees personnelles (RGPD)
Pourquoi le KYC
Le KYC est requis pour les actions financieres suivantes :
Flux de verification
Le flux KYC YaniPay combine verification automatisee par IA (Onfido) et revue manuelle par les administrateurs pour les cas necessitant une validation humaine.
Upload documents
L'utilisateur uploade ses documents d'identite et son selfie via l'interface.
Validation format
L'API valide le format, la taille et le type des fichiers. Schema Zod pour les metadonnees.
Verification IA
Onfido analyse les documents : authenticite, correspondance visage, detection de fraude.
Webhook resultat
Onfido envoie le resultat via webhook (HMAC-SHA256). Statut mis a jour en base.
Revue admin
L'admin revoit les cas ambigus et prend la decision finale : approuve ou rejete.
Types de documents
Les valeurs du champ documentTypecorrespondent a l'enum KYCDocumentType Prisma. Taille maximale : 5 MB pour tous les fichiers.
NATIONAL_ID
Carte nationale d'identite — champ documentSide : 'front' | 'back'
JPEG, PNG - Max 5 MB
PASSPORT
Passeport — page avec photo et informations
JPEG, PNG, PDF - Max 5 MB
DRIVERS_LICENSE
Permis de conduire (recto/verso) — champ documentSide requis
JPEG, PNG, PDF - Max 5 MB
RESIDENCE_PERMIT
Titre de sejour ou justificatif de domicile
JPEG, PNG, PDF - Max 5 MB
Statuts de verification
L'enum KYCStatus Prisma contient 5 valeurs. Attention : VALIDATED (et non APPROVED) est la valeur de succes, et IN_REVIEW (et non review) indique une revue manuelle.
En attente
PENDINGDocuments uploades, en cours de verification par Onfido ou l'admin.
En revue
IN_REVIEWCas ambigu, en attente de decision manuelle par un administrateur.
Valide
VALIDATEDIdentite verifiee. L'utilisateur a acces a toutes les fonctionnalites financieres.
Rejete
REJECTEDVerification echouee. L'utilisateur est invite a soumettre de nouveaux documents.
Expire
EXPIREDDocuments ou verification arrives a expiration. Une nouvelle soumission est requise.
API Overview
| Methode | Endpoint | Description |
|---|---|---|
| POST | /api/kyc/upload | Uploader un document d'identite |
| POST | /api/kyc/validate | Valider et soumettre pour verification |
| GET | /api/kyc/verification | Statut de la verification |
| GET | /api/admin/kyc | Liste des verifications (admin) |
| PUT | /api/admin/kyc/:id | Approuver/Rejeter (admin) |
| POST | /api/webhooks/onfido | Webhook Onfido |
| POST | /api/documents/verify-phone | Verification OTP telephone |
| GET | /api/admin/kyb | Verifications KYB (admin) |
Quick Start
Pour integrer le KYC dans votre application, commencez par configurer les variables d'environnement Onfido :
# Onfido Configuration (webhook de resultat)
ONFIDO_API_TOKEN=api_sandbox.xxxxxxxxxxxxxxxxxxxxx
ONFIDO_WEBHOOK_TOKEN=whsec_xxxxxxxxxxxxxxxxxxxxx
# Object storage — stockage des documents (utilise dans /api/kyc/upload)
BLOB_READ_WRITE_TOKEN=xxxxxxxxxxxxxxxxxxxxx1 // Cote client : upload d'un document KYC 2 // Utiliser apiPost n'est pas adapte pour multipart — utiliser fetch directement 3 const formData = new FormData(); 4 formData.append('file', file); // Fichier JPEG, PNG ou PDF (max 5 MB) 5 formData.append('documentType', 'NATIONAL_ID'); // 'NATIONAL_ID' | 'PASSPORT' | 'DRIVERS_LICENSE' | 'RESIDENCE_PERMIT' 6 formData.append('documentSide', 'front'); // 'front' | 'back' (optionnel, pour CNI/permis) 7 8 // L'authentification est recuperee depuis la session (getCurrentUser) 9 // NE PAS envoyer le userId dans le formulaire (securite IDOR) 10 const response = await fetch('/api/kyc/upload', { 11 method: 'POST', 12 body: formData, 13 // Pas de Content-Type header : le navigateur le genere avec le boundary 14 }); 15 16 const data = await response.json(); 17 // data.success = true 18 // data.submission.id — ID de la KYCSubmission 19 // data.submission.status — 'PENDING' 20 // data.submission.documentType — 'NATIONAL_ID' 21 // data.document.id — ID du KYCDocument 22 // data.document.fileUrl — URL du fichier charge (object storage)
1 import { apiGet } from '@/lib/api/client'; 2 import type { KYCStatusAPIResponse } from '@platform/api/contracts/kyc'; 3 4 const data = await apiGet<KYCStatusAPIResponse>('/api/kyc/verification'); 5 6 // data.kyc.kycStatus — 'PENDING' | 'IN_REVIEW' | 'VALIDATED' | 'REJECTED' | 'EXPIRED' 7 // data.kyc.kycLevel — 'BASIC' | 'INTERMEDIATE' | 'ADVANCED' 8 // data.kyc.firstName, data.kyc.lastName 9 // data.kyc.submittedAt, data.kyc.verifiedAt (ISO 8601) 10 // data.kyc.rejectionReason (null si non rejete) 11 // data.kyc.limits.maxTransactionLimit — ex: 5000 EUR pour INTERMEDIATE 12 // data.levels — limites pour chaque niveau KYC
1 import { apiPost } from '@/lib/api/client'; 2 import type { KYCSubmitRequest } from '@platform/api/contracts/kyc'; 3 4 // Etape 1 : creer la soumission KYC (avant upload des documents) 5 await apiPost('/api/kyc/verification', { 6 kycLevel: 'INTERMEDIATE', // 'BASIC' | 'INTERMEDIATE' | 'ADVANCED' 7 firstName: 'Jean', 8 lastName: 'Dupont', 9 dateOfBirth: '1990-01-15', // optionnel — format YYYY-MM-DD 10 nationality: 'FR', // optionnel 11 } satisfies KYCSubmitRequest); 12 13 // Retourne : { success: true, submissionId, status: 'PENDING' } 14 // Puis uploader les documents via POST /api/kyc/upload
SDK Onfido
Rate Limiting
| Route | Rate Limit | Auth |
|---|---|---|
| POST /api/kyc/upload | strictRateLimit — 10 req / min | getCurrentUser() |
| GET /api/kyc/upload | aucun (lecture) | getCurrentUser() |
| GET /api/kyc/verification | strictRateLimit — 10 req / min | getServerSession |
| POST /api/kyc/verification | strictRateLimit — 10 req / min | getServerSession |
| GET /api/kyc/validate | apiRateLimit | ADMIN uniquement |
| POST /api/kyc/validate | apiRateLimit | ADMIN uniquement |
| POST /api/documents/verify-phone | strictRateLimit — 10 req / min | getCurrentUser() |
| POST /api/webhooks/onfido | apiRateLimit | HMAC-SHA256 (ONFIDO_WEBHOOK_TOKEN) |
Prochaines etapes
Ressources associees
Derniere mise a jour : 31 mars 2026 — KYCStatus enum : PENDING | IN_REVIEW | VALIDATED | REJECTED | EXPIRED, upload multipart object storage, types @platform/api/contracts/kyc