Skip to content

Commit 654fbdc

Browse files
authored
Document breaking changes in REST API v1 (#106)
Signed-off-by: nscuro <nscuro@protonmail.com>
1 parent fa10060 commit 654fbdc

3 files changed

Lines changed: 285 additions & 7 deletions

File tree

docs/concepts/changes-in-v5.md

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,16 +147,13 @@ remediation steps, lives in the
147147
`NEW_VULNERABILITY``GROUP_NEW_VULNERABILITY`), and timestamps
148148
normalize to a single millisecond-precision format. Templates that
149149
consumed v4's ad-hoc subject objects need a rewrite.
150-
* **Search.** Dependency-Track removes the endpoints under `/api/v1/search`,
151-
along with fuzzy matching.
150+
* **REST API v1.** Few endpoints removed, response schemas
151+
change, and list endpoints enforce pagination by default. See
152+
[Breaking changes in v5](../reference/api/v5-breaking-changes.md)
153+
for the full enumeration.
152154
* **Fuzzy vulnerability analysis.** v4's internal analyzer optionally fell back to
153155
Lucene-based fuzzy matching against the internal vulnerability database
154156
when a component lacked a CPE. Dropping Lucene removes this capability.
155-
* **Findings and SARIF.** Findings and SARIF responses change shape, and the per-project findings
156-
endpoint now paginates by default. See the
157-
[upgrade guide](../guides/upgrading/index.md).
158-
* **Removed deprecated endpoints.** Dependency-Track removes three
159-
v4-deprecated paths under `/api/v1/policy` and `/api/v1/tag`.
160157
* **Distribution formats.** v4 shipped separate API server and frontend
161158
container images, a "bundled" container image combining both, and an
162159
executable WAR. v5 ships container images only, and drops the bundled

