📎 Unreleased docs. This is the next version (from main), features here may change or not be in a release yet.See the latest release →

Scanners

virustotal

On this page

Reads what VirusTotal's engines currently say about a host's domain.

Opt-in. The threats control runs urlhaus by default; this one runs only when you name it. That is deliberate. See What is sent.

config:
  controls:
    threats:
      enabled: true
      virustotal:
        enabled: true          # urlhaus keeps running beside it

What it does

One HTTPS GET per distinct host to https://www.virustotal.com/api/v3/domains/{domain}, and reads the tally across VirusTotal's ~70 engines.

FindingLevelWhen
virustotal/maliciouserrortwo or more engines call the domain malicious
virustotal/suspiciouswarningexactly one calls it malicious, or any call it suspicious

Two engines, not one. A single detection on a legitimate domain is routine, newly registered names, shared hosting, anything a heuristic dislikes. Failing a build on one engine's opinion is how a control gets switched off, so one detection is reported and does not gate. Two independent engines agreeing is a different claim.

A domain VirusTotal has never seen produces no findings, and the provenance line says so.

What is sent

Leaves your machinethe host's domain name, and nothing else, no path, no URL, no content, no credential
Who receives itVirusTotal, a Google service
EndpointGET /domains/{domain} only
Frequencyonce per distinct hostname per scan

Domain reports, and nothing else. This is the safety property the scanner rests on. VirusTotal's key page conditions API use on "the sharing of your Sample submissions with the security community", and their How it works page says reports are "shared with the public VirusTotal community" and that contents of submitted files or pages "may also be shared with premium VirusTotal customers".

That language is about submissions: files and URLs sent for analysis. A domain report is a lookup of an aggregate VirusTotal already maintains. There is no submitting a domain. So this scanner has exactly one endpoint, uses GET, and never touches /urls or any endpoint that accepts content. A test asserts it has not grown another.

Measured before relying on it: a domain VirusTotal has never seen returns 404, and still 404 seventy seconds later, the lookup creates no record.

Honest limit. That is observed behavior, not a written guarantee. VirusTotal's documentation does not distinguish a lookup from a submission anywhere, so what protects you here is how the API behaves rather than something they have committed to. If that distinction matters to you more than the signal is worth, use urlhaus alone, which is why this scanner is opt-in.

Credentials

VIRUSTOTAL_API_KEY, read from the environment. Free from https://www.virustotal.com/gui/my-apikey.

Never from a descriptor: VirusTotal asks that keys not be embedded "in scripts or software from which it can be easily retrieved". The HTTP error path reports the status line only and never the response body, because an authentication failure can echo the key back and that string reaches the terminal and the report.

Rate limiting

The public API allows 4 requests a minute, and Draugr spaces its calls to match without any configuration.

The waiting happens before a concurrency slot is taken, so a scan of ten hosts does not idle workers that other controls could be using. One scanner's limit is not the run's. There is no need to lower --jobs.

With a paid key, raise it:

config:
  controls:
    threats:
      virustotal:
        requestsPerMinute: 1000

Only to what your key actually permits. Their stated penalty for terms violations is a permanent ban of the individual or organization.

License and terms of use

Free for non-commercial use. VirusTotal's API overview states "The API must not be used in commercial products or services"; commercial use needs a paid agreement with them.

Whose key it is decides whose obligation this is, Draugr calls a documented API over HTTPS with a credential you supply, and bundles nothing. Read their terms before enabling this at work.

Note that Google's Cloud terms and the SecOps Privacy Notice, which VirusTotal's documentation links to, scope themselves to purchased Google Cloud services. The privacy notice says it "does not apply to any other Google services". They do not govern a free public API key.

Data

Nothing fetched ahead of a scan. VirusTotal is queried per target, so the traffic is about the target rather than a database to warm, and it is declared as a disclosure effect instead.