Documentation
De zéro au premier scan en une heure.
Intégrez la vérification d'identité dans votre application Flutter existante — Android et iOS. Aucun code natif à écrire, aucun dépôt Maven à ajouter.
cortixia_kyc_sdk v0.4.0
1 Installation
Le SDK s'installe comme dépendance git. Prérequis :
- Android —
minSdkVersion 26, appareil équipé du NFC ; permissionsINTERNET,CAMERAetNFC - iOS — Xcode 15+, iPhone réel, compte développeur Apple payant (exigé par le NFC — voir la section iOS)
- Aucun code natif à intégrer, aucun dépôt Maven supplémentaire
- Build de release Android : ajoutez les règles ProGuard ci-dessous (ML Kit)
- Communication en HTTPS uniquement
dependencies:
cortixia_kyc_sdk:
git:
url: https://git.cortixia.io/mohamed.zidoun/cortixia-kyc-flutter-sdk.git
ref: v0.4.0
Configuration iOS
Les parcours carte d'identité et passeport fonctionnent sur iOS à partir du SDK v0.4.0. Le NFC exige un compte développeur Apple payant (les équipes personnelles gratuites n'y ont pas droit). Trois réglages dans votre dossier ios/ :
<key>NSCameraUsageDescription</key>
<string>La caméra est utilisée pour scanner votre document et vérifier votre identité.</string>
<key>NFCReaderUsageDescription</key>
<string>Le lecteur NFC lit la puce de votre document d'identité.</string>
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
<string>A0000002471001</string>
</array>
+ Capability → Near Field Communication Tag Reading
(crée Runner.entitlements avec
com.apple.developer.nfc.readersession.formats = [TAG])
platform :ios, '15.5' # requis par google_mlkit_*
- iOS affiche sa propre feuille système « Ready to Scan » pendant la lecture NFC.
- L'antenne NFC de l'iPhone est sur le bord supérieur du dos — tenez-y le document (contrairement à Android, où elle est au centre).
- Le parcours permis de conduire reste Android uniquement.
Build de release Android
Le SDK utilise ML Kit pour la lecture MRZ. En build de release, R8 échoue tant que les recognizers de langue optionnels (chinois, devanagari, japonais, coréen) ne sont pas ignorés. Ajoutez ces règles à android/app/proguard-rules.pro et référencez le fichier dans votre bloc release.
-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder
-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions
-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder
-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions
-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder
-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions
-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder
-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
2 Votre jeton API
Le jeton (format ck_live_…) est créé avec votre compte et visible sur votre tableau de bord. Il identifie votre entreprise, porte vos packs et votre quota.
Créer un compte —
50 crédits d'essai, sans carte bancaire.
import 'package:cortixia_kyc_sdk/cortixia_kyc_sdk.dart';
await CortixiaKyc.initialize(
CortixiaKycConfig(apiToken: 'ck_live_VOTRE_JETON'),
);
Côté REST, le même jeton s'envoie en en-tête X-API-Key ou Authorization: Bearer.
3 Premier scan
Un appel ouvre le parcours complet : caméra → MRZ → lecture NFC → liveness. Le SDK gère les écrans, vous recevez le résultat.
final result = await CortixiaKyc.scanIdCard(context);
// aussi : scanPassport(context) · scanDrivingLicence(context)
if (result.status == KycStatus.success) {
final data = result.document!; // identité décodée
print(data.personal['firstName']);
print(data.personal['nin']);
final photo = data.biometric['faceImage']; // JPEG base64
final liveness = result.liveness; // null si l'étape a été ignorée
}
Les documents pris en charge : Carte d'identité biométrique · Passeport · Permis de conduire.
À la carte
Points d'entrée modulaires
Chaque capacité s'appelle aussi seule — utile quand votre système possède déjà une partie du parcours.
scanMrz — lire la MRZ sans toucher la puce
final mrz = await CortixiaKyc.scanMrz(context, KycDocumentType.idCard);
if (mrz != null) {
print(mrz.documentNumber); // clés nécessaires à la lecture NFC
print(mrz.birthDateMrz); // AAMMJJ brut
print(mrz.expiryDateMrz);
}
readChip — lire la puce avec des clés que vous avez déjà
// À partir d'une MRZ déjà lue…
final data = await CortixiaKyc.readChip(context, KycDocumentType.idCard, mrz: mrz);
// …ou à partir de clés que vous possédez déjà
final data2 = await CortixiaKyc.readChip(
context, KycDocumentType.passport,
documentNumber: '123456789', birthDate: '950312', expiryDate: '360422',
);
checkLiveness — vérification de présence seule
// Contre une photo de référence que vous fournissez
final liveness = await CortixiaKyc.checkLiveness(
context, referenceFace: mesOctetsJpeg,
);
if (liveness != null && liveness.passed) {
// isMatch == true et isSpoof == false
}
scanMrz nécessite le pack MRZ, readChip le pack NFC, checkLiveness le pack Liveness — le serveur reste seul juge des droits.
Référence
Endpoints REST
Ce que le SDK appelle pour vous — utilisables aussi directement.
| Endpoint | Rôle | Facturation |
|---|---|---|
| POST /api/sdk/v1/init | Valide votre jeton et renvoie votre plan, votre quota et vos packs actifs. | Non facturé |
| POST /api/sdk/v1/mrz | Valide et décode les lignes MRZ lues par la caméra. | 1 crédit |
| POST /api/sdk/v1/decode | Décode les groupes de données lus sur la puce du document. | 1 crédit |
| POST /api/sdk/v1/liveness | Compare une vidéo selfie à une photo de référence. | 1 crédit |
| POST /api/sdk/v1/events | Télémétrie du SDK (début et fin de scan). | Non facturé |
curl -X POST https://www.e-kyc.online/api/sdk/v1/init \
-H "X-API-Key: ck_live_VOTRE_JETON" \
-H "Content-Type: application/json" \
-d '{"sdk_version": "0.4.0", "platform": "android"}'
Erreurs
Codes d'erreur
Chaque refus porte un code stable et un message en clair.
| HTTP | Code | Signification |
|---|---|---|
| 401 | invalid_token | Jeton absent, inconnu ou révoqué. |
| 402 | quota_exceeded | Crédits épuisés pour la période en cours. |
| 402 | no_active_subscription | Aucun abonnement actif sur le compte. |
| 402 | pack_not_entitled | Le pack requis n'est pas activé sur le compte. |
| 400 | invalid_datagroups | Les données envoyées ne sont pas exploitables. |
| 502 | liveness_unavailable | Le service de liveness est momentanément indisponible. |
Une fois connecté, tous ces extraits sont pré-remplis avec votre jeton réel. Documentation personnalisée →
Prêt à scanner ?
Créez votre compte, copiez votre jeton, lancez votre premier scan. 50 crédits offerts.