Реалізація KYC/AML верифікації в мобільному криптоприложенні
KYC в крипто-додатку — це не просто "сканувати паспорт". Комбінація документальної верифікації, liveness detection, перевірки по санкційним спискам (OFAC, EU) та інтеграція з ліцензованим провайдером. Вибір SDK впливає на UX, конверсію, регуляторну відповідність.
Вибір провайдера
Установлені рішення: Sumsub, Onfido, Jumio, Persona, Veriff. Для крипто найчастіше Sumsub або Onfido — обидва мають мобільний SDK та досвід крипто.
Sumsub SDK (iOS та Android) працює через applicant ID, створений на backend:
// Android — ініціалізація Sumsub SDK
val snsMobileSDK = SNSMobileSDK.Builder(this, accessToken)
.withHandlers(
onStatusChanged = { newStatus, prevStatus ->
when (newStatus) {
SNSSDKState.Ready -> Log.d("KYC", "SDK ready")
SNSSDKState.Failed.Unauthorized -> refreshToken()
SNSSDKState.FinallyRejected -> showRejectedScreen()
SNSSDKState.ApplicantSubmitted -> navigateToWaitingScreen()
else -> {}
}
},
onError = { error ->
Sentry.captureException(RuntimeException("KYC error: ${error.description}"))
}
)
.build()
snsMobileSDK.launch()
Токен доступу живе 60 секунд — потрібен endpoint на backend для оновлення (/kyc/token/refresh). Якщо користувач завис та токен закінчився — SDK викликає Unauthorized, потрібен незаметний рефреш.
Liveness Detection
Це ключовий момент для AML-аудиту. Провайдери вимагають підтвердження, що перед камерою живе людина, не фотографія чи deepfake. Sumsub використовує серію випадкових жестів (поворот голови, моргання). Onfido — пасивний аналіз текстури шкіри та мікрорухів.
На практиці: користувачі з поганим освітленням або старими камерами часто не проходять з першої спроби. Конверсія падає на 15–25% на бюджетних пристроях. Рішення — додавати підказки з освітленням та давати 3 спроби з поясненням причини відмови.
AML-перевірки
Після верифікації особистості — перевірка по санкційних списках. Це або вбудовано в KYC-провайдера (Sumsub включає AML у тарифи) або підключається окремо через Chainalysis, Elliptic, TRM Labs.
Chainalysis Reactor API дозволяє перевірити адресу гаманця на зв'язку з darknet-маркетплейсами, mixing-сервісами та хакерськими адресами:
suspend fun checkWalletRisk(address: String): RiskScore {
val response = chainalysisApi.getAddressRisk(
address = address,
outputType = "SUMMARY"
)
return RiskScore(
score = response.risk,
category = response.cluster?.category,
isSanctioned = response.identifications
.any { it.category == "sanctions" }
)
}
Якщо isSanctioned == true — блокуємо транзакцію та логуємо для compliance. Це не UX-рішення, це юридична вимога.
Зберігання статусу верифікації
Статус KYC (pending / approved / rejected / recheck_needed) на backend. Мобільний кешує локально, перевіряє актуальність при кожному запуску та після виходу з фону (applicationWillEnterForeground / onResume).
Переход по екранах залежить від статусу. Користувач без верифікації бачить обмежений функціонал — перегляд курсів, але не транзакції. Після подачі документів — waiting screen з реалтайм-оновленням статусу через WebSocket або polling кожні 30 секунд.
Типові помилки
Найчастіша — запускати KYC SDK без перевірки доступності камери та дозволів. Дозвіл CAMERA може бути відозваний після першого запуску. Потрібна явна перевірка перед стартом SDK.
Друга — не обробляти FinallyRejected окремо від Declined. FinallyRejected означає, що спроби вичерпані та користувач повинен звернутися в підтримку. Declined — можна спробувати знову.
Інтеграція KYC SDK + AML-перевірки + UI для всіх статусів — 2–4 тижні. Вартість розраховується індивідуально після вибору провайдера та аналізу юрисдикції.







