Skip to main content
Plans: Every plan. Refused with 402 while the workspace is read-only. Who: anyone with an API token for the product family; owners and admins create tokens.
POST /api/v1/vex stores one VEX document for the product family the token belongs to, binds its statements to the family’s components and matches the family again. It takes the same CI upload token as POST /api/v1/sboms. Send the same file again and Pharus answers with the document it already has, so retries are safe. What Pharus does with the statements is on VEX from other tools.

Example

To send Dependency-Track’s analysis with its justifications, export the project’s VDR:
Trivy and Grype findings travel inside a CycloneDX SBOM. Send that SBOM to /api/v1/sboms as usual: Pharus keeps its vulnerabilities as the SBOM’s VEX document.

Headers

The query parameter version works when there is no X-Pharus-Version header.

Body

The raw VEX document, plain or compressed. Not a multipart form, and not wrapped in another JSON object.
  • OpenVEX, such as govulncheck’s -format openvex output.
  • CSAF 2.0 VEX.
  • CycloneDX JSON 1.4–1.7 with a vulnerabilities section: a VEX document, Dependency-Track’s VDR, or Trivy and Grype output.
  • At most 4 MB as sent, 50 MB decompressed, and 50 000 statements.
A later document from the same tool for the same version replaces the earlier one. See how statements bind.

Responses

202 Accepted

A new document was stored. Matching runs after the response.

200 OK

The family already has a document with exactly these bytes. Nothing new was stored, replaced is 0, and duplicate is true.

Errors

Errors return { "error", "message" }, sometimes with detail. See the error format.

VEX from other tools

Upload an SBOM

Dependency-Track

API introduction