projectdiscovery/subfinder · error

%s

Error message

%s

What it means

Quake 360's API wraps results in a response envelope with a Code field; Code != 0 signals an API-level failure and the source surfaces the API's Message verbatim. Common messages cover invalid API keys, quota exhaustion, and malformed queries.

Solutions

  1. Read the surfaced response.Message for the exact API reason
  2. Verify the Quake API key in your provider config and regenerate it if needed
  3. Check remaining Quake quota/credits on your 360 account; top up or wait for reset
  4. Confirm your Quake account has access to the search service tier used
Defensive patterns

Strategy: validation

Validate before calling

if quakeApiKey == "" { return errors.New("quake API key required") }

Try / catch

// response.Code != 0 carries the API message — branch on known messages
if strings.Contains(msg, "quota") || strings.Contains(msg, "limit") {
	// wait/top up credits
} else if strings.Contains(msg, "key") || strings.Contains(msg, "auth") {
	// fix API key in config
}

Prevention

When it happens

Trigger: A successful HTTP call to Quake's search API whose decoded response.Code is non-zero — invalid/expired Quake API key, insufficient quota/credits, or an invalid query payload.

Common situations: Unpaid/limited Quake 360 account out of monthly query credits; wrong API key in provider config; query service changes on Quake's side.

Related errors


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

Appendix: source

Thrown at pkg/subscraping/sources/quake/quake.go:101

				results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: err}
				s.errors++
				session.DiscardHTTPResponse(resp)
				return
			}

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

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

			if totalResults == -1 {
				totalResults = response.Meta.Pagination.Total
			}

			for _, quakeDomain := range response.Data {
				select {
				case <-ctx.Done():
					return
				default:
				}
				subdomain := quakeDomain.Service.HTTP.Host
				if strings.ContainsAny(subdomain, "暂无权限") {
					continue

View on GitHub (pinned to 7a0b91f0fa)