projectdiscovery/nuclei · warning · ErrInteractshClientNotInitialized
interactsh client not initialized
Error message
interactsh client not initialized
What it means
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.
Source
Thrown at pkg/protocols/common/interactsh/const.go:11
package interactsh
import (
"errors"
"time"
)
var (
defaultInteractionDuration = 60 * time.Second
ErrInteractshClientNotInitialized = errors.New("interactsh client not initialized")
)
const (
stopAtFirstMatchAttribute = "stop-at-first-match"
templateIdAttribute = "template-id"
defaultMaxInteractionsCount = 5000
)
View on GitHub (pinned to 265b3a3dec)
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'
Example fix
# before: run with -no-interactsh on a template containing {{interactsh-url}}
# after: run without -no-interactsh (or drop the OOB matcher set) Defensive patterns
Strategy: try-catch
Validate before calling
if interactshOpts.NoInteractsh && templateUsesOOB(tmpl) {
return errors.New("template needs interactsh; remove -no-interactsh")
} Type guard
func isInteractshUnavailable(err error) bool {
return errkit.Is(err, interactsh.ErrInteractshClientNotInitialized) || errors.Is(err, interactsh.ErrInteractshClientNotInitialized)
} Try / catch
url, err := client.URL()
if err != nil {
if isInteractshUnavailable(err) { // disabled or server init failed
url = "" // template should degrade or be skipped
}
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- headless mode (-headless) is required if -ho, -sb, -sc or -l
- both follow host redirects and follow redirects specified
- both follow redirects and disable redirects specified
- if a client certification option is provided, then all three
- js must be at least 1
AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15).
Data as JSON: /api/errors/692bbe2c375ad4a6.
Report an issue: GitHub.