projectdiscovery/subfinder · error

%v

Error message

%v

What it means

The C99 source inspects response.Error from the C99 API; when non-empty it wraps that message verbatim with fmt.Errorf("%v", response.Error) and emits it as an error Result. It is a passthrough of C99's API-level error reporting.

Solutions

  1. Configure a valid C99 API key in the subfinder provider config
  2. Top up / verify your C99 account balance
  3. Read the wrapped message for the provider's specific cause
  4. Retry later or exclude the c99 source from enumeration
Defensive patterns

Strategy: try-catch

Try / catch

for result := range results {
    if result.Type == subscraping.Error {
        gologger.Warning().Msgf("c99: %v", result.Error)
        continue
    }
    // process result
}

Prevention

When it happens

Trigger: C99 API returns a payload whose 'error' field is non-empty — typically invalid API key, exhausted credits, or a request the API refuses.

Common situations: No C99 API key configured; C99 account out of balance; API rejecting queries for certain domains.

Related errors


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

Appendix: source

Thrown at pkg/subscraping/sources/c99/c99.go:81

		defer func() {
			if err := resp.Body.Close(); err != nil {
				results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: err}
				s.errors++
			}
		}()

		var response dnsdbLookupResponse
		err = jsoniter.NewDecoder(resp.Body).Decode(&response)
		if err != nil {
			results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: err}
			s.errors++
			return
		}

		if response.Error != "" {
			results <- subscraping.Result{
				Source: s.Name(), Type: subscraping.Error, Error: fmt.Errorf("%v", response.Error),
			}
			s.errors++
			return
		}

		for _, data := range response.Subdomains {
			if !strings.HasPrefix(data.Subdomain, ".") {
				select {
				case <-ctx.Done():
					return
				case results <- subscraping.Result{Source: s.Name(), Type: subscraping.Subdomain, Value: data.Subdomain}:
					s.results++
				}
			}
		}
	}()

	return results

View on GitHub (pinned to 7a0b91f0fa)