Loading...
Loading...
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", "update / edit / change a webhook target / event list / secret / signature algorithm", or "disable / re-enable a webhook" 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 the user to the Sumsub dashboard UI.
npx skill4agent add sumsub/agent-skills sumsub-manage-webhooksClientWebhook/resources/api/clientWebhooks/resources/api/agent/clientWebhooks| Verb | Path | Purpose |
|---|---|---|
| | List webhooks on the tenant. Returns |
| | Read one webhook by id. Use this to resolve a |
| | Create. Body must NOT include |
| | Update an existing webhook (by |
manageClientSettings/statssumsub-api-auth401 Invalid signature⚠️ Sandbox tokens only. Do not accept or use a production App Token here. If the user offers one, refuse and ask them to generate a sandbox pair at https://cockpit.sumsub.com/checkus/devSpace/appTokens (toggle the workspace to Sandbox first, then Create). Token + secret are shown once — copy both before closing the dialog. The helper script enforces this — it rejects tokens that don't start withunlesssbx:is set.SUMSUB_ALLOW_PROD=1
| Var | Example |
|---|---|
| |
| The paired secret shown once at token creation. |
| Optional. Defaults to |
SUMSUB_ALLOW_PROD=1manage_webhooks.shmanage_webhooks.sh list # GET all webhooks (table summary; capped at 50)
manage_webhooks.sh list --json # raw JSON of all webhooks
manage_webhooks.sh get <webhookId> # one webhook (filtered from the list)
manage_webhooks.sh create <spec.json> # POST without id (compact spec → ClientWebhook)
manage_webhooks.sh update <spec.json> # POST with id (spec MUST contain id)
manage_webhooks.sh disable <webhookId> # GET → flip disabled=true → POST
manage_webhooks.sh enable <webhookId> # GET → flip disabled=false → POSTcreateupdatebuild_webhook_payload.pytargethttp://localhost:3000/webhook127.0.0.10.0.0.0::1targetsbrew install ngrok/ngrok/ngrokngrok config add-authtoken <TOKEN>ngrok http <port>Forwarding https://<random>.ngrok-free.app -> http://localhost:<port>https://...ngrok-free.app/webhook/sumsubtargetcreatengrokupdateidtarget--domain=<your-subdomain>cloudflared tunnelcreateupdate# Identity (omit on create; required on update)
id: 698bfc... # id from a previous list / create response
# Display + addressing
name: "Production webhook" # required (no min length but the dashboard expects something)
description: "Sends KYC events to our backend"
target: "https://example.com/sumsub/webhook" # required — destination URL (or slack / email / telegram address depending on targetType)
targetType: http # http | email | slack | telegram (default: http)
# Subscription
types: # required — event-type strings (see "Event types" below)
- applicantReviewed
- applicantPending
- applicantOnHold
- applicantCreated
applicantType: individual # individual | company (omit to subscribe to both)
sourceKeys: [] # optional — restrict to specific source keys
# Auth + delivery
secretKey: "..." # HMAC secret used to sign payloads
signatureAlgorithm: HMAC_SHA256_HEX # HMAC_SHA1_HEX | HMAC_SHA256_HEX | HMAC_SHA512_HEX (default: SHA256)
headers: # optional extra HTTP headers added to each delivery
- { key: "X-Source", value: "sumsub" }
- { key: "Authorization", value: "Bearer ${MY_TOKEN}" } # caller substitutes before sending
# Lifecycle flags
disabled: false # default false; set true to pause without deleting
notResendFailedWebhooks: false # default false; true = no automatic retries on delivery failuretargetTypesignatureAlgorithmapplicantTypetypesheaderskeyvalueClientWebhookHeadertypes[]typesstring[]| Group | Event type | When it fires |
|---|---|---|
| Applicant lifecycle | | New applicant created |
| Pre-screen complete | |
| Submitted for review | |
| Final review answer (GREEN / RED) reached | |
| Review held / paused | |
| Applicant activated | |
| Applicant deactivated | |
| Verification reset (retry) | |
| Level reassigned | |
| Tags added/removed | |
| Personal info edited | |
| Applicant deleted | |
| GDPR personal-data erasure executed | |
| Action workflow | | Action-flow events |
| Workflow | | Workflow run finished (not |
| Video ident | | Live status update |
| Recording assembly finished | |
| KYT (applicant-scoped) | | Per-applicant transaction-monitoring events |
| KYT (case-scoped) | | KYT case-management events (note: it's |
| AML case | | AML-case disposition events |
| Travel Rule | | Travel-rule lifecycle events |
| KYB | | KYB ongoing-monitoring events |
listidnametargetdisabledtypes[]applicantTypesignatureAlgorithmcreatedAtgetsecretKeycreateupdateClientWebhookiddisableenabledisabledexamples/basic-http.jsonexamples/with-headers-and-restrictions.jsonsourceKeyexamples/legacy-sha1.jsonexamples/update-existing.jsonidreferences/webhook-schema.mdClientWebhook