Skip to content

Campaign scope and done criteria

Reference for the two versioned JSON documents a campaign carries, every scope filter and exclusion, which dimensions are recorded but not yet evaluated, and every done criterion.

Updated 02 Nov 2026Checked against vdb-site@1a06d67

A campaign carries two JSON documents, both at "version": 1. Unknown fields are kept as you sent them, so a dimension a newer console writes survives a round trip through an older server. A document that does not parse is 400 invalid scope document or 400 invalid done document. An empty scope is valid and means the whole organisation.

Scope

{
  "version": 1,
  "repos": ["acme/payments", "acme/ledger"],
  "category": "sca",
  "filters": { },
  "exclusions": { }
}
Key Meaning
repos Repository full names. For a repositories campaign they are the target; otherwise they narrow it. Each must resolve to a real repository.
category sca, sast, secrets, iac or license. Empty means every category.

Filters

All set filters must hold. Lists match any of their values.

Filter Keys
identity findingId, repoName, branchName, commitSha, source, category, packageName, packageVersion, packageEcosystem, purl, cpe, vendor, product (all lists)
weakness cwes, aliases, ruleKeys, cleanCodeCategories (lists)
impact minCvss, minCwss, minEpss, minEpssPercentile, minCess (numbers)
exploitAsserted kev, vulncheckKev, msrcExploited, ransomware (booleans)
exploitObserved any (boolean), sources (list)
reachability verdicts (list of reachability verdicts; UNREACHABLE is a valid choice), assessedOnly (boolean)
exposure internetExposed (boolean), audiences (list). See Internet exposure.
supplyChain malicious, squatted, abandoned, badActor (booleans), scorecardBelow (number)
attackChain attackPathIds, techniques, tactics (lists)
lifecycle eol, unmaintained (booleans)
licence expressions (list), violatesPolicy (boolean)

Exclusions

Key Excludes
testCode Findings in test code
devDeps Development dependencies
transitiveDeps Transitive dependencies
suppressed Findings covered by an active suppression
minConfidence Findings below this confidence (number)

Recorded but not evaluated yet

These dimensions are stored but not yet turned into a query. POST /v1/campaigns/preview lists any you used, so the console can say the count ignores them:

attackChain (any key), licence.violatesPolicy, supplyChain.scorecardBelow, exploitObserved.sources, weakness.cleanCodeCategories, weakness.ruleKeys.

Done criteria

{
  "version": 1,
  "join": "ALL",
  "criteria": [
    { "type": "gone-from-scans", "repos": ["acme/payments"], "category": "sca" },
    { "type": "safe-version" }
  ]
}

join is ALL (default: every criterion must hold) or ANY (one is enough). At least one criterion is required.

type Target kinds Done when
gone-from-scans vulnerabilities, repositories The newest scan of the item’s repository no longer reports it. The scan must be newer than the item’s admission. May name its own repos and category, so “gone from the SCA scans of these two repositories” is a different claim from “gone everywhere”.
safe-version vulnerabilities, repositories Gone from the latest scan and the package is at or above the fix version recorded at admission. A version that does not parse never satisfies it.
eol-supported vulnerabilities, repositories The installed version is on a supported cycle (mode: "supported") or is the latest upstream release (mode: "latest"). Any other mode is 400.
package-removed dependencies, repositories The dependency is not in the newest scan of its repository, which must be newer than admission
latest-version dependencies, repositories The dependency is at the newest version the EOL catalogue knows. A package with no EOL record stays open.
safe-version-used dependencies, repositories The installed version has no open vulnerability that has a fix available

A criterion not valid for the target kind is 400 criterion X is not valid for a <kind> campaign.

fix-verified is not selectable. It is recorded when the scanner itself marked a finding fixed and named the run, and it always closes the item.

Item identity

The cohort remembers what a finding is, not the finding row: rows are re-minted on every scan and purged by retention. A finding item’s key is f|<repo>|<category>|<package>|<findingId>; a dependency’s is d|<repo>|<dependencyKey>.

Edit this pageSources: vdb-site/api/internal/handler/campaign_spec.go, vdb-site/api/internal/handler/campaign_eval.go, vdb-site/api/internal/handler/campaign_scope.go
esc
↑ ↓ move↵ openSearches in your browser. A key like autonomy.max or a code like threshold_required jumps straight to it.