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
- Configure a valid C99 API key in the subfinder provider config
- Top up / verify your C99 account balance
- Read the wrapped message for the provider's specific cause
- 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
- Configure a valid C99 API key with sufficient balance
- Handle Error-type results without aborting the scan
- Exclude failing sources when needed
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 resultsView on GitHub (pinned to 7a0b91f0fa)