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

  1. Remove -no-interactsh / clear Options.NoInteractsh when templates need OOB callbacks
  2. Verify the interactsh server URL is reachable and the authorization token is valid
  3. Point -interactsh-server at a reachable/self-hosted instance if the default is blocked
  4. 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

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


AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15). Data as JSON: /api/errors/692bbe2c375ad4a6. Report an issue: GitHub.