projectdiscovery/subfinder · error
request failed with status
Error message
request failed with status %d
What it means
HTTP status check in the Reconeer passive source (Run): the request to https://www.reconeer.com/api/domain/<domain> completed but returned a status other than 200. The failing status code is interpolated into the message and the source's enumeration for that domain is aborted with an error result; typical causes are an invalid X-API-KEY, rate limiting, or the domain not being processable by the service.
Solutions
- Check that a valid Reconeer API key is configured in your subfinder provider settings
- Capture the response body (the current code discards it) to see the API's own error detail
- Wait/retry if the code is 429 or 5xx; check Reconeer status
- Update subfinder in case the Reconeer endpoint changed
Defensive patterns
Strategy: retry
Validate before calling
if reconeerApiKey == "" { return errors.New("reconeer API key missing") } Try / catch
if resp.StatusCode == http.StatusTooManyRequests {
time.Sleep(backoff); retry()
} else if resp.StatusCode >= 500 {
retryWithBackoff(3)
} else {
// 4xx: fix key/config, do not retry
} Prevention
- Configure a valid Reconeer key before runs
- Back off on 429/5xx instead of failing fast
- Log response bodies for non-200 to get the API's detail
- Keep subfinder updated for endpoint changes
When it happens
Trigger: The GET request to reconeer.com's domain-search endpoint returns a status other than 200 — 401/403 bad or missing API key, 402/429 quota limits, 5xx server errors.
Common situations: Missing Reconeer API key in provider config; exhausted free-tier quota; Reconeer service outage or endpoint path change after an API version bump.
Related errors
AI-assisted analysis of projectdiscovery/subfinder@7a0b91f0fa (2026-09-06).
Data as JSON: /api/errors/e3bcb166b769de9e.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/subscraping/sources/reconeer/reconeer.go:60
"Accept": "application/json",
}
randomApiKey := subscraping.PickRandom(s.apiKeys, s.Name())
if randomApiKey != "" {
headers["X-API-KEY"] = randomApiKey
}
apiURL := fmt.Sprintf("https://www.reconeer.com/api/domain/%s", domain)
s.requests++
resp, err := session.Get(ctx, apiURL, "", headers)
if err != nil {
results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: err}
s.errors++
return
}
defer session.DiscardHTTPResponse(resp)
if resp.StatusCode != 200 {
results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: fmt.Errorf("request failed with status %d", resp.StatusCode)}
s.errors++
return
}
var responseData response
decoder := json.NewDecoder(resp.Body)
err = decoder.Decode(&responseData)
if err != nil {
results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: err}
s.errors++
return
}
for _, result := range responseData.Subdomains {
select {
case <-ctx.Done():
return
case results <- subscraping.Result{Source: s.Name(), Type: subscraping.Subdomain, Value: result.Subdomain}:
s.results++
}View on GitHub (pinned to 7a0b91f0fa)