|
| 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