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

  1. Verify the BufferOver API key in the provider config file
  2. Check your BufferOver quota/billing status
  3. Read the joined error strings — they contain the provider's own explanation
  4. 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

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)