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

  1. Check that a valid Reconeer API key is configured in your subfinder provider settings
  2. Capture the response body (the current code discards it) to see the API's own error detail
  3. Wait/retry if the code is 429 or 5xx; check Reconeer status
  4. 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

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)