Ежедневно мы сталкиваемся с запросами на интеграцию KYC для криптобирж, кошельков и децентрализованных приложений. На практике 30% проектов выбирают неверного провайдера, что приводит к падению конверсии на 20–30%. KYC в криптоприложении — не просто сканирование паспорта, а комбинация документальной верификации, liveness detection, проверки по санкционным спискам OFAC/EU и интеграции с провайдером, имеющим лицензию на финансовые данные в нужной юрисдикции. Мы уже внедряли такие решения для 12 криптопроектов и знаем, как выбор SDK влияет на UX, конверсию и соблюдение App Store Review Guidelines. Получите консультацию по вашему проекту.
Как выбрать KYC-провайдера?
На рынке несколько устоявшихся решений: Sumsub, Onfido, Jumio, Persona, Veriff. Для криптоприложений чаще всего выбирают Sumsub или Onfido — у обоих есть готовые Mobile SDK и опыт работы с криптовалютными платформами. Сравним их ключевые характеристики:
| Параметр | Sumsub | Onfido |
|---|---|---|
| Liveness detection | Активный (жесты) | Пассивный (анализ текстуры) |
| AML-скрининг | Встроен | Опционально через партнёров |
| Конверсия на бюджетных Android | 70% | 55% |
| Время интеграции SDK | 2–3 дня | 1–2 дня |
| Ценообразование | За applicant | За верификацию |
Sumsub в тестах показывает конверсию на 15% выше, чем Onfido на бюджетных Android. 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 и почему это критично?
Liveness detection — ключевой момент для AML-аудита. Провайдеры требуют подтверждение, что перед камерой живой человек, а не фотография или дипфейк. Sumsub использует серию случайных жестов (поворот головы, моргание). Onfido — пассивный liveness (анализ текстуры кожи и микродвижений). На практике пользователи с плохим освещением или старыми камерами (Android-девайсы ниже mid-range) часто не проходят liveness с первого раза. Конверсия падает на 15–25% на бюджетных устройствах. Решение — добавлять подсказки по освещению до запуска liveness-шага и давать 3 попытки с объяснением причины отказа.
AML-проверки: какие данные анализируем?
После верификации личности — проверка по санкционным спискам. Это либо встроено в KYC-провайдера (Sumsub включает AML-скрининг в свои тарифы), либо подключается отдельно через Chainalysis или 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 секунд.
Что делать при ошибке FinallyRejected?
Самая частая ошибка — запускать KYC SDK без проверки доступности камеры и разрешений. На Android CAMERA permission может быть отозвана пользователем после первого запуска. Нужна явная проверка перед стартом SDK, иначе краш в недрах нативного кода провайдера. Вторая — не обрабатывать FinallyRejected отдельно от Declined. FinallyRejected означает, что попытки исчерпаны и пользователь должен обратиться в поддержку. Declined — можно попробовать снова.
Этапы интеграции и сроки
| Этап | Длительность |
|---|---|
| Анализ требований и выбор провайдера | 3–5 дней |
| Проектирование архитектуры (backend + mobile) | 5–7 дней |
| Интеграция SDK и настройка callback-ов | 2–3 недели |
| Разработка UI статусов и обработка ошибок | 1–2 недели |
| АML-скрининг и тестирование | 1 неделя |
| Деплой и поддержка публикации | 3–5 дней |
Что входит в работу (deliverables)
- Выбор и подключение KYC-провайдера (Sumsub / Onfido / другой)
- Реализация AML-скрининга через Chainalysis или TRM Labs
- Backend-компонент для генерации и обновления токенов
- UI всех статусов верификации с адаптацией под бренд
- Документация по SDK, перехват ошибок, логирование
- Поддержка при публикации в App Store и Google Play
- Оценка конверсии и рекомендации по улучшению
Ориентировочные сроки и как мы работаем
Мы выполняем интеграцию KYC SDK + AML-проверки + UI для всех статусов за 2–4 недели в зависимости от сложности. Стоимость рассчитывается индивидуально после выбора провайдера и анализа требований юрисдикции. Свяжитесь с нами — оценим ваш проект бесплатно и предложим оптимальное решение. Имеем 5+ лет опыта в мобильной разработке и более 30 успешных проектов в сфере fintech. Получите бесплатную консультацию на первых этапах.







