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
- Register/renew your key at https://devportal.redhuntlabs.com and check its quota
- Verify the provider config entry is host:port:key with all three parts correct
- Read the wrapped %v error — connection-refused/timeouts indicate network or wrong host:port
- Test connectivity to the API host directly (curl with the same X-BLOBR-KEY header)
- 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
- Register a valid key at devportal.redhuntlabs.com and track its quota
- Format provider config strictly as host:port:key
- Verify proxy settings don't block the API host
- Retry on timeouts, fix config on connection-refused
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
- unexpected status code
- %s
- request failed with status
- request failed with status
- error reading response body
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)