VEX Evidence Gateway Contract (draft v0.1)
This contract describes the forward Web V gateway surface for reading VEX (Vulnerability Exploitability eXchange) statements and their supporting evidence with tenant scoping, deterministic ordering, and export helpers for offline bundles.
Audience: API client integrators and SDK/UI authors consuming VEX evidence through the gateway.
Status: design draft — not yet implemented as gateway routes. The
/vex/statements*paths below are a forward Web V proxy contract. Today VEX statement/evidence/export reads are served by Excititor (StellaOps.Excititor.WebService, routed under the service’s own prefix) and by the Authority console (GET /console/vex/statements). All Excititor VEX routes — including export/mirror handlers — are guarded by thevex:readscope (ExcititorPolicies.VexRead); there is novex:exportscope in the canonical catalog (StellaOps.Auth.Abstractions/StellaOpsScopes.cs). VEX ingestion usesvex:ingestand provider/review administration usesvex.admin.
Security / headers
Authorization: Bearer <token>(orDPoPwhere configured)X-StellaOps-TenantId: <tenantId>(required; see Gateway Tenant Auth & ABAC Contract)X-StellaOps-Project: <projectId>(optional; legacy aliasX-Stella-Projectis accepted only when the gateway is started withEnableLegacyHeaders=true)X-StellaOps-TraceId: <traceId>(optional; clients SHOULD send one)- Scopes:
vex:readfor list/detail/evidence and export handlers (Excititor guards all VEX routes, including export/mirror, withvex:read)- There is no separate
vex:exportscope;vex:ingestcovers ingestion andvex.admincovers provider/review administration
Endpoints
GET /vex/statements— list statements (tenant-scoped).- Query params:
vulnId,status,search,limit,continuationToken
- Query params:
GET /vex/statements/{statementId}— statement detail.GET /vex/statements/{statementId}/evidence— evidence links (signed URLs, optional DSSE).GET /vex/statements/{statementId}/export?format=json|ndjson|spdx|cyclonedx— export helper returning a signed URL and checksums.
Error codes
Gateway maps upstream/validation errors to stable codes for SDK/UI:
ERR_AGG_BAD_REQUEST(400)ERR_AGG_UNAUTHORIZED(401/403)ERR_AGG_NOT_FOUND(404)ERR_AGG_RATE_LIMIT(429)ERR_AGG_UPSTREAM(5xx)ERR_AGG_UNKNOWN(fallback)
Caching & pagination
limitmax:200.- Cursor/paging uses
continuationToken(opaque string). ETagMUST be stable over sorted payload; clients MAY sendIf-None-Match.
Determinism rules
- Ordering: list responses sorted by
(statementId asc)unless specified otherwise; ties break bystatementId. - Timestamps: ISO-8601 UTC.
Samples
vex-statements-list.json— list response.vex-statement-detail.json— statement detail.vex-evidence-list.json— evidence links.
