{"record":{"id":"80c2bf2cb65953fa","repo":"projectdiscovery/nuclei","slug":"js-must-be-at-least-1","errorCode":null,"errorMessage":"js must be at least 1","messagePattern":"js must be at least 1","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lib/config.go","lineNumber":145,"sourceCode":"\n// WithConcurrency sets concurrency options\nfunc WithConcurrency(opts Concurrency) NucleiSDKOptions {\n\treturn func(e *NucleiEngine) error {\n\t\t// minimum required is 1\n\t\tif opts.TemplateConcurrency <= 0 {\n\t\t\treturn errors.New(\"template threads must be at least 1\")\n\t\t}\n\t\tif opts.HostConcurrency <= 0 {\n\t\t\treturn errors.New(\"host concurrency must be at least 1\")\n\t\t}\n\t\tif opts.HeadlessHostConcurrency <= 0 {\n\t\t\treturn errors.New(\"headless host concurrency must be at least 1\")\n\t\t}\n\t\tif opts.HeadlessTemplateConcurrency <= 0 {\n\t\t\treturn errors.New(\"headless template threads must be at least 1\")\n\t\t}\n\t\tif opts.JavascriptTemplateConcurrency <= 0 {\n\t\t\treturn errors.New(\"js must be at least 1\")\n\t\t}\n\t\tif opts.TemplatePayloadConcurrency <= 0 {\n\t\t\treturn errors.New(\"payload concurrency must be at least 1\")\n\t\t}\n\t\tif opts.ProbeConcurrency <= 0 {\n\t\t\treturn errors.New(\"probe concurrency must be at least 1\")\n\t\t}\n\t\te.opts.TemplateThreads = opts.TemplateConcurrency\n\t\te.opts.BulkSize = opts.HostConcurrency\n\t\te.opts.HeadlessBulkSize = opts.HeadlessHostConcurrency\n\t\te.opts.HeadlessTemplateThreads = opts.HeadlessTemplateConcurrency\n\t\te.opts.JsConcurrency = opts.JavascriptTemplateConcurrency\n\t\te.opts.PayloadConcurrency = opts.TemplatePayloadConcurrency\n\t\te.opts.ProbeConcurrency = opts.ProbeConcurrency\n\t\treturn nil\n\t}\n}\n","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/projectdiscovery/nuclei/blob/265b3a3dec374741614e342f813c10f8b38d2bb7/lib/config.go#L127-L163","documentation":"Headless actions resolve each argument via getActionArg, which first runs ReplaceInteractshMarkers so OOB markers inside arguments get real URLs. If the interactsh client cannot allocate a URL, the failure is wrapped with the argument name - same root cause as the render-layer marker error, but surfaced per headless action argument.","triggerScenarios":"A headless action argument embedding an interactsh marker (e.g. a navigate URL containing {{interactsh-url}}) while the OAST server is unreachable or the client is stopped.","commonSituations":"Egress-filtered environments blocking the OAST domain; self-hosted interactsh down; headless templates relying on out-of-band callbacks.","solutions":["Check OAST server reachability from the scanning host and retry","Point -interactsh-server at a healthy or self-hosted instance","Remove the OOB marker from the headless argument if it is not required, or run with -no-interactsh"],"exampleFix":"# before\nnuclei -t headless.yaml   # default OAST endpoint failing\n# after\nnuclei -t headless.yaml -interactsh-server https://oast.mycorp.com","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"val, err := getActionArg(action, \"to\")\nif err != nil && strings.Contains(err.Error(), \"could not replace interactsh marker\") {\n    // OAST allocation failure inside a headless argument: retry once\n    time.Sleep(2 * time.Second)\n    val, err = getActionArg(action, \"to\")\n}\nif err != nil {\n    return err\n}","preventionTips":["Health-check the OAST server before headless scans","Self-host interactsh for reliability","Remove OOB markers from headless arguments when not required"],"tags":["headless","interactsh","oast","browser"],"backgroundTag":null,"analyzedSha":"265b3a3dec374741614e342f813c10f8b38d2bb7","analyzedAt":"2026-08-15T20:05:51.855Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}