Observations

Reference for package observations, the traffic-derived inventory of which package versions are in use.

An observation is one package version the firewall has served, with when and how often. Together they are a usage inventory derived from real traffic: not what manifests declare, but what builds actually fetched. For how observations relate to logs and metrics, see Observability.

Endpoint

GET /v1/<namespace-id>/observations
ParameterDescription
firewallLimit to one firewall
ecosystemLimit to one ecosystem, such as npm or oci
searchLimit to package names containing this text
newRiskstrue for only the versions with new risks in the last 7 days. Default false
sortpackageName, version, ecosystem, firewall, firstSeen, lastSeen, or count. Prefix with - for descending. Default -lastSeen
periodtoday (default), 7d, 30d, or 90d, by last-seen time
pageSizeRows per page. Default 50, maximum 500
pageTokenCursor from the previous response's nextPageToken

Reading observations requires only namespace access.

CLI

The same inventory from the terminal, as a table or as JSON. Without --period it covers today only, so widen the window for a review.

bsfw observations --period 30d --firewall <firewall-id>
bsfw observations --ecosystem npm -o json

Page through with --page-size and --page-token; the CLI prints the token to pass next when more rows are available. Flag-level detail: CLI reference.

Response shape

{
  "observations": [
    {
      "firewall": "3e7f5cb806f26e3beae2",
      "ecosystem": "npm",
      "packageName": "lodash",
      "version": "4.17.21",
      "internal": false,
      "firstSeen": "2026-05-12T08:03:11Z",
      "lastSeen": "2026-07-03T07:41:56Z",
      "count": 412,
      "vulnerabilities": { "total": 0, "critical": 0, "high": 0, "moderate": 0, "low": 0, "noRisk": 0, "unknown": 0 },
      "monitored": true
    }
  ],
  "nextPageToken": "",
  "total": 1,
  "ecosystems": ["npm"]
}

Fields

FieldTypeDescription
firewallstringFirewall that served the package
ecosystemstringPackage ecosystem
packageNamestringPackage name
versionstringExact version observed
internalbooleanWhether it was served from an internal upstream
firstSeenstringFirst request for this version
lastSeenstringMost recent request
countnumberRequests for this version in the period
vulnerabilitiesobjectSeverity summary from current advisory data, see below
knownExploitedbooleanWhen set: a known-exploited catalog lists one of the version's vulnerabilities
malwarebooleanWhen set: the version is reported as known malware. Also absent when the malware lookup did not answer in time
monitoredbooleanWhether the version is monitored daily. Absent when this is unknown
newRisksarrayWhen set: findings that changed in the last 7 days, see risk monitoring
manifestDigeststringContainer images only. The digest of the exact image that was served, since a tag can move and a multi-platform tag names several images
platformstringContainer images only. The platform served from a multi-platform image, such as linux/amd64
imageScanstringContainer images only. scanned, or not_scanned when nobody has scanned the image yet, in which case an empty summary does not mean no vulnerabilities

The response also carries nextPageToken, total (rows matching the filters across all pages), and ecosystems (the ecosystems that have observations under the other filters).

Vulnerability summary

Observations are enriched with the current known vulnerabilities for each package version, bucketed by CVSS score:

BucketScore
critical9.0 and above
high7.0 to 8.9
moderate4.0 to 6.9
low0.1 to 3.9
noRiskbelow 0.1
unknownno score at all

How the score is chosen per vulnerability, including the fallback from severity labels to scores, is described under CVSS score on the advisory sources page. A vulnerability with neither is counted as unknown, not at either end of the scale.

For a container image, the summary counts the vulnerabilities in the OS packages installed in the image, the same counts the image's page in the dashboard shows.

The summary reflects advisory data at query time, not at observation time; a version observed in May shows the vulnerabilities known today. That is the useful direction: "what do we currently depend on that is now known-vulnerable" is answered by this summary. To be told when it changes, see risk monitoring.

Risk monitoring

Once a day, the firewall looks up every package version served in the namespace in the last 30 days, across all firewalls, in the latest advisory and malware data. The lookup is by name and version; the package is not downloaded or unpacked again. The firewall records what changed since the previous day. Internal packages and container images are not monitored.

A version's first check is a baseline: it runs shortly after the version is first served and records what is already known without reporting it. A version that drops out of the 30-day window is no longer monitored, and gets a new baseline if it is served again.

Each later check reports a finding in newRisks when one of these changes happens. A change stays in newRisks for 7 days.

changes valueMeaning
newA vulnerability or malware report that was not there before
escalated_criticalA vulnerability's severity rose to critical
known_exploitedA vulnerability was added to a known-exploited catalog
epss_highA vulnerability moved into the 5% most likely to be exploited: its EPSS percentile reached 0.95

Each entry in newRisks:

FieldTypeDescription
kindstringvulnerability or malware
findingIdstringVulnerability ID, or malware report ID
changesarrayOne or more of the values above
severitystringWhen set: severity bucket, vulnerabilities only
summarystringWhen set: short description of the finding
detectedAtstringWhen the most recent change was detected

The same findings are sent as a summary email and as observation.risk.detected webhook events. Setup: Get risk alerts after download.