docs/reference/api/.pages

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
nav:
22
- REST API v1: v1.md
33
- REST API v2: v2.md
4+
- Breaking changes in v5: v5-breaking-changes.md
Lines changed: 280 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,280 @@
1+
# Breaking changes in v5
2+
3+
This page enumerates the breaking changes to REST API v1 between Dependency-Track v4 and v5. REST API v2 is new in v5
4+
and out of scope.
5+
6+
The current [v1 OpenAPI spec](v1.md) is the authoritative source. The [removed endpoints](#removed-endpoints) table and
7+
cross-cutting sections cover the changes most clients hit. The per-resource sections list everything else for lookup.
8+
9+
## What's most likely to break your client
10+
11+
Quick triage. Each item links to the section with the full detail.
12+
13+
- **Endpoints your client calls may no longer exist.** Check the [removed endpoints](#removed-endpoints) table.
14+
- **List endpoints now cap at 100 results by default.** Pagination applies to team, finding, and per-vulnerability
15+
project listings. See the [Team](#team-resource), [Finding](#finding-resource), and
16+
[Vulnerability](#vulnerability-resource) sections.
17+
- **Authentication contract changed on badge endpoints.** v5 accepts unauthenticated requests, `401` no longer signals
18+
bad credentials. See [Badge resource](#badge-resource).
19+
- **New `403` responses on project-association endpoints.** Strict status-code matching fails. See
20+
[Policy](#policy-resource) and [Notification rule](#notification-rule-resource).
21+
- **Request body shape and required fields changed** on these resources: [Repository](#repository-resource),
22+
[Notification publisher](#notification-publisher-resource), [Notification rule](#notification-rule-resource), and
23+
[Tag](#tag-resource).
24+
25+
## Removed endpoints
26+
27+
v5 removes the `/v1/search/*` and `/v1/integration/osv/*` resources entirely, plus the individual endpoints below.
28+
29+
| Method | Path | Replacement |
30+
|:-------|:-----------------------------------------------------|:--------------------------------------------------------------------------------------|
31+
| GET | `/v1/search` | None. v5 removes the Lucene-backed search index. v5 has no fuzzy-matching capability. |
32+
| GET | `/v1/search/component` | None. |
33+
| GET | `/v1/search/license` | None. |
34+
| GET | `/v1/search/project` | None. |
35+
| POST | `/v1/search/reindex` | None. The search index no longer needs rebuilding. |
36+
| GET | `/v1/search/service` | None. |
37+
| GET | `/v1/search/vulnerability` | None. |
38+
| GET | `/v1/search/vulnerablesoftware` | None. |
39+
| GET | `/v1/integration/osv/ecosystem` | None. |
40+
| GET | `/v1/integration/osv/ecosystem/inactive` | None. |
41+
| POST | `/v1/notification/publisher/restoreDefaultTemplates` | None. |
42+
| POST | `/v1/notification/publisher/test/smtp` | `POST /v2/extension-points/notification.publisher/extensions/email/test` |
43+
| POST | `/v1/policy/{policyUuid}/tag/{tagName}` | `POST /v1/tag/{name}/policy` |
44+
| DELETE | `/v1/policy/{policyUuid}/tag/{tagName}` | `DELETE /v1/tag/{name}/policy` |
45+
| GET | `/v1/tag/{policyUuid}` | `GET /v1/tag/policy/{uuid}` |
46+
47+
## Cross-cutting changes
48+
49+
These hit many endpoints. They're documented once here to avoid repetition in the per-resource sections.
50+
51+
- **`propertyType` enum lost `ENCRYPTEDSTRING`.** Applies to `ConfigProperty.propertyType`,
52+
`ProjectProperty.propertyType`, and `ComponentProperty.propertyType`.
53+
- **`Project.classifier` and `Project.collectionLogic` lost `NONE`.** Applies to every endpoint returning `Project`,
54+
including nested occurrences.
55+
- **`ProjectMetrics.collectionLogic` and `collectionLogicChanged` removed.** Applies to every endpoint returning
56+
`ProjectMetrics`.
57+
- **`Permission` enum lost `VIEW_BADGES`.** Affects `GET /v1/permission` and any field carrying a permission value.
58+
- **`AffectedVersionAttribution`** (nested in `Vulnerability.affectedComponents[]`) lost the `uuid` field.
59+
- **`VulnerabilityAlias.uuid` removed** from all vulnerability responses.
60+
61+
### Additive permission changes
62+
63+
v5 introduces per-action permissions (for example, `POLICY_MANAGEMENT_READ`, `SYSTEM_CONFIGURATION_UPDATE`,
64+
`VULNERABILITY_ANALYSIS_READ`) alongside the v4 coarse-grained permission. Existing tokens with the v4 permission still
65+
work, so these additions don't break clients. See [Permissions](../permissions.md) for the full list.
66+
67+
## Per-resource changes
68+
69+
Resource sections appear in alphabetical order. Within each section, endpoint paths appear in bold at the start of each
70+
change group.
71+
72+
### Badge resource
73+
74+
**All four badge endpoints (`/v1/badge/vulns/...`, `/v1/badge/violations/...`)**
75+
76+
- **Auth no longer required**: badge endpoints accept unauthenticated requests in v5. Clients that relied on `401` to
77+
detect missing or bad credentials no longer receive it. Badge support remains turned off by default, and admins must
78+
explicitly enable unauthenticated access.
79+
- **Status code change**: `401` no longer returned. `403` means the administrator turned badges off, not that the
80+
credential is wrong. Do not retry with different credentials on `403`.
81+
82+
!!! note
83+
v4.12.0 introduced auth for badge access. Because badges typically embed in documents such as `README`s, the
84+
standard `Authorization` header doesn't work there. To compensate, `/v1/badge` endpoints accepted API keys through
85+
a URL query parameter, with the expectation that an API key holding only the `VIEW_BADGES` permission made this
86+
safe. In practice the design exposed API keys in logs and referrer headers, so v5 drops it.
87+
88+
### BOM resource
89+
90+
**`GET /v1/bom/cyclonedx/project/{uuid}`**
91+
92+
- **Permission tightened**: v4 required only `VIEW_PORTFOLIO` for all variants. v5 additionally requires one of
93+
`VIEW_VULNERABILITY`, `VULNERABILITY_ANALYSIS`, or `VULNERABILITY_ANALYSIS_READ` when `variant=withVulnerabilities`
94+
or `variant=vdr`.
95+
96+
### Calculator resource
97+
98+
**`GET /v1/calculator/cvss`**
99+
100+
- **Response field omission**: v4 returned all six score fields (`baseScore`, `impactSubScore`,
101+
`exploitabilitySubScore`, `temporalScore`, `environmentalScore`, `modifiedImpactSubScore`) as primitives, even when
102+
inapplicable (`NaN`). v5 omits fields that don't apply for the given vector. Clients must handle missing keys rather
103+
than assume `NaN`.
104+
105+
### Component resource
106+
107+
**`GET /v1/component/project/{uuid}`, `PUT /v1/component/project/{uuid}`, `POST /v1/component`, `GET /v1/component/{uuid}`**
108+
109+
- **Enum value removed**: `Component.classifier.NONE`. `null` or an absent field means what `NONE` meant in v4.
110+
- **Removed field**: nested `RepositoryMetaComponent.published` -> `latestVersionPublishedAt`.
111+
- **Required-field contract loosened**: `RepositoryMetaComponent` no longer declares `lastCheck`, `latestVersion`,
112+
`name`, or `repositoryType` as required. Clients can no longer assume their presence.
113+
114+
### Component property resource
115+
116+
**All endpoints under `/v1/component/{uuid}/property`**
117+
118+
- **Enum value removed**: `ComponentProperty.propertyType.ENCRYPTEDSTRING`.
119+
120+
### Config property resource
121+
122+
**All endpoints under `/v1/configProperty`**
123+
124+
- **Enum value removed**: `ConfigProperty.propertyType.ENCRYPTEDSTRING`.
125+
126+
### Finding resource
127+
128+
**All endpoints returning `Finding`**
129+
130+
- **`vulnerability.cwes` shape changed**: v4 returned an array of CWE integer IDs (for example `[80, 666]`). v5 returns
131+
an array of CWE objects with `cweId` and `name` fields (for example `[{"cweId": 80, "name": "..."}, ...]`). The SARIF
132+
output emitted by these endpoints carries the same change: v4 serialized `cwes` as a quoted string of the underlying
133+
list, v5 emits a proper JSON array of `{cweId, name}` objects.
134+
135+
**`POST /v1/finding/project/{uuid}/analyze`**
136+
137+
- **Permission tightened**: required permission changed `VIEW_VULNERABILITY` -> `VULNERABILITY_ANALYSIS`.
138+
139+
**`GET /v1/finding/project/{uuid}`**
140+
141+
- **Pagination now honored**: v4 exposed `pageNumber`/`pageSize` but the underlying SQL ignored them, the response
142+
always contained every matching row. v5 applies the parameters. Callers that relied on receiving the full result set
143+
in one response now silently truncate at `pageSize=100` by default.
144+
145+
**`GET /v1/finding` and `GET /v1/finding/grouped`**
146+
147+
- **Pagination now honored**: same change as `GET /v1/finding/project/{uuid}`. v4 accepted `pageNumber` and `pageSize`
148+
but ignored them, v5 applies them.
149+
150+
### Metrics resource
151+
152+
**`GET /v1/metrics/project/{uuid}/current`, `/since/{date}`, `/days/{days}`**
153+
154+
- **Removed response fields**: `ProjectMetrics.collectionLogic`, `collectionLogicChanged`.
155+
156+
### Notification publisher resource
157+
158+
v5 removes `POST /v1/notification/publisher/restoreDefaultTemplates` and `POST /v1/notification/publisher/test/smtp`.
159+
See the [removed-endpoints table](#removed-endpoints).
160+
161+
**`PUT /v1/notification/publisher`**
162+
163+
- **Request body schema changed**: v4 accepted full `NotificationPublisher`. v5 uses
164+
`CreateNotificationPublisherRequest`.
165+
- **Renamed and required field**: `publisherClass` -> `extensionName` (required). `extensionName` must refer to a name
166+
listed under `GET /v2/extension-points/notification.publisher/extensions`.
167+
- **Removed request fields**: `defaultPublisher` and `uuid` no longer accepted (v4 never used them). `templateMimeType`
168+
no longer required on create.
169+
170+
**`POST /v1/notification/publisher`**
171+
172+
- **Request body schema changed**: v4 accepted full `NotificationPublisher`. v5 uses
173+
`UpdateNotificationPublisherRequest`.
174+
- **Renamed and required field**: `publisherClass` -> `extensionName` (required). `extensionName` must refer to a name
175+
listed under `GET /v2/extension-points/notification.publisher/extensions`.
176+
177+
**`NotificationPublisher` response schema**
178+
179+
- **Renamed field**: `publisherClass` -> `extensionName`.
180+
181+
### Notification rule resource
182+
183+
**`PUT /v1/notification/rule`**
184+
185+
- **Request body schema changed**: v4 accepted full `NotificationRule`. v5 uses `CreateNotificationRuleRequest`.
186+
- **Renamed field**: `notificationLevel` -> `level`.
187+
- **New mandatory request field**: `publisher` (UUID wrapper) is now required.
188+
- **Removed request fields**: `triggerType` and `uuid` no longer accepted (server-assigned).
189+
190+
**`POST /v1/notification/rule`**
191+
192+
- **Request body schema changed**: v4 accepted full `NotificationRule`. v5 uses `UpdateNotificationRuleRequest`.
193+
- **Renamed field**: `notificationLevel` -> `level`.
194+
- **New mandatory request fields**: `level` and `scope` now required.
195+
- **Removed request fields**: `triggerType`, `projects`, `teams`, `tags`, `publisher`, `publisherConfig`, and schedule
196+
fields no longer in the update body (managed through dedicated sub-endpoints).
197+
198+
**`NotificationRule` response schema**
199+
200+
- **Enum value removed**: `notifyOn.INDEXING_SERVICE`.
201+
202+
**`POST /v1/notification/rule/{ruleUuid}/project/{projectUuid}`, `DELETE /v1/notification/rule/{ruleUuid}/project/{projectUuid}`**
203+
204+
- **New response status**: `403 Forbidden` (project access denied).
205+
206+
### Permission resource
207+
208+
**`GET /v1/permission`**
209+
210+
- **Enum value removed**: `Permission.VIEW_BADGES`.
211+
212+
### Policy resource
213+
214+
**`POST /v1/policy/{policyUuid}/project/{projectUuid}`, `DELETE /v1/policy/{policyUuid}/project/{projectUuid}`**
215+
216+
- **New response status**: `403 Forbidden` (project access denied). Strict clients that match only v4 codes see
217+
undocumented errors.
218+
219+
v5 removes the `POST` and `DELETE` variants of `/v1/policy/{policyUuid}/tag/{tagName}`. See the
220+
[removed endpoints](#removed-endpoints) table.
221+
222+
### Project resource
223+
224+
**`PUT /v1/project`, `POST /v1/project`, `GET /v1/project/{uuid}`, `PATCH /v1/project/{uuid}`**
225+
226+
- **Removed response field**: `Project.properties` inline array. Fetch project properties via
227+
`GET /v1/project/{uuid}/property` instead.
228+
- **Enum values removed**: `Project.classifier.NONE`, `Project.collectionLogic.NONE`. `null` or an absent field means
229+
what `NONE` meant in v4.
230+
231+
**`POST /v1/project/batchDelete`**
232+
233+
- **Removed response**: v4 documented a `400` with `ProjectOperationProblemDetails`. v5 documents only `204` and `401`.
234+
235+
### Project property resource
236+
237+
**All endpoints under `/v1/project/{uuid}/property`**
238+
239+
- **Enum value removed**: `ProjectProperty.propertyType.ENCRYPTEDSTRING`.
240+
241+
### Repository resource
242+
243+
**`GET /v1/repository/latest`**
244+
245+
- **Renamed response field**: `RepositoryMetaComponent.published` -> `latestVersionPublishedAt`.
246+
- **Required-field contract loosened**: `lastCheck`, `latestVersion`, `name`, `published`, and `repositoryType`,
247+
required in v4, are now all optional in the response schema.
248+
249+
**`PUT /v1/repository`, `POST /v1/repository`**
250+
251+
- **New mandatory request field**: `Repository.authenticationRequired`.
252+
253+
### Tag resource
254+
255+
v5 removes `GET /v1/tag/{policyUuid}` in favor of `GET /v1/tag/policy/{uuid}`. See the
256+
[removed-endpoints table](#removed-endpoints).
257+
258+
### Team resource
259+
260+
**`GET /v1/team`**
261+
262+
- **Pagination introduced**: v4 had no pagination parameters. v5 adds `pageNumber`, `pageSize`, `offset`, `limit`,
263+
`sortName`, and `sortOrder` with default `pageSize=100`. Naive callers silently drop teams beyond the first 100.
264+
265+
### Vulnerability resource
266+
267+
**All endpoints returning `Vulnerability`**
268+
269+
- **Removed response fields**: `findingAttribution` and `normalizedCvssV2Vector` removed without replacement. `cwe`
270+
(singular) removed, use the `cwes` array instead (a single CWE appears as a one-element array).
271+
- Nested `VulnerabilityAlias.uuid` removed. Nested `AffectedVersionAttribution.uuid` removed.
272+
273+
**`GET /v1/vulnerability/source/{source}/vuln/{vuln}/projects`**
274+
275+
- **Pagination introduced**: v4 returned an unbounded list. v5 caps at `pageSize=100` by default and exposes
276+
`pageNumber`, `pageSize`, `sortName`, and `sortOrder`. Naive callers silently drop projects beyond the first 100.
277+
- **Response type changed**: v4 returned `Project[]` (full schema). v5 returns `AffectedProject[]`, a slim DTO
278+
containing only `active`, `affectedComponentUuids`, `dependencyGraphAvailable`, `name`, `uuid`, and `version`. v5
279+
drops all other `Project` fields.
280+
- **Status code removed**: v4 returned `404` for an unknown vulnerability. v5 returns `200` with an empty list.

0 commit comments

Comments
 (0)