projectdiscovery/subfinder · error

encountered error: ; note: if you get a 'limit has been…

Error message

encountered error: %v; note: if you get a 'limit has been reached' error, head over to https://devportal.redhuntlabs.com

What it means

RedHunt Labs' asset-search API GET failed at the transport level; the source wraps the underlying error and points users at the devportal because the most common root cause is an exhausted API limit rather than a pure network fault. Enumeration for this source stops.

Solutions

  1. Register/renew your key at https://devportal.redhuntlabs.com and check its quota
  2. Verify the provider config entry is host:port:key with all three parts correct
  3. Read the wrapped %v error — connection-refused/timeouts indicate network or wrong host:port
  4. Test connectivity to the API host directly (curl with the same X-BLOBR-KEY header)
  5. Check proxy env vars (HTTP_PROXY/HTTPS_PROXY) aren't blocking the request
Defensive patterns

Strategy: validation

Validate before calling

parts := strings.Split(providerEntry, ":")
if len(parts) != 3 { return errors.New("redhuntlabs entry must be host:port:key") }
if parts[2] == "" { return errors.New("X-BLOBR-KEY missing") }

Try / catch

resp, err := session.Get(ctx, getUrl, "", requestHeaders)
if err != nil {
	var nerr net.Error
	if errors.As(err, &nerr) && nerr.Timeout() { return retryWithBackoff(3) }
	return fmt.Errorf("check key/quota at devportal.redhuntlabs.com: %w", err)
}

Prevention

When it happens

Trigger: session.Get(ctx, getUrl, ...) returns an error on the first (page=1) request to the RedHunt Labs endpoint — DNS failure, TLS error, connection refused/reset, or proxy interference with the X-BLOBR-KEY authenticated request.

Common situations: Free RedHunt Labs devportal key that has hit its request limit (transport-level rejection); missing or malformed host:port:key entry in provider config; corporate proxy blocking the API host.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of projectdiscovery/subfinder@7a0b91f0fa (2026-09-06). Data as JSON: /api/errors/fcdb29da5e664e8d. Report an issue: GitHub.

Appendix: source

Thrown at pkg/subscraping/sources/redhuntlabs/redhuntlabs.go:68

			return
		}

		// Honor an optional per-source result limit (0 = no limit) so a single
		// domain can't drain an API quota by paginating to the end.
		maxResults := session.MaxResults

		randomApiInfo := strings.Split(randomApiKey, ":")
		if len(randomApiInfo) != 3 {
			s.skipped = true
			return
		}
		baseUrl := randomApiInfo[0] + ":" + randomApiInfo[1]
		requestHeaders := map[string]string{"X-BLOBR-KEY": randomApiInfo[2], "User-Agent": "subfinder"}
		getUrl := fmt.Sprintf("%s?domain=%s&page=1&page_size=%d", baseUrl, domain, pageSize)
		s.requests++
		resp, err := session.Get(ctx, getUrl, "", requestHeaders)
		if err != nil {
			results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: fmt.Errorf("encountered error: %v; note: if you get a 'limit has been reached' error, head over to https://devportal.redhuntlabs.com", err)}
			session.DiscardHTTPResponse(resp)
			s.errors++
			return
		}
		var response Response
		err = jsoniter.NewDecoder(resp.Body).Decode(&response)
		if err != nil {
			results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: err}
			session.DiscardHTTPResponse(resp)
			s.errors++
			return
		}

		session.DiscardHTTPResponse(resp)
		if response.Metadata.ResultCount > pageSize {
			totalPages := (response.Metadata.ResultCount + pageSize - 1) / pageSize
			for page := 1; page <= totalPages; page++ {
				select {

View on GitHub (pinned to 7a0b91f0fa)