
sumsub-integrate-dint-standalone
Add Sumsub Device Intelligence (the Fisherman JS module) to your own web pages where there is NO Sumsub verification widget — login, signup, password reset, 2FA, checkout, or any high-value action you want fraud-screened. TRIGGER when the user asks to "add device intelligence to login / signup", "fingerprint the device on a custom page", "use Fisherman standalone / self-hosted", "ongoing monitoring of platform events", "pre-KYC device check", "detect multi-accounting at signup", or "send a financial transaction with the captured device". Covers the whole loop — behavior access token, @sumsub/fisherman init + fingerprint, confirming the event (platform event / financial transaction / create-applicant), reading results, sandbox, go-live. SKIP when the page already embeds the Sumsub WebSDK — Device Intelligence rides along inside it, use sumsub-integrate-dint-websdk.
- Installs
- 980
- Last 24h
- +16
- Trending rank
- #6847
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/sumsub/agent-skills --skill sumsub-integrate-dint-standalone- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads sumsub-integrate-dint-standalone automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Sumsub — Device Intelligence standalone (no WebSDK)
Run Device Intelligence (DI) on your own pages that have no Sumsub
verification widget — logins, signups, password resets, 2FA, checkouts. You
embed the Fisherman JS module (npm @sumsub/fisherman) directly, capture
the device on a user action, and confirm the action to Sumsub so it can screen
for device fraud (bots, emulators, VPN/proxy, reused devices, multi-accounting).
This is Sumsub's ongoing-monitoring / pre-KYC path. If your page already
shows the Sumsub WebSDK, stop — DI is built into it, use
sumsub-integrate-dint-websdk instead.
⚠️ Sandbox tokens only
Do not accept or use a production App Token / secret during integration
work. Insist on a sandbox pair from
https://cockpit.sumsub.com/checkus/home?sbx=true — Connect Sumsub to
your AI agent -> Build & configure -> Generate token. Token + secret
are revealed once at creation; copy both before closing the dialog. The curl recipes here assume an
sbx: token; the preflight enforces it with an sbx: prefix check. Deeper auth
mechanics: sumsub-api-auth.
Before you start — fit DI into the existing app
DI should look like it was always part of their codebase — their framework, their components, their styling, their conventions. Don't scaffold over someone's app or introduce a new design system. Read enough of the repo to match it, then ask only what you can't infer:
- Which action to screen? The high-value submit to hook DI onto — login, signup, withdrawal, checkout, 2FA, password reset. (Show the ones you found in their routes/components as suggestions.)
- Where's the backend? The server file/route that can mint the behavior token and sign the Stage-3 confirm — HMAC must stay server-side. If they're frontend-only (SPA, no backend), flag that they need a server endpoint and offer to add a minimal one in their stack.
- Existing Sumsub footprint? Do they already call Sumsub / have App Token +
secret wired, an
externalUserIdconvention, a webhook receiver? Reuse it; don't duplicate. - How are secrets / env handled? Match their existing pattern (
.env, secrets manager, config service) forSUMSUB_APP_TOKEN/SUMSUB_SECRET_KEY— sandbox values only during integration. - TypeScript or JS? Match the repo; don't add TS to a JS project or vice-versa.
Map the chosen action to its Stage-3 confirm event:
| Action | Stage-3 confirm event |
|---|---|
| Login / signup / password reset / 2FA | platform event |
| Money movement (transfer, withdrawal, deposit, payment) | platform event + financial txn |
| Pre-KYC signup where you also create the applicant | pre-KYC create-applicant |
| Guest / high-value checkout | financial txn |
Start with Stage 0 (preflight) to confirm the workspace has the DI entitlement
before writing any code. Then implement Stages 1–4 against their files: a token
route in their backend style, fisherman.fingerprint() on their existing submit
handler (fail-open), the server-side confirm with the event mapped from the chosen
action. Touch the minimum needed; follow surrounding code style.
The loop in one picture
┌─────────────────────────────┐ ┌──────────────────────────────────────┐
│ 1. Browser hits your page │─▶│ Your backend: POST .../accessTokens/ │
│ (login / signup form) │ │ behavior {sessionId} → {token} │
└─────────────┬───────────────┘ └──────────────────────────────────────┘
│ behavior access token
┌─────────────▼───────────────┐
│ 2. Browser: @sumsub/fisherman│ ← init(token) → fingerprint() on submit
│ captures the device │ returns { visitorId }
└─────────────┬───────────────┘
│ user submits (login succeeds / account created)
┌─────────────▼───────────────┐ ┌──────────────────────────────────────┐
│ 3. Your backend confirms the │─▶│ Sumsub runs DI analysis on the event │
│ event w/ captured device │ │ (platform event / txn / applicant) │
└─────────────┬───────────────┘ └──────────────────────────────────────┘
│ verdict + device signals
┌─────────────▼───────────────┐ ← Dashboard → Transactions (User
│ 4. You read results / act │ platform event); or webhook
└──────────────────────────────┘
The headline: capturing the device is inert until you confirm the event server-side (Stage 3). Capturing alone produces no verdict — the confirm call is what makes Sumsub run the analysis.
Vocabulary (get these right — they're load-bearing)
| Term | What it is | Who sets it |
|---|---|---|
sessionId | The correlation key. Ties every fingerprint + event in one DI session together, and is the session the behavior token is minted with — so the Stage-3 confirm correlates the captured device to the event server-side, with no device fields in the body. | Your backend — generate one per logical session, opaque & unique. |
deviceBindingId | Optional alternative linking id. Sumsub is migrating device linking from sessionId to deviceBindingId; on the default flow it is not required. If you use it: pass it to fingerprint(), mint the token with it, and send it at applicant.device.deviceBindingId in the confirm body. | Your frontend — a fresh crypto.randomUUID() per action. |
linkedId | Optional — links the fingerprint to an entity (your user id / applicant id). | Frontend (optional). |
visitorId | The device identifier fingerprint() returns; surfaces in results. On the standalone confirm flow you do not forward it — the token's session ties the capture to the event. | Returned by Fisherman. |
Stage 0 — Preflight
scripts/preflight.sh machine-validates the workspace
before you write any frontend code:
SUMSUB_APP_TOKEN=sbx:... SUMSUB_SECRET_KEY=... \
bash scripts/preflight.sh
| Check | What it proves |
|---|---|
behavior_token | HMAC signing is accepted and Device Intelligence is enabled for this workspace — mints a real short-TTL behavior token (discarded, expires on its own; nothing else is mutated) |
levels | Verification levels exist. WARN-only — just the pre-KYC confirm path (create-applicant) needs one; platform events work without it |
Exit code: 0 on all-PASS / PASS+WARN, 10 on any FAIL. A 403 on
behavior_token usually means the DI entitlement is off for the
workspace — it's not self-serve; ask your CSM or support@sumsub.com to
enable Device Intelligence, mentioning your clientId (Dashboard top-left)
and environment (sandbox/production). Resolve all FAILs before Stage 1.
Stage 1 — Backend: mint a behavior access token
Separate endpoint from the WebSDK token — note the /behavior suffix and the
JSON body:
POST https://api.sumsub.com/resources/accessTokens/behavior
Content-Type: application/json
{ "sessionId": "<your-session-id>", "ttlInSecs": 1800 }
- Auth: App Token + HMAC. The body is part of the signature — sign
ts + "POST" + path + body(the empty-body shortcut from the WebSDK skill does not apply here). Seeexamples/behavior-token.sh. - Response:
{ "token": "_act-jwt-..." }— the JWT is thetokenfield, notaccessToken. (Behavior tokens carry nouserId, unlike the WebSDK access-token endpoint.) - TTL defaults to 1800s. Mint on demand per session; don't cache globally.
Wire it as an auth-gated route on your backend (e.g. POST /api/di/token) that
generates/looks up the sessionId, signs, calls Sumsub, and returns the response
token to the browser.
Stage 2 — Frontend: capture the device with Fisherman
npm i @sumsub/fisherman --save
// Shape only — the full impl (fail-open try/catch, React StrictMode teardown) is in
// examples/fisherman-vanilla.html and examples/fisherman-react.tsx.
import { init, destroy } from '@sumsub/fisherman'
// init once when the page / form mounts — getBehaviorToken() calls your Stage-1 route
const fisherman = await init({
token: await getBehaviorToken(),
baseUrl: 'https://api.sumsub.com', // region-specific API host
accessTokenUpdateHandler: getBehaviorToken, // refresh near expiry
onError: () => destroy(), // never let DI block your form
})
// on the user action (e.g. login submit) — gate, fresh deviceBindingId, then confirm server-side
if (fisherman?.isDeviceIntelligenceEnabled) {
const deviceBindingId = crypto.randomUUID()
await fisherman.fingerprint({ deviceBindingId /*, linkedId: userId */ })
// Fisherman posts the capture under the token's session — your Stage-3 confirm
// call needs only the same accessToken to tie this device to the event.
}
destroy() // re-init for the next action
Rules:
- Gate
fingerprint()onisDeviceIntelligenceEnabled— skip silently if DI is off for the workspace. - A fresh
deviceBindingIdper action. Correlation of the capture to the confirm call is the token'ssessionId, not this id — only thedeviceBindingIdmigration path needs it echoed in the confirm body (Stage 3). - DI must never block your real flow — wrap in try/catch, fail open.
destroy()after the action; re-init()for the next one. Refresh tokens viaaccessTokenUpdateHandler(or callupdateAccessToken(newToken)manually).
Runnable starting points: examples/fisherman-vanilla.html,
examples/fisherman-react.tsx.
Stage 3 — Backend: confirm the event with the captured device
Tell Sumsub the action happened; the captured device rides along via the token's
session. Pick the call that matches the action — all use your standard App
Token + HMAC signing (sign ts + "POST" + path + body, exactly like every other
Sumsub API call), and additionally carry the behavior access token as the
?accessToken= query param so Sumsub ties the captured device to the event. The
accessToken does not replace signing — it rides alongside it:
| Action | Endpoint | Doc |
|---|---|---|
| Login / signup / password reset / 2FA | POST /resources/applicants/-/kyt/txns/-/data?accessToken=… | platform event |
| Financial transaction | POST /resources/applicants/-/kyt/txns/-/data?accessToken=… | financial txn |
| Pre-KYC signup (create the applicant) | create applicant with levelName + accessToken + externalUserId | pre-KYC check |
How the device links: the confirm call is App-Token + HMAC signed and
carries the same behavior access token as ?accessToken=. Sumsub correlates
the captured fingerprint to the event server-side using the session the token
was minted with (it reconstructs the key from your externalUserId; the token
scopes the session). You do not put visitorId or a device block in the
body — just identify the user + the event:
{
"txnId": "<unique-id-you-generate>",
"type": "userPlatformEvent",
"applicant": { "externalUserId": "<your-user-id>", "type": "individual" },
"userPlatformEventInfo": { "type": "login" }
}
Runnable: examples/submit-platform-event.sh.
Financial-transaction and pre-KYC bodies + full field lists:
references/standalone-flow.md.
deviceBindingId-based linking (Sumsub is migrating to it) is the exception: mint the token with adeviceBindingId, pass the same one tofingerprint(), and send it atapplicant.device.deviceBindingId. The default flow keys onsessionIdand needs none of that.
For pre-KYC, also add creationTrackingData.ip to the applicant if
you want Advanced IP verification, then request the applicant check to trigger
the DI analysis.
Stage 4 — Read the results
- Dashboard: Transactions and Travel Rule → Transactions, filter by type User platform event → open the row → device details + risk labels.
- Webhooks: subscribe to the transaction/event reviewed webhooks to gate programmatically (same signature-verification rules as the WebSDK skill — verify on raw bytes).
- Device risk labels + scoring are the same catalog as the WebSDK path:
references/standalone-flow.md. Full signal definitions are in thesumsub-integrate-dint-websdkskill'sreferences/device-signals.md(install that skill for the file).
Decide which device labels are blocking (refuse / step-up) vs informational (log) — that policy is yours.
Sandbox testing
- Sandbox has no real device signals; Fingerprint is simulated. Use the
simulationConfig(FpSimulationConf) option oninitto force specific signals for deterministic test outcomes. - Run the full loop in sandbox (token → fingerprint → confirm) and confirm a User platform event transaction appears in the dashboard.
Going live checklist
- Backend mints the behavior token (
/accessTokens/behavior), signing the body, with a unique per-sessionsessionId. - Token endpoint is auth-gated (only your authenticated context can mint).
- Frontend fails open — a Fisherman error never blocks login/signup.
- Unique
sessionIdper session in the behavior token — it's what correlates the captured device to the confirm call (no device fields needed in the body). - You confirm the event server-side (platform event / txn / applicant) so Sumsub actually runs the analysis — capturing alone produces no verdict.
- Results read from the dashboard / webhook, not from the browser.
- Production App Token + secret in the prod store; sandbox values stay in dev.
See also
sumsub-integrate-dint-websdk— DI when the page already embeds the Sumsub WebSDK widget.sumsub-integrate-websdk— the base KYC WebSDK embed (token signing, webhook patterns reused here).sumsub-api-auth— HMAC signing shared by every Sumsub skill.scripts/preflight.sh— workspace validator (run before Stage 1).references/standalone-flow.md— concepts, event types, result reading, pre-KYC and financial-txn variants.- Get started with Device Intelligence,
Generate access token,
@sumsub/fisherman— authoritative source if this skill drifts.
FAQ
What does the sumsub-integrate-dint-standalone skill do?
Add Sumsub Device Intelligence (the Fisherman JS module) to your own web pages where there is NO Sumsub verification widget — login, signup, password reset, 2FA, checkout, or any high-value action you want fraud-screened. TRIGGER when the user asks to "add device intelligence to login / signup", "fingerprint the device on a custom page", "use Fisherman standalone / self-hosted", "ongoing monitoring of platform events", "pre-KYC device check", "detect multi-accounting at signup", or "send a financial transaction with the captured device". Covers the whole loop — behavior access token, @sumsub/fisherman init + fingerprint, confirming the event (platform event / financial transaction / create-applicant), reading results, sandbox, go-live. SKIP when the page already embeds the Sumsub WebSDK — Device Intelligence rides along inside it, use sumsub-integrate-dint-websdk.
How do I install sumsub-integrate-dint-standalone?
Run npx skills add https://github.com/sumsub/agent-skills --skill sumsub-integrate-dint-standalone in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/sumsub-integrate-dint-standalone/ (personal) or .claude/skills/sumsub-integrate-dint-standalone/ (project).
Which AI agents can use sumsub-integrate-dint-standalone?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is sumsub-integrate-dint-standalone safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains sumsub-integrate-dint-standalone?
It is published by sumsub in sumsub/agent-skills. It has 980 recorded installs.
More from sumsub/agent-skills
sumsub-api-auth
sumsub/agent-skills
Authenticate to the Sumsub API with an App Token + secret key (HMAC-SHA256 request signing). TRIGGER when the user asks to "call / sign / authenticate Sumsub API requests", debugs 401 Unauthorized / signature errors against api.sumsub.com, or needs a working request example with X-App-Token / X-App-Access-Sig / X-App-Access-Ts headers. SKIP only when a more specific skill in this repo (questionnaire/level/workflow/POA-preset/generic) already covers the user's actual task — those skills sign requests the same way and only need this one for auth deep dives.
sumsub-api-generic
sumsub/agent-skills
Catch-all fallback for any Sumsub API task that does NOT match a more specific skill (e.g. create-sumsub-level, sumsub-create-questionnaire, sumsub-api-auth). TRIGGER when the user wants to call, inspect, or debug a Sumsub API endpoint not otherwise covered — fetching applicants, listing levels, reviewing AML hits, exporting data, generating SDK tokens, anything against api.sumsub.com. The procedure — locate the right endpoint in the OpenAPI schema, read its request/response shape, build the payload, sign with App Token, and validate. SKIP whenever a narrower Sumsub skill already covers the request.
sumsub-check-skills-version
sumsub/agent-skills
Verify that the locally installed Sumsub agent-skills package is compatible with the published version before doing any Sumsub work. TRIGGER at the start of any task that touches Sumsub — Sumsub Dev MCP tools (mcpSumsubDev), KYC/AML workflows, applicants, checks, transactions, verification levels, verification links, questionnaires, fraud network, VASP lists, or anything Sumsub-related — so the user is warned before a stale skills package produces wrong results. Also use this skill when the user explicitly asks "are my Sumsub skills up to date / current", "is there a newer version of the Sumsub skills", or similar. Skip the actual update (the user runs npx skills add sumsub/agent-skills --all themselves) and skip any other Sumsub API or entity task — those have their own skills.
sumsub-create-poa-preset
sumsub/agent-skills
Create or update a Sumsub Proof-of-Address (POA) preset. POST /resources/api/agent/poaStepSettings to create new, PATCH same path to update (id in body), GET /resources/api/agent/poaStepSettings/{id} to read one back. TRIGGER when the user asks to "create / add / build / configure / update / edit a POA preset" or "PoA step settings", configure which proof-of-address document types are accepted (utility bills, bank statements, tax bills, etc.), set validity periods per provider type, enable POI-as-POA (accept identity doc as proof of address), tune the cross-validator (name/address fuzzy match between POI and POA), or add per-country POA overrides. SKIP for attaching a preset to a level (set poaStepSettingsId on the level instead, via sumsub-create-level), or for non-POA presets (cross-check presets, permission presets, etc.).
sumsub-manage-webhooks
sumsub/agent-skills
Manage Sumsub clientWebhooks (event subscriptions for applicantReviewed / applicantPending / kytTxn / etc.) — reads via /resources/api/clientWebhooks, writes via /resources/api/agent/clientWebhooks. Sandbox only — production webhooks must be created by a human directly in the Sumsub dashboard. TRIGGER when the user asks to "list / retrieve / show webhooks", "create / add / register a webhook", or "update / edit / change a webhook target / event list / secret / signature algorithm" against their sandbox tenant. SKIP for production webhook setup (refer the user to the dashboard), for unrelated webhook surfaces (Stripe / videoIdent / Fireblocks / NFC / partner-specific receive paths under /resources/webhooks/...), for testing one-off delivery (use the inspectionCallbacks/testWebhook endpoint directly), and for KYT-only webhook routing (that's managed in the Sumsub dashboard's KYT section). The public API does not expose delete or per-webhook delivery stats — for those, refer
sumsub-integrate-websdk
sumsub/agent-skills
End-to-end recipe for adding Sumsub KYC to a website or web app via the Sumsub WebSDK. TRIGGER when the user asks to "integrate / embed / add Sumsub", "show the KYC widget", "add WebSDK", "verify users with Sumsub on the frontend", supplies an existing levelName they want to plug into a page, or asks how to wire up access tokens / lifecycle events / webhooks for Sumsub verification in an arbitrary project. Covers the whole loop — level setup, server-side access-token signing, snsWebSdk init (vanilla canonical, React recipe), client lifecycle events, token refresh, source-of-truth via webhooks + applicant GET, sandbox testing, go-live checklist. SKIP for building the level/questionnaire/POA-preset payload itself (use the sibling skills), or for backend-only API calls with no frontend (use sumsub-api-generic).
Popular business & finance skills
sales-enablement
coreyhaines31/marketingskills
When the user wants to create sales collateral, pitch decks, one-pagers, objection handling docs, or demo scripts. Also use when the user mentions 'sales deck,' 'pitch deck,' 'one-pager,' 'leave-behind,' 'objection handling,' 'deal-specific ROI analysis,' 'demo script,' 'talk track,' 'sales playbook,' 'proposal template,' 'buyer persona card,' 'battle card,' 'battlecard,' 'competitive one-pager,' 'win-loss analysis,' 'why are we losing deals,' 'loss reasons,' 'how do I respond to this objection,' 'prospect just said,' 'help my sales team,' 'sales materials,' or 'what should I give my sales reps,' 'cold call script,' or 'voicemail script.' Use this for any document or asset that helps a sales team close deals. For public competitor comparison pages, see competitors. For running buyer interviews or churn research, see customer-research. For marketing website copy, see copywriting. For cold outreach emails, see cold-email. For the offer being sold (bonuses, guarantees, pricing structure),
revops
coreyhaines31/marketingskills
When the user wants help with revenue operations, lead lifecycle management, or marketing-to-sales handoff processes. Also use when the user mentions 'RevOps,' 'revenue operations,' 'lead scoring,' 'outbound pipeline stages,' 'lead routing,' 'MQL,' 'SQL,' 'pipeline stages,' 'deal desk,' 'CRM automation,' 'marketing-to-sales handoff,' 'data hygiene,' 'leads aren't getting to sales,' 'pipeline management,' 'lead qualification,' or 'when should marketing hand off to sales.' Use this for anything involving the systems and processes that connect marketing to revenue. For cold outreach emails, see cold-email. For email drip campaigns, see emails. For pricing decisions, see pricing.
sales-funnel-blueprint
autonnel/autonnel-skills
Turn an offer into a concrete multi-step sales funnel spec - page-by-page structure, price ladder, copy outline and the metrics each step must hit. Use when asked to build a sales funnel, marketing funnel, landing page flow, lead magnet funnel, webinar funnel, tripwire or VSL funnel, when planning a product launch page flow, or when someone asks "what pages do I need" for selling something online.
pricing
coreyhaines31/marketingskills
When the user wants help with pricing decisions, packaging, or monetization strategy. Also use when the user mentions 'pricing,' 'pricing tiers,' 'freemium,' 'free trial,' 'packaging,' 'price increase,' 'value metric,' 'Van Westendorp,' 'willingness to pay,' 'monetization,' 'how much should I charge,' 'my pricing is wrong,' 'pricing page,' 'annual vs monthly,' 'per seat pricing,' 'should I offer a free plan,' 'pricing page teardown,' 'pricing page audit,' 'is my pricing page AI-readable,' or 'can AI read my pricing.' Use this whenever someone is figuring out what to charge, how to structure their plans, or wants to audit a pricing page (for humans and for the AI agents that shortlist tools). For in-app upgrade screens, see paywalls. For offer construction (bonuses, guarantees, value framing, naming) on services/courses/coaching/high-ticket B2B, see offers.
cross-border-ecommerce
nexscope-ai/ecommerce-skills
Cross-border e-commerce expansion advisor. Scores target markets on 8 weighted dimensions (market size, ecommerce penetration, competition, regulatory complexity, logistics infrastructure, payment ecosystem, cultural distance, IP protection), compares 5 fulfillment models with cost and transit data, provides country-by-country tax/duty compliance guides (EU VAT/IOSS, UK VAT, US sales tax, CA GST, AU GST, JP consumption tax), maps local payment preferences by market, and builds a phased expansion roadmap. No API key required.
pricing-strategy
coreyhaines31/marketingskills
When the user wants help with pricing decisions, packaging, or monetization strategy. Also use when the user mentions 'pricing,' 'pricing tiers,' 'freemium,' 'free trial,' 'packaging,' 'price increase,' 'value metric,' 'Van Westendorp,' 'willingness to pay,' 'monetization,' 'how much should I charge,' 'my pricing is wrong,' 'pricing page,' 'annual vs monthly,' 'per seat pricing,' or 'should I offer a free plan.' Use this whenever someone is figuring out what to charge or how to structure their plans. For in-app upgrade screens, see paywall-upgrade-cro.