Sumsub Integrate Msdk
Integrate the Sumsub Mobile SDK (IdensicMobileSDK / SNSMobileSDK) into a native iOS or Android app — even when the user doesn't name the SDK (e.g. "add Sumsub/KYC to my iPhone app", "add KYC to my Android app", "show the verification screen", "launch Sumsub from a view controller / activity"). Detects the platform from the project (iOS Xcode/Swift vs Android Gradle/Kotlin) and follows the matching track. Covers install, permissions, init, token refresh, and presenting / launching the flow. SKIP for web (`sumsub-integrate-websdk`), backend / API-only token signing (`sumsub-api-generic`), theming (`sumsub-theme-msdk`), and React Native / Flutter (not supported — native iOS & Android only).
- Skill ID
- sumsub/agent-skills/sumsub-integrate-msdk
- Publisher
- sumsub
- Repository
- agent-skills
- Installs
- 0
- Files
- 40
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
sumsub/agent-skills/sumsub-integrate-msdkInstalls these files- SKILL.md
- android/examples/SumsubIntegration.kt
- android/examples/build.gradle.kts.snippet
- android/examples/settings.gradle.kts.snippet
- android/stages/1-scan.md
- android/stages/2-install-dependencies.md
- android/stages/3-integration-code.md
- android/stages/4-launch.md
- examples/Info.plist.snippet
- examples/Package.swift.snippet
- examples/Podfile.snippet
- examples/SumsubSwiftUI.swift
- examples/SumsubVerification.swift
- ios/examples/Info.plist.snippet
- ios/examples/Package.swift.snippet
- ios/examples/Podfile.snippet
- ios/examples/SumsubSwiftUI.swift
- ios/examples/SumsubVerification.swift
- ios/references/pbxproj-editing.md
- ios/references/spm-pbxproj.md
- ios/references/swift6-concurrency.md
- ios/stages/1-scan.md
- ios/stages/2a-install-cocoapods.md
- ios/stages/2b-install-spm.md
- ios/stages/3-permissions.md
- ios/stages/4-integration-code.md
- ios/stages/5-wire-target.md
- ios/stages/6a-launch-uikit.md
- ios/stages/6b-launch-swiftui.md
- references/pbxproj-editing.md
- references/spm-pbxproj.md
- references/swift6-concurrency.md
- stages/1-scan.md
- stages/2a-install-cocoapods.md
- stages/2b-install-spm.md
- stages/3-permissions.md
- stages/4-integration-code.md
- stages/5-wire-target.md
- stages/6a-launch-uikit.md
- stages/6b-launch-swiftui.md
What this skill tells the agent
Sumsub — Mobile SDK integration (iOS & Android)
Embed Sumsub KYC into an existing native app via the `IdensicMobileSDK` framework (main class `SNSMobileSDK`), from dependency install to presenting / launching the verification flow — on iOS (Swift) or Android (Kotlin).
This is the trunk: read the always-on sections below (intake, asking-vs-doing), detect the platform, then use the decision table to open only the branch files that match the platform, the project, and the user's answers.
Intake — ask these three questions first, in one message
Before touching any project file, ask all three together:
- Launch point. "From which screen should the Sumsub flow open? Please share the class name or describe the screen." — iOS: a ViewController or SwiftUI view; Android: an Activity, Fragment, or Composable.
- Access token source. "Does your app already have a way to fetch a Sumsub access token from your backend? (If yes, share the function name, endpoint URL, or service class. If not, I'll add a placeholder you can fill in when your backend is ready.)"
- Optional modules. "The base SDK covers standard verification flows and is always installed. On top of it, do you need any of these add-ons?
- NFC (passport / eMRTD chip reading) — iOS:
MRTDReader; Android: thenfcmodule – read the chip on biometric passports - VideoIdent — live video call with a moderator
- EID — German eID card reading
- Fisherman / Device Intelligence — fraud signals (iOS: optional module; Android: bundled in the base SDK since 1.43.0 — nothing to add) Skip them if you're not sure — they can be added later."
Modules are purely additive. In a multi-select, list only the modules — an empty selection already means "base only"; don't add "base only" as a co-selectable peer.
Do not ask about: the App Token or the secret key — those are server concerns that never touch the app.
Asking vs doing — keep approvals meaningful
- Read-only is free — scan / grep / read
Info.plist,AndroidManifest.xml& build files without asking. - Batch mutations into one approval, not one per line ("I'll add these 3 Info.plist keys [list] + this call site [diff] — apply?").
- Ask explicitly only for: editing existing app code, project-mutating commands (
pod install, a Gradle sync), anything irreversible, and decisions you couldn't settle in intake.
Detect the platform (do this before opening any branch file)
Decide whether this is an iOS or Android project — the install steps, the permission model, and the generated language all differ. Read-only.
# iOS markers
find . -maxdepth 3 \( -name '*.xcodeproj' -o -name '*.xcworkspace' -o -name 'Podfile' -o -name 'Package.swift' \) 2>/dev/null
# Android markers
find . -maxdepth 3 \( -name 'build.gradle' -o -name 'build.gradle.kts' -o -name 'settings.gradle*' -o -name 'AndroidManifest.xml' \) 2>/dev/null- iOS only (
.xcodeproj/Package.swift/Podfile, no Gradle) → iOS track. - Android only (
build.gradle[.kts]/AndroidManifest.xml, no Xcode) → Android track. - Both present (a monorepo, or a React-Native / Flutter shell with native folders) → report both and ask which platform to integrate. One platform per run. (React Native / Flutter wrappers themselves are out of scope — this skill targets the native SDKs; the Step-1 scan bails on a detected wrapper.)
- Neither → ask the user to point at the app's source root.
Confirm the detected platform if there was any ambiguity, then follow the matching track.
How to navigate this skill
After intake, open ONLY the rows that match the detected platform, the project (from Step 1), and the user's intake answers. Each branch file is self-contained and ends with a Next pointer. A letter (2A/2B, 6A/6B) marks a branch — pick one; plain numbers run in sequence.
iOS track
| Step | Condition | Read |
|---|---|---|
| 1. Scan | always (first, after intake) | `ios/stages/1-scan.md` |
| 2A. Install — CocoaPods | CocoaPods chosen (per Step 1) | `ios/stages/2a-install-cocoapods.md` |
| 2B. Install — SPM | SPM chosen (per Step 1; the default) | `ios/stages/2b-install-spm.md` |
| 3. Permissions & capabilities | always | `ios/stages/3-permissions.md` |
| 4. Integration file | always | `ios/stages/4-integration-code.md` |
| 5. Wire into target | always (right after creating the file) | `ios/stages/5-wire-target.md` |
| 6A. Launch — UIKit | host is a UIKit ViewController | `ios/stages/6a-launch-uikit.md` |
| 6B. Launch — SwiftUI | host is a SwiftUI view | `ios/stages/6b-launch-swiftui.md` |
Android track
| Step | Condition | Read |
|---|---|---|
| 1. Scan | always (first, after intake) | `android/stages/1-scan.md` |
| 2. Install — Dependencies | always | `android/stages/2-install-dependencies.md` |
| 3. Integration file | always (Gradle auto-compiles — no wire-into-target step) | `android/stages/3-integration-code.md` |
| 4. Launch | always | `android/stages/4-launch.md` |
Fallback (last resort only). This skill and its branch files are the primary source — don't reach for external docs by default. Only if you hit a genuine blocker they don't resolve, consult the Sumsub docs: iOS · Android.
When the tree is walked, return here for Guardrails and Handoff.
Guardrails — what this skill must never do
- Detect the platform first — never emit Swift into an Android project or Kotlin into an iOS one; if both are present, ask which to integrate.
- Never edit existing app code beyond the single targeted call site the user approved in intake.
- (iOS) Let the SDK present itself — in SwiftUI too. Always launch via
SumsubVerification.start()(sdk.present()/sdk.present(from:)). Never strong-hold the SDK or itsmainVCacross the flow, and never bridgesdk.mainVCinto a SwiftUI.fullScreenCover/.sheet.mainVCstrong-retains the SDK and the SDK firesonDidDismissfrom that controller'sdealloc; holding it yourself delays teardown and causes "opens every other time" + a crash on re-open. The SDK owns presentation and dismissal — one owner, clean re-open.
More from sumsub
Use this skill in a project
Open any RiverX project, search the Skills panel for sumsub/agent-skills/sumsub-integrate-msdk, and install it in one click.
