Cette page rassemble toutes les maquettes de l'application VitaKYC, ordonnées par workflow utilisateur. Chaque écran est annoté pour servir de spécification exploitable par un développeur : quand l'écran s'affiche, quelles données il consomme, quelles API il appelle, quelles transitions il permet, ses états alternatifs (empty / loading / error).
Les boutons en haut permettent de basculer thème clair/sombre et direction LTR/RTL arabe. Les workflows suivent l'ordre d'utilisation réel. Les annotations engineering apparaissent en pied de chaque écran.
Persona · client · agent · admin · compliance · supervisor · auditor · developerTrigger · ce qui déclenche l'écranInputs/Outputs · contrats APIÉtats alternatifsTransitions
1
Client runtime · parcours KYC individu
Parcours rendu par le SDK Web VitaKYC embarqué sur le site du tenant. Mobile-first, 8 écrans max.
Chaque écran lit sa définition depuis GET /v1/forms/{id}/active (Form Designer). L'état
du parcours est sauvegardé en localStorage + synchronisé via PATCH /v1/kyc/cases/{id}.
1.1 · Bienvenue + consentement
Persona · clientÉtape 0
Banque Exemple TN
Bienvenue 👋
Nous avons besoin de vérifier votre identité pour ouvrir votre compte.
Le processus prend environ 3 minutes et se déroule
entièrement en ligne.
En continuant, j'accepte le traitement de mes données personnelles dans le cadre
de l'obligation légale LCB-FT (loi 2015-26 modifiée 2019-9), la conservation 10 ans,
et la transmission éventuelle à la DGI (FATCA) ou à l'INPDP. Voir la
politique de confidentialité.
Trigger
Client clique lien magique https://kyc.tenant/s/JWT reçu par email/SMS.
Résolution du JWT → case_id + form_id + locale.
API appelées
GET /v1/kyc/cases/{case_id}
GET /v1/forms/{form_id}/active (définition JSONB)
POST /v1/kyc/cases/{id}/consent au clic
États alternatifs
JWT expiré : message erreur + bouton régénérer.
Case déjà clos : redirection récap.
Network offline : écran offline avec reprise auto.
Transitions
« Commencer » → 1.2 (Identité).
« Retour » → fermer onglet ou redirect on_cancel_url.
Audit WORM : kyc.consent.given avec timestamp + hash.
1.2 · Identité · formulaire rendu par le Form Designer
Persona · clientÉtape 1/7
Banque Exemple TN
Votre identité
Étape 1 sur 7
Trigger
Après consentement (écran 1.1).
Le SDK lit form.schema.steps[1] et rend dynamiquement les champs.
Inputs / mapping
Chaque champ du Form Designer → propriété canonique (first_name, last_name, dob, nationality).
Validation côté client (min length, regex, date ≥ 18 ans).
API appelées
PATCH /v1/kyc/cases/{id} au submit (idempotency-key).
Persistance draft toutes les 5 s en localStorage.
Transitions
« Continuer » → 1.3 si valid.
Erreur validation : inline aria-live + scroll vers premier champ ko.
Support RTL automatique si locale=ar-TN.
1.3 · Document d'identité · capture recto & verso
Persona · clientÉtape 2/7Déclenche OCR
Banque Exemple TN
Pièce d'identité
Placez votre CNI ou passeport dans le cadre.
Prévisualisation caméra
Recto ✓Verso
Trigger
Après validation écran 1.2.
Activation caméra via navigator.mediaDevices.getUserMedia.
Pipeline OCR
Upload vers POST /v1/kyc/cases/{id}/documents (multipart, kind=id_card_front).
Événement Kafka document.uploaded → ocr-svc.
Feedback temps réel qualité image : flou, reflet, cadrage.
États alternatifs
Pas de caméra : fallback upload fichier.
Image floue : retour + retry avec hint.
OCR confidence < seuil : retry ou fallback commercial (silencieux).
Auto-approve instantané : email « compte ouvert ».
Manual review : email « en cours, 24-48 h ».
Rejet : email + raison lisible + recours.
Transitions
Redirect on_complete_url tenant (site banque).
Retour ultérieur : écran récap dossier avec statut.
2
Agent back-office · revue des dossiers KYC
Application web desktop utilisée par les agents conformité des tenants pour revoir les dossiers placés en manual_review, décider (approve / reject), et traiter les alertes AML.
Authentification via Keycloak OIDC, MFA obligatoire, RBAC (agent, supervisor, admin, auditor).
2.1 · Login SSO + MFA
Persona · agentKeycloak OIDC
VVitaKYC
Connexion
Étape 2 : code TOTP via Okta Verify / YubiKey
Trigger
Accès à back-office.vitakyc.io ou domaine tenant white-label.
Email client peut être édité mais template obligatoire.
Audit WORM + piste immutable.
Transitions
Confirmation → case.status = rejected.
Webhook kyc.case.decided émis au tenant.
Retour queue (2.3).
2.6 · Liste alertes AML
Persona · agent / compliance
Alertes AML · 23 ouvertes
Sev
Type
Sujet
Source
Score
Créé
Statut
Critical
Sanction hit
Viktor Popov
OFAC SDN
0.96
il y a 10 min
Ouvert
High
Pass-through
ACME Trading SARL
TxMon rules
0.89
il y a 1 h
Assigné MB
High
PEP update
Ahmed El Khouri
Dow Jones
0.85
il y a 3 h
Ouvert
Medium
Adverse media
Firas B. (PEP)
ComplyAdv NLP
0.72
hier
Assigné AL
Low
Velocity
compte xxx3456
TxMon rules
0.42
hier
Ouvert
Trigger
Menu « Alertes AML ».
Webhook aml.alert.created pousse vers ce listing en temps réel.
API
GET /v1/aml/alerts?severity=&status=&source=&cursor=
SSE pour alertes temps réel : GET /v1/aml/alerts/stream.
Actions
Traiter : ouvre fiche alerte détail.
True positive → générer STR (workflow 5.4).
False positive → cause + retour au modèle (rétroaction ML).
Anti-tipping off
Les STR déjà déposés ne sont visibles qu'aux rôles compliance_officer et admin.
Agent peut créer draft STR, le compliance valide.
3
Admin tenant · Form Designer
Éditeur no-code utilisé par les admin tenant pour construire les parcours KYC consommés par le SDK Web.
Drag-drop de champs, règles conditionnelles, traductions FR/AR/EN, versioning + publication.
3.1 · Liste formulaires + versions
Persona · admin
Form Designer
Banque Exemple TN · 5 formulaires
Nom
Code
Langues
Version active
Usages 30j
Dernière MAJ
Compte courant retail
Parcours standard individus
tn-retail-v2
🇫🇷 🇹🇳 🇬🇧
v2.1
1 247
il y a 14 j
KYB entreprise TN
Parcours B2B avec RNE + UBO
tn-kyb-v1
🇫🇷 🇹🇳
v1.3
42
il y a 3 j
Compte jeune 18-25
tn-youth-v1
🇫🇷 🇹🇳
v1.0
89
il y a 30 j
Crédit immobilier
tn-mortgage-v1
🇫🇷
Draft
0
il y a 1 j
FATCA annex form
tn-fatca-v1
🇫🇷 🇬🇧
Archivé
—
il y a 6 mois
Trigger
Menu « Form Designer » (role admin tenant).
API
GET /v1/forms + GET /v1/forms/{id}/versions
États alternatifs
Premier login : empty state avec 5 templates sectoriels prêts à cloner.
Tenant sans licence Form Designer : CTA upsell.
Transitions
Édition → 3.2.
Nouveau → wizard 3 étapes (nom, template, langues).
486 caractères · cible 5W · OK (min 50, max 10 000)
Transactions incluses · 3
Date
Montant
Direction
Contrepartie
Pays
14/04/2026
76 000 USD
Credit
Global Holdings Ltd
VG
17/04/2026
847 320 USD
Credit
Starfish Capital SA
PA
18/04/2026
840 000 USD
Debit
Horizon Business LLC
AE
Destination
Validation
✅ Narrative > 50 chars
✅ ≥ 1 transaction incluse
✅ Sujet + counterparties documentés
⚠ Validation DPO requise avant envoi
⚠ Interdiction de tipping-off : ne divulguez à personne hors compliance + DG + juridique que ce signalement existe, y compris au client concerné (loi 2015-26 art. 121, GAFI R.21).
API
POST /v1/aml/str
POST /v1/aml/str/{id}/submit
Génération XML
POC Kotlin goAML (60+ FIU) ou variante nationale.
XML signé SHA-256 + archivage WORM 10 ans.
Anti-tipping off
Bannière visible en permanence.
Visibilité STR limitée aux rôles compliance_officer, admin, auditor.
Transitions
Envoi → webhook aml.str.submitted.
Accusé autorité → aml.str.acknowledged.
5.5 · Déclarations FATCA · liste
Persona · compliance
Déclarations FATCA · exercice 2025
Réf
Type
Exercice
Comptes
Statut
Soumis le
IDES
0005623A-2025-001
FATCA 1
2025
187
Accepté IRS
15/09/2025
IDES-458912
0005623A-2025-002
FATCA 3
2025
3
Annulation OK
31/10/2025
IDES-462017
0005623A-2025-003
FATCA 1
2025
3
Accepté IRS
15/11/2025
IDES-465331
0005623A-2025-004
NilReport
2024 FY
0
Déposé
15/09/2024
IDES-412098
0005623A-2026-001
FATCA 1
2026
—
Brouillon
—
—
Calendrier DGI → IRS 2025
15 sept
✅ Envoyé
16 oct
✅ Envoyé
31 oct
✅ Envoyé
15 nov
✅ Envoyé
15 déc
⏳ En attente
API
GET /v1/tcr/declarations?year=2025
POST /v1/tcr/declarations pour générer (FATCA 1/2/3/4 + NilReport)
Un dossier réassigné conserve son historique complet.
Notification email à l'agent recevant.
Audit
Event WORM case.reassigned avec raison.
Transitions
Assignation → retour au dashboard équipe.
7
Auditor · accès lecture seule pour audits
Rôle utilisé lors d'un audit BCT / AMF / interne. Lecture seule, mais accès illimité à l'audit trail WORM + vérification cryptographique du hash chain.
7.1 · Audit trail readonly · recherche + filtres
Persona · auditor
🔒 Mode auditeur · lecture seule. Toutes vos consultations sont journalisées en WORM.
Piste d'audit
Timestamp
Action
Acteur
Cible
IP
Hash
2026-04-22 14:32:11
kyc.case.decision_made
Mohamed B. (agent)
CASE-00123
192.168.1.42
4f2a8…
2026-04-22 14:28:01
kyc.biometric.liveness_score
system
CASE-00123
—
3b9d2…
2026-04-22 14:26:45
kyc.document.uploaded
client
CASE-00123
197.11.80.245
c110f…
2026-04-22 14:20:33
kyc.consent.given
client
CASE-00123
197.11.80.245
8a4c1…
2026-04-22 14:19:12
kyc.case.created
api_client:backend
CASE-00123
10.0.1.42
e7d82…
2026-04-22 14:15:00
aml.list.ingested
system
OFAC SDN
—
2d1b9…
API
GET /v1/audit/events?type=&actor=&target=&from=&to=&cursor=
Chaque delivery log : request body + headers envoyés + response body reçue + timings.
Masquage automatique des données PII dans les logs accessibles.
Alertes
Taux d'échec > 5% sur 1h → email tenant.
9
Mobile SDK · bootstrap + tenant resolution
Spec visuelle de l'intégration mobile dans l'app de la banque cliente. Trois variantes selon déploiement : SaaS partagé, on-premise, fallback PWA via SMS/QR. Source de vérité ingénierie : page Mobile SDK + ADR-024.
9.1
Variante A · SaaS partagé — SDK embarqué dans l'app banque
APP BANQUE X — MOBILE BANKING
Bonjour Rania
Votre compte courant est presque prêt
!
KYC à compléter
3 minutes — requis par la BCT
Propulsé par VitaKYC · confidentiel banque · pinned cert
Trigger
L'utilisateur clique "Compléter mon KYC" dans l'app banque. L'app appelle VitaKYC.startOnboarding(). Le SDK a déjà été configuré au Application.onCreate() avec les valeurs baked dans BuildConfig.
API / Inputs
tenantId = "TN-BANQUEX" (BuildConfig, figé au build)
Pinning fail (proxy MITM) : refus connexion, message "Votre réseau interfère avec la sécurité", lien support.
Device rooted : Play Integrity retourne fail → policy tenant décide (bloquant ou review manuelle).
SDK outdated : API 426 → écran "mettez à jour votre app".
Transitions
→ 1.1 (client runtime welcome) du workflow 1, mais le contexte user / tenant / session est déjà pré-hydraté par le JWT. Au submit final (1.8) → callback onResult + webhook banque kyc.decision signé HMAC.
9.2
Variante B · On-premise — SDK parle au gateway de la banque, pas à VitaKYC.com
Bienvenue Rania. Nous allons vérifier votre identité.
URL: kyc.banquex.tn (branded)
Trigger
Agent en agence crée une session onboarding depuis le back-office. VitaKYC émet URL signée (JWT 30 min). SMS envoyé au client. Clic → navigateur mobile ouvre PWA branded.
API / Inputs
POST /v1/onboarding/sessions → { session_token, url }
Domaine kyc.<banque>.tn = CNAME vers vitakyc-cdn.com (SaaS) ou vers l'edge on-prem (on-prem)
Résolution tenant : Host header OU claim tenant_id du JWT (cross-vérifiés)
SRI + CSP stricte + HSTS preload list
Alternative states
Lien expiré (> 30 min) : écran "Demandez un nouveau lien à votre banque" + bouton redemande via backend banque.
iOS sans Web NFC : parcours dégradé (pas de lecture puce passeport) — doc photo + selfie + liveness.
Navigateur non supporté (vieux Chrome/Safari) : écran "Votre navigateur n'est pas compatible" + liste navigateurs OK.
Caméra bloquée par permission OS : tuto avec deeplink vers settings.
Lien ouvert sur desktop : QR affiché pour scan depuis mobile (le flow exige caméra).
Transitions
→ écrans 1.1 à 1.8 (runtime client), adaptés pour PWA (pas d'API NFC sur iOS, DeviceCheck remplacé par signaux comportementaux + IP reputation). Submit final → redirect vers URL banque avec status query param.
9.4
Variante D · VitaKYC Agent Mobile — app standalone (agents en mobilité)
VK
VitaKYC Agent
MDM · Banque X · region TN
À REVIEW · 12
ksn_01HWR2X3
Rania B. · SLA 2h
High risk
ksn_01HWR4K8
Mohamed T. · SLA 4h
Review
Trigger
App VitaKYC Agent installée via App Store / Play / MDM enterprise. Agent se connecte avec SSO Keycloak + MFA TOTP. Tenant résolu au login (compte lié à un tenant).
API / Inputs
SSO : OIDC Authorization Code + PKCE
Tenant resolution : claim tenant_id du token Keycloak
Feature flags par tenant : peut bloquer l'app si le tenant est en MDM-only
Distribution : App Store + Play public pour tenants SaaS, MDM Jamf/Intune pour tenants sensibles (BCT tier-1, on-prem hors public internet)
Offline : mode consultation read-only des dossiers déjà chargés, pas d'action possible.
Session Keycloak expirée : re-login forcé, pas de refresh silencieux (sécurité accrue vs SDK client).
Transitions
→ écrans du workflow 2 (agent back-office) adaptés mobile : queue, detail case, decision. Actions critiques (approve high-risk) exigent 4-eyes — l'agent mobile demande validation d'un collègue via push notification.
10
Admin · Risk Matrix (matrice de risques client)
Interface d'administration de la matrice de risques client, par tenant. 5 écrans : liste des policies versionnées, éditeur dimensions avec pondérations, éditeur overrides + model cards, shadow mode + backtesting, publication avec dual control. Spec ingénierie : Risk Engine · ADR-025 · Playbook BCT.
10.1
Liste des policies + versions (versioning immuable)
Confusion matrix (ancien niveau v1.9 → nouveau v2.0)
LOW ▶
STANDARD ▶
HIGH ▶
PROHIBITED ▶
▶ LOW
2 845
218
12
0
▶ STANDARD
45
1 120
87
2
▶ HIGH
0
18
455
41
▶ PROHIBITED
0
0
5
152
Impact : 376 dossiers changent de niveau (7,5% de l'échantillon). Dont : 43 passent de HIGH à PROHIBITED (nouveaux overrides adverse media > 0.9) · 87 de STANDARD à HIGH (seuil geo ajusté pour nouvelle greylist FATF 2025-10) · 218 de LOW à STANDARD (pondération channel relevée).
Reproductibilité : backtest utilise les listes FATF/OFAC de l'époque de chaque dossier (listRefs), pas les listes d'aujourd'hui.
Trigger
Écran ouvert : (a) via timer quotidien du shadow mode, (b) depuis 10.3 après clic « Soumettre pour backtest », (c) lien direct depuis report email.
API / Inputs
Shadow : POST /v1/risk/policies/{id}/shadow-activate, métriques via GET /v1/risk/policies/{id}/shadow-metrics
Backtest : POST /v1/risk/policies/{id}/backtest (Temporal workflow async), rapport via GET /v1/risk/policies/{id}/backtest-reports/{btrId}
Listes historiques : l'archive est lue depuis S3 bucket `aml-lists-archive` par date
Backtest en cours : progress bar 0-100%, estimation temps restant
Pas assez de dossiers historiques (< 1000) : warning « résultats peu représentatifs »
Transitions
→ 10.5 (soumission dual control) · retour 10.3 (modifier draft si KO) · export PDF rapport pour audit
10.5
Publier — dual control + signature Vault
v2.0 — En attente d'approbationPENDING_APPROVAL (1/2 signatures)
Justification (proposée par compliance-officer)
Adaptation au renforcement BCT 2025-10 : nouvelle greylist FATF incluant Nigeria, Pakistan, Turquie. Seuil COMPTE_DEVISE relevé de 50k à 60k TND/mois. Ajout override `adverseMediaScore > 0.9` → mustHigh. Backtest montre +87 STANDARD→HIGH (charge EDD +7%, acceptable, capacité prévue).
Signatures requises (dual control)
Directeur compliance✓ Signé
directeur-compliance@banquex.tn
ed25519:AAAA...
Signé il y a 1h · « Approuvé après revue backtest + model cards. »
DSIEn attente
dsi@banquex.tn
Email envoyé · 3 rappels prévus (J+0, J+1, J+3)
Stratégie de rollout
Checklist pré-publication ✓ backtest passé · ✓ shadow 2 sem. passé · ✓ model cards complètes · ✓ 1 signature sur 2 · ⏳ en attente DSI · ☐ communication agents préparée
Trigger
Depuis 10.4 après clic « Soumettre pour approbation ». La policy passe en PENDING_APPROVAL, 2 emails envoyés aux approbateurs avec lien signé.
API / Inputs
POST /v1/risk/policies/{id}/submit-for-approval avec backtestReportId + shadowReportId + justification
POST /v1/risk/policies/{id}/approve body : signature Ed25519 (clé perso Vault + MFA + SSO), comment obligatoire
POST /v1/risk/policies/{id}/publish (serveur auto après 2ème signature) : publie la policy, effectiveFrom activé, ancienne archived
Audit WORM : chaque étape append-only avec hash chain SHA-256
Alternative states
Un approbateur rejette : comment obligatoire ≥ 100 car, policy passe en REJECTED, draft éditable à nouveau
Délai 7j sans 2ème signature : rappel auto chaque 48h, escalade directeur général à J+7
Console compliance officer + DSI pour superviser les sources de listes (OFAC, UN, EU, UK, World Bank, OpenSanctions + DJ option), configurer la policy de matching et auditer les screenings. 5 écrans : sources status, cron calendar, configuration policy avec dual-control, audit search avec rejeu, KPIs + monitoring. Spec ingénierie : Sanctions admin UI · Sanctions screening · ADR-030 · Runbook SRE.
12.1
Sources status — grille 7 listes free + DJ avec snapshots
Sanctions sources · TN-BANQUEX
Healthy 6 / 7 · Stale 1 · Error 0 · Last full reindex il y a 6 j
Heap OS proche threshold : 68 % (cible < 85 %) → no action
OK : pas de tampering détecté audit chain
13
AML · Transaction Monitoring (alertes streaming temps-réel)
Console AML pour traiter les alertes générées par le moteur de streaming Kafka Streams sur le flux de transactions du core banking. 4 écrans : file d'alertes avec filtres typology + severity, détail alerte avec timeline tx + drill-down compte, investigation panel avec 4-eyes + draft STR goAML, gestion des règles avec shadow mode + backtest. Spec ingénierie : AML Streaming Engine · AML Transaction Monitoring (vue d'ensemble) · ADR-031 · POC Kotlin.