{"record":{"id":"692bbe2c375ad4a6","repo":"projectdiscovery/nuclei","slug":"interactsh-client-not-initialized","errorCode":null,"errorMessage":"interactsh client not initialized","messagePattern":"interactsh client not initialized","errorType":"error_code","errorClass":"ErrInteractshClientNotInitialized","httpStatus":null,"severity":"warning","filePath":"pkg/protocols/common/interactsh/const.go","lineNumber":11,"sourceCode":"package interactsh\n\nimport (\n\t\"errors\"\n\t\"time\"\n)\n\nvar (\n\tdefaultInteractionDuration = 60 * time.Second\n\n\tErrInteractshClientNotInitialized = errors.New(\"interactsh client not initialized\")\n)\n\nconst (\n\tstopAtFirstMatchAttribute   = \"stop-at-first-match\"\n\ttemplateIdAttribute         = \"template-id\"\n\tdefaultMaxInteractionsCount = 5000\n)\n","sourceCodeStart":1,"sourceCodeEnd":19,"githubUrl":"https://github.com/projectdiscovery/nuclei/blob/265b3a3dec374741614e342f813c10f8b38d2bb7/pkg/protocols/common/interactsh/const.go#L1-L19","documentation":"Sentinel error from the interactsh (out-of-band) client wrapper. Three paths return it: poll() when options.NoInteractsh is set (interactsh deliberately disabled, interactsh.go:81); Client.URL() when first-time initialization via poll() failed, wrapping the underlying cause with errkit (interactsh.go:248); and URL() again if the client is still nil after initialization (interactsh.go:252). Practically: an OOB URL was requested while interactsh is off or its server could not be reached.","triggerScenarios":"A template using {{interactsh-url}} executed with -no-interactsh; an unreachable/self-hosted interactsh server or invalid authorization token causing client.New to fail inside poll(); calling URL() before a successful poll completes.","commonSituations":"Air-gapped runs where OOB detection must be disabled; corporate egress blocking oast.fun; expired or wrong Interactsh server token; forgetting that -no-interactsh silently breaks every OOB template.","solutions":["Remove -no-interactsh / clear Options.NoInteractsh when templates need OOB callbacks","Verify the interactsh server URL is reachable and the authorization token is valid","Point -interactsh-server at a reachable/self-hosted instance if the default is blocked","Check errors.Is/errkit unwrap on the wrapped form to distinguish 'disabled' from 'init failed'"],"exampleFix":"# before: run with -no-interactsh on a template containing {{interactsh-url}}\n# after: run without -no-interactsh (or drop the OOB matcher set)","handlingStrategy":"try-catch","validationCode":"if interactshOpts.NoInteractsh && templateUsesOOB(tmpl) {\n    return errors.New(\"template needs interactsh; remove -no-interactsh\")\n}","typeGuard":"func isInteractshUnavailable(err error) bool {\n    return errkit.Is(err, interactsh.ErrInteractshClientNotInitialized) || errors.Is(err, interactsh.ErrInteractshClientNotInitialized)\n}","tryCatchPattern":"url, err := client.URL()\nif err != nil {\n    if isInteractshUnavailable(err) { // disabled or server init failed\n        url = \"\" // template should degrade or be skipped\n    }\n}","preventionTips":["Gate OOB templates on interactsh being enabled and reachable","Health-check the interactsh server at scan start","Remember URL() wraps the root cause via errkit; unwrap before reporting"],"tags":["interactsh","oob","callback","configuration"],"backgroundTag":null,"analyzedSha":"265b3a3dec374741614e342f813c10f8b38d2bb7","analyzedAt":"2026-08-15T20:05:51.855Z","schemaVersion":2},"datasetVersion":"2026-08-16T03:17:38.424Z"}