projectdiscovery/subfinder · error
%s
Error message
%s
What it means
The BufferOver source checks the 'errors' array in the API response meta; if any errors are present, they are joined with commas and emitted as a single error Result via fmt.Errorf("%s", strings.Join(metaErrors, ", ")). This propagates BufferOver's own API error messages to the caller.
Solutions
- Verify the BufferOver API key in the provider config file
- Check your BufferOver quota/billing status
- Read the joined error strings — they contain the provider's own explanation
- Retry later or disable the bufferover source if it keeps failing
Defensive patterns
Strategy: try-catch
Try / catch
for result := range results {
if result.Type == subscraping.Error {
gologger.Warning().Msgf("bufferover: %v", result.Error)
continue
}
// process result
} Prevention
- Keep the BufferOver API key valid and funded
- Watch quota usage
- Filter/skip Error-type results per source
When it happens
Trigger: BufferOver API responds with bufforesponse.Meta.Errors non-empty — usually invalid API key, quota exhausted, or a malformed query rejected by the service.
Common situations: Missing or expired BufferOver API key in provider config; exceeding daily quota; service-side errors on certain domains.
Related errors
AI-assisted analysis of projectdiscovery/subfinder@7a0b91f0fa (2026-09-06).
Data as JSON: /api/errors/b4eac9788697dbd5.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/subscraping/sources/bufferover/bufferover.go:85
return
}
var bufforesponse response
err = jsoniter.NewDecoder(resp.Body).Decode(&bufforesponse)
if err != nil {
results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: err}
s.errors++
session.DiscardHTTPResponse(resp)
return
}
session.DiscardHTTPResponse(resp)
metaErrors := bufforesponse.Meta.Errors
if len(metaErrors) > 0 {
results <- subscraping.Result{
Source: s.Name(), Type: subscraping.Error, Error: fmt.Errorf("%s", strings.Join(metaErrors, ", ")),
}
s.errors++
return
}
var subdomains []string
if len(bufforesponse.FDNSA) > 0 {
subdomains = bufforesponse.FDNSA
subdomains = append(subdomains, bufforesponse.RDNS...)
} else if len(bufforesponse.Results) > 0 {
subdomains = bufforesponse.Results
}
for _, subdomain := range subdomains {
for _, value := range session.Extractor.Extract(subdomain) {
select {
case <-ctx.Done():View on GitHub (pinned to 7a0b91f0fa)