Skip to content

Repositories API ​

66 endpoints. Request and response schemas are described on the schemas page; the other tags are listed in the API index.

Endpoints ​

GET /api/v1/admin/quotas ​

List all quotas

Every live repository and every project with its quota and live usage, largest usage first, in one request. A repository or project without a limit is listed as unlimited. Admin only.

Parameters

NameInTypeRequiredDescription
scopequerystringnoOne of: repository, project.
limitedquerybooleannotrue keeps only quotas that enforce a limit.
qquerystringnoCase-insensitive substring of the repository or project name.
pagequeryintegernoDefault: 1. Minimum: 1.
limitqueryintegernoDefault: 500. Minimum: 1. Maximum: 2000.

Responses

StatusDescriptionBody
200One page of quotasapplication/json: QuotaOverviewList
400Invalid scope-
403Admin access required-

GET /api/v1/repositories ​

List repositories

List all repositories with optional filtering

Parameters

NameInTypeRequiredDescription
formatquerystringnoFilter by package format. One of: deb, rpm, maven, npm, docker, helm, pypi, nuget, go, cargo, rubygems, raw, conda, conan, ivy, sbt, terraform, apk, pacman.
pagequeryintegernoPage number (default: 1). Minimum: 1.
limitqueryintegernoItems per page (default: 25, max: 100). Minimum: 1. Maximum: 100.
qquerystringnoOnly repositories whose name contains this text (case-insensitive, at most 200 characters). Maximum length: 200.
typequerystringnoOnly repositories of this type. One of: hosted, proxy, group.
projectquerystringnoOnly repositories of the project with this name; an unknown project matches nothing
flaggedquerybooleannotrue keeps the repositories holding a critical or high vulnerability, a secret finding or a quarantined scan result (each artifact's latest scan counts)
near_quotaquerybooleannotrue keeps the repositories that have a size quota and have used at least quota_threshold of it
quota_thresholdquerynumbernoUsed fraction of the quota from which near_quota matches, above 0 and at most 1 (default 0.8). Exclusive minimum: 0. Maximum: 1.
unscannedquerybooleannotrue keeps the repositories that were never scanned (no completed scan of any of their artifacts)
sortquerystringnoOrder: name, updated (last change of the repository), last_published (newest package first, empty repositories last) or size (largest first). Without it, the newest repository first. Ties are ordered by name. One of: name, updated, last_published, size.

Responses

StatusDescriptionBody
200List of repositoriesapplication/json: object
400Invalid requestapplication/json: Error

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
limitintegerno-
pageintegerno-
repositoriesarray of Repositoryno-
totalintegerno-

POST /api/v1/repositories ​

Create repository

Create a new repository (admin only)

Request body (required)

application/json: object

FieldTypeRequiredDescription
blockedbooleanno-
cache_ttl_secondsintegerno-
descriptionstringno-
federatedbooleannoEnable federation at creation. Only valid for hosted repositories of the formats raw, maven, npm, docker, helm, pypi, cargo, go and nuget (400 otherwise when true).
formatstringyesOne of: deb, rpm, maven, npm, docker, helm, pypi, nuget, go, cargo, rubygems, raw, conda, conan, ivy, sbt, terraform, apk, pacman.
immutable_releasesbooleannoWhen true, deleting or overwriting a released version is refused with 409 (SNAPSHOT/pre-release versions stay mutable). An admin can override with ?force=true.
max_stale_secondsintegernoSeconds past a cached file's expiry during which it may still be served, with a Warning: 110 header, when the upstream is unreachable, times out or answers 5xx. 0 disables serve-stale; default 604800 (7 days); max 31536000.
member_reposarray of stringnoFor group repos: ordered member repository names (first hit wins). Members must be hosted or proxy repositories of the group's format; groups cannot be nested.
merge_proxy_versionsbooleannoGroup repositories only, administrators only (403 otherwise). Default false: hosted members win a package name and proxy versions of the same name are hidden. true merges proxy versions into the group.
namestringyesRepository name (1-100 alphanumeric/hyphen/underscore)
negative_cache_ttl_secondsintegerno-
presign_downloadsbooleannoPer-repository override of storage.presignDownloads: true always redirects eligible blob downloads to a presigned object-store URL, false always streams, null inherits the global setting. Metadata and manifests are never redirected. Nullable.
projectstringnoName of the owning project. Defaults to the built-in system project, whose membership grants nothing. Unknown project: 404.
publicbooleanno-
repo_typestringnohosted (default), proxy or group. Proxy repositories are supported for maven, sbt, ivy, deb, rpm, apk, pacman, docker, go, npm, nuget, pypi, cargo, rubygems, helm, conan, conda, terraform and raw; group repositories for maven, sbt, ivy, deb, rpm, apk, pacman, docker, go, npm, nuget, pypi, cargo, rubygems, helm, conan, conda, terraform and raw (deb, rpm and apk groups serve generated Release/Packages, repodata or APKINDEX merged across their members). Docker proxies and groups are served under /v2/ only. Other combinations are rejected with 400 validation_failed. Proxy and group repositories are read-only. One of: hosted, proxy, group.
sign_packagesbooleannoHosted rpm repositories only (400 otherwise when true). When true, uploaded RPMs are signed with the active GPG key; existing packages are not re-signed.
trash_retention_daysintegernoDays a deleted item (or the repository itself) stays restorable in the trash before the retention purge removes it. null/absent = the server default (TRASH_RETENTION_DAYS); 0 = no trash, deletes are immediate and permanent. Nullable. Minimum: 0. Maximum: 36500.
upstream_passwordstringno-
upstream_urlstringnoRequired for proxy repos, except docker (defaults to https://registry-1.docker.io), nuget (defaults to the service index https://api.nuget.org/v3/index.json), pypi (defaults to https://pypi.org/simple) cargo (defaults to https://index.crates.io) and go (defaults to https://proxy.golang.org). Plain http(s) base URL without credentials, query or fragment; validated against the outbound (SSRF) policy.
upstream_usernamestringno-

Responses

StatusDescriptionBody
201Repository createdapplication/json: Repository
400Invalid request-
403Admin access required-
404The addressed resource was not foundapplication/json: Error
409A repository with this name already exists, or the name is reserved by a repository in the trash until it is purged or restored (error codes conflict, name_reserved)application/json: Error

GET /api/v1/repositories/{name}/activity ​

Repository activity

Audit events recorded against one repository (deletions, restores, purges, repository and project changes), newest first, with actor and subject names resolved. package_name and version keep only the events that record that package version: deletions, restores and purges do, other events never match. Keyset paging only: follow next_cursor while has_more is true; no row is counted. Client addresses are not returned. Requires global admin or the maintainer or owner role in the repository's project (a caller who cannot read the repository gets 404).

Parameters

NameInTypeRequiredDescription
namepathstringyes-
package_namequerystringnoExact package name as recorded with the event.
versionquerystringnoExact version as recorded with the event.
actorquerystringnoCase-insensitive substring of the actor name or actor id.
actionquerystringnoCase-insensitive substring of the action name.
cursorquerystringnoOpaque next_cursor of the previous page; omit for the newest entries.
limitqueryintegernoDefault: 25. Minimum: 1. Maximum: 100.

Responses

StatusDescriptionBody
200One page of activityapplication/json: ActivityPage
400Malformed cursor-
403Admin or project maintainer access required-
404Repository not found-

GET /api/v1/repositories/{name}/apk-key ​

Get the apk signing key

Returns the public half of the key that signs the APKINDEX of a hosted or group apk repository, generating the key on first use. Requires the global manage permission.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name

Responses

StatusDescriptionBody
200The signing keyapplication/json: ApkSigningKey
400The repository is not a hosted or group apk repositoryapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not foundapplication/json: Error
409OPENARTIFACT_SECRET_KEY is not set (code secret_key_required)application/json: Error

POST /api/v1/repositories/{name}/apk-key ​

Replace the apk signing key

Generates a new signing key (empty body) or imports the given RSA private key, and re-signs the repository's indexes. Clients must install the new public key. Requires the global manage permission.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name

Request body

application/json: object

FieldTypeRequiredDescription
key_namestringnoFile name of the public key, ending in .rsa.pub; only with private_key (default openartifact-<repository>.rsa.pub)
private_keystringnoPEM private key (PKCS#8 or the PKCS#1 form abuild-keygen writes), at least 2048 bits; omit to generate a new key

Responses

StatusDescriptionBody
200The new signing keyapplication/json: ApkSigningKey
400Invalid key or the repository is not a hosted or group apk repositoryapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not foundapplication/json: Error
409OPENARTIFACT_SECRET_KEY is not set (code secret_key_required)application/json: Error

POST /api/v1/repositories/{name}/apks ​

Upload an Alpine apk package

Upload a .apk into a hosted apk repository (multipart/form-data). The package is stored under <branch>/<repo>/<arch>, where arch is the package architecture (required in the request only for noarch packages). Requires write access.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name

Request body (required)

multipart/form-data: object

FieldTypeRequiredDescription
archstringnoTarget architecture directory; required for noarch packages, otherwise it must equal the package architecture
branchstringnoTarget branch directory, for example v3.20 (default edge)
filestring (binary)yesThe .apk package
repostringnoTarget repository directory, for example main (default main)

Responses

StatusDescriptionBody
200Package storedapplication/json: ApkUploadResult
400Invalid package, invalid input or wrong repository formatapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not foundapplication/json: Error
409Package already existsapplication/json: Error
413File too largeapplication/json: Error

Search artifacts

Search artifacts by properties

Security: bearerAuth or cookieAuth or .

Parameters

NameInTypeRequiredDescription
namepathstringyes-
keyquerystringyes-
valuequerystringyes-

Responses

StatusDescriptionBody
200Search results-
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

GET /api/v1/repositories/{name}/artifacts/{artifact_id}/properties ​

List artifact properties

List properties for a specific artifact

Security: bearerAuth or cookieAuth or .

Parameters

NameInTypeRequiredDescription
namepathstringyes-
artifact_idpathstring (uuid)yes-

Responses

StatusDescriptionBody
200Artifact propertiesapplication/json: map of string
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

PUT /api/v1/repositories/{name}/artifacts/{artifact_id}/properties ​

Set artifact properties

Replace all properties for a specific artifact

Parameters

NameInTypeRequiredDescription
namepathstringyes-
artifact_idpathstring (uuid)yes-

Request body (required)

application/json: map of string

Responses

StatusDescriptionBody
200Properties updated-
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

PATCH /api/v1/repositories/{name}/artifacts/{artifact_id}/properties ​

Update artifact properties

Patch properties for a specific artifact

Parameters

NameInTypeRequiredDescription
namepathstringyes-
artifact_idpathstring (uuid)yes-

Request body (required)

application/json: map of string

Responses

StatusDescriptionBody
200Properties updated-
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

DELETE /api/v1/repositories/{name}/artifacts/{artifact_id}/properties/{key} ​

Delete artifact property

Delete a specific property from an artifact

Parameters

NameInTypeRequiredDescription
namepathstringyes-
artifact_idpathstring (uuid)yes-
keypathstringyes-

Responses

StatusDescriptionBody
204Property deleted-
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Property not found-

PUT /api/v1/repositories/{name}/comps ​

Upload RPM comps.xml

Replace the comps (package groups) XML of a hosted RPM repository. The body is the raw XML document. Requires write access.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name

Request body (required)

application/xml: string

text/xml: string

Responses

StatusDescriptionBody
200comps storedapplication/json: CompsUploadResult
400Invalid XML or not an RPM repositoryapplication/json: Error
404Repository not foundapplication/json: Error
413Body too largeapplication/json: Error

POST /api/v1/repositories/{name}/debs ​

Upload a DEB package

Upload a package into a hosted deb repository (multipart/form-data). Requires write access.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name

Request body (required)

multipart/form-data: object

FieldTypeRequiredDescription
componentstringnoTarget component (default main)
distributionstringnoTarget distribution (default stable)
filestring (binary)yesThe .deb package

Responses

StatusDescriptionBody
200Package storedapplication/json: PackageUploadResult
400Invalid input or wrong repository formatapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not foundapplication/json: Error
405Proxy and group repositories are read-onlyapplication/json: Error
409Package already existsapplication/json: Error
413File too largeapplication/json: Error

DELETE /api/v1/repositories/{name}/debs/{id} ​

Delete a DEB package

Delete a package from a hosted repository. Requires write access.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name
idpathstring (uuid)yesPackage ID

Responses

StatusDescriptionBody
200Package deletedapplication/json: PackageDeleteResult
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or package not foundapplication/json: Error
409Release versions are immutable in this repositoryapplication/json: Error

GET /api/v1/repositories/{name}/license/policies ​

List license policies

List license policies for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200List of license policies-
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

POST /api/v1/repositories/{name}/license/policies ​

Create license policy

Create a license policy for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: LicensePolicy

Responses

StatusDescriptionBody
201License policy created-
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

PUT /api/v1/repositories/{name}/license/policies/{id} ​

Update license policy

Update a license policy for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Request body (required)

application/json: LicensePolicy

Responses

StatusDescriptionBody
200License policy updated-
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

DELETE /api/v1/repositories/{name}/license/policies/{id} ​

Delete license policy

Delete a license policy

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
204License policy deleted-
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

POST /api/v1/repositories/{name}/license/scan ​

Scan licenses

Detect the licenses of an artifact from its stored package file (the wheel METADATA, package.json, Cargo.toml, .nuspec, pom or gemspec it declares) and from its license properties, evaluate the license policies and record the result. A violated policy with action block quarantines the artifact: downloads answer 403 ARTIFACT_QUARANTINED until an admin approves it.

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: object

FieldTypeRequiredDescription
artifact_idstringyes-

Responses

StatusDescriptionBody
200License scan result with the policy violationsapplication/json: LicenseScanRunResult
400Invalid body-
403Admin access required-
404Repository not found-
422The artifact's metadata is too large or ambiguous to be read safely (unsafe_artifact), or its license cannot be read from its file while a blocking license policy applies (unreadable_artifact)-

GET /api/v1/repositories/{name}/license/scans ​

List license scans

List license scans for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200List of license scansapplication/json: object
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
scansarray of LicenseScanResultno-

GET /api/v1/repositories/{name}/license/scans/{id} ​

Get license scan

Get details of a specific license scan

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
200License scan detailsapplication/json: LicenseScanResult
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Scan not found-

POST /api/v1/repositories/{name}/license/scans/{id}/quarantine ​

Quarantine or approve license scan artifact

Quarantine (quarantined: true) or approve (quarantined: false) the artifact of a license scan (admin only). An artifact quarantined by a blocking license policy stays quarantined, also across re-scans of the same licenses, until it is approved here.

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Request body (required)

application/json: object

FieldTypeRequiredDescription
quarantinedbooleanyes-

Responses

StatusDescriptionBody
200Updated license scanapplication/json: LicenseScanResult
400Invalid body-
403Admin access required-
404Repository or scan not found-

GET /api/v1/repositories/{name}/members ​

Get group repository members

List the member repositories of a group repository in resolution order

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200List of membersapplication/json: object
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not found-

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
membersarray of RepositoryMemberno-

PUT /api/v1/repositories/{name}/members ​

Update group repository members

Replace the ordered member repositories of a group repository. Members must be hosted or proxy repositories of the group's format; groups cannot be nested.

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: object

FieldTypeRequiredDescription
member_reposarray of stringyesList of member repository names

Responses

StatusDescriptionBody
200Members updatedapplication/json: object
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not found-

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
membersarray of RepositoryMemberno-

GET /api/v1/repositories/{name}/packages ​

List packages in repository

List all packages in a specific repository

Security: bearerAuth or cookieAuth or .

Parameters

NameInTypeRequiredDescription
namepathstringyes-
pagequeryintegernoMinimum: 1.
limitqueryintegernoMinimum: 1. Maximum: 100.
qquerystringnoOnly list rows whose listed name or version contains this text (case-insensitive, at most 200 characters). Maximum length: 200.
sortquerystringnoRow order: newest first (created, the default) or by name and version (name). One of: created, name.
formatquerystringnoOnly list packages of this format
package_namequerystringnoOnly list rows whose listed package name equals this value exactly (all versions of one package)
groupquerystringnopackage returns one entry per package (format and name) instead of one per file: its latest version, version count, latest size and the scan state of the latest version. total then counts packages. The q, format and package_name filters apply to the rows before they are grouped. One of: package.
flaggedquerybooleannoWith group=package, true keeps the packages whose latest version has a critical or high vulnerability, a secret finding or a quarantined scan result. Rejected without group=package.

Responses

StatusDescriptionBody
200List of packages: one entry per file (PackageFile), or one per package (PackageGroup) with group=packageapplication/json: object
400Invalid sort, group, flagged or q-
403Forbiddenapplication/json: Error
404Repository not found-

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
limitintegerno-
packagesarray of anyno-
pageintegerno-
totalintegerno-

POST /api/v1/repositories/{name}/packages ​

Upload a RPM package

Upload a package into a hosted rpm repository (multipart/form-data). Requires write access.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name

Request body (required)

multipart/form-data: object

FieldTypeRequiredDescription
filestring (binary)yesThe .rpm package

Responses

StatusDescriptionBody
200Package storedapplication/json: PackageUploadResult
400Invalid input or wrong repository formatapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not foundapplication/json: Error
405Proxy and group repositories are read-onlyapplication/json: Error
409Package already existsapplication/json: Error
413File too largeapplication/json: Error

GET /api/v1/repositories/{name}/packages/{id} ​

Get a package version

One package version, by the row id of the package listing: the metadata its format stores, its declared dependencies and the files of the version. Requires read access to the repository. Dependencies are returned for npm (dependencies, devDependencies, peerDependencies, optionalDependencies), cargo, nuget (kind is the target framework), rubygems, conda, deb (Depends, Pre-Depends), rpm (requires) and go (go.mod require directives); the other formats do not store them server-side and return an empty list. Metadata holds only what the format's table stores: for pypi, helm, maven, docker and conan there are no declared dependencies, and docker layers or the image config are not part of the response.

Security: bearerAuth or cookieAuth or .

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name
idpathstring (uuid)yesRow id from the package listing

Responses

StatusDescriptionBody
200The package versionapplication/json: PackageDetail
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403No read access to the repository-
404Repository or package not found (a package of another repository is not found either)-

DELETE /api/v1/repositories/{name}/packages/{id} ​

Delete a package

Delete a package row (an id of the package listing) from a hosted repository of any format: into the trash when the repository keeps one, else for good, refreshing the format's generated metadata. A conan recipe revision goes with its files. Released versions of immutable repositories answer 409 unless an admin passes force. Requires write access.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name
idpathstring (uuid)yesPackage ID

Responses

StatusDescriptionBody
200Package deletedapplication/json: PackageDeleteResult
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or package not foundapplication/json: Error
409Release versions are immutable in this repositoryapplication/json: Error

GET /api/v1/repositories/{name}/packages/{id}/delta ​

Download a binary delta

Returns a binary diff that turns the package whose sha256 is given in from into the target package. The delta is generated on demand and cached. Applies to rpm and deb packages. Requires read access.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name
idpathstring (uuid)yesTarget package ID
fromquerystringyessha256 (64 hex characters) of the package the client already has. Pattern: ^[0-9a-fA-F]{64}$.

Responses

StatusDescriptionBody
200Binary delta Headers: X-Delta-From, X-Delta-Size, X-Delta-To.application/octet-stream: string (binary)
400Missing or invalid fromapplication/json: Error
403Forbiddenapplication/json: Error
404Repository, target or source package not foundapplication/json: Error
413Package too large for delta generationapplication/json: Error

GET /api/v1/repositories/{name}/packages/{id}/deltas ​

List deltas of a package

List the pre-computed deltas targeting a package. Requires read access.

Parameters

NameInTypeRequiredDescription
namepathstringyesRepository name
idpathstring (uuid)yesTarget package ID

Responses

StatusDescriptionBody
200Available deltasapplication/json: PackageDeltaList
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or package not foundapplication/json: Error

GET /api/v1/repositories/{name}/packages/{id}/download ​

Download a package

Streams the blob of a row returned by the package listing (any format) as an attachment named after the listing filename. Docker tags download their manifest as sha256_<hex>.json.

Security: bearerAuth or cookieAuth or .

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
200Package fileapplication/octet-stream: string (binary)
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Package not found in this repository, or the row has no stored file-
501No blob store configured-

GET /api/v1/repositories/{name}/quota ​

Get repository quota

Get quota configuration for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200Quota configurationapplication/json: Quota
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not found-

PUT /api/v1/repositories/{name}/quota ​

Set repository quota

Set quota configuration for a repository. Requires global admin, or the maintainer or owner role in the repository's project (a caller who cannot read the repository gets 404).

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: Quota

Responses

StatusDescriptionBody
200Quota updated-
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

DELETE /api/v1/repositories/{name}/quota ​

Delete repository quota

Remove quota configuration for a repository. Requires global admin, or the maintainer or owner role in the repository's project (a caller who cannot read the repository gets 404).

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
204Quota deleted-
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

POST /api/v1/repositories/{name}/quota/reconcile ​

Reconcile repository quota usage

Recompute the repository's usage counters (size and artifact count) from its package rows, correcting drift left by a database crash or a restore. Limits are unchanged. Admin only.

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200Quota with the recomputed usageapplication/json: Quota
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Admin access required-
404Repository not found-

GET /api/v1/repositories/{name}/sbom ​

List SBOM reports

List SBOM reports for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200List of SBOM reportsapplication/json: object
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
reportsarray of SBOMReportno-

POST /api/v1/repositories/{name}/sbom/generate ​

Generate SBOM

Generate a Software Bill of Materials for a repository artifact. Components are the dependencies declared by the stored package file (manifest and lockfile) merged with the artifact's dependencies property.

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: object

FieldTypeRequiredDescription
artifact_idstring (uuid)yes-
formatstringyescyclonedx (JSON), spdx (2.3 tag-value), spdx-json (2.3 JSON) or spdx3-json (SPDX 3.0.1 JSON-LD). One of: cyclonedx, spdx, spdx-json, spdx3-json.
metadataobjectno-
spec_versionstringnoCycloneDX 1.4, 1.5 (default) or 1.6; SPDX 2.3; SPDX 3 3.0.1. Optional.

Responses

StatusDescriptionBody
201SBOM generation started-
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error
422The artifact's package file is too large or ambiguous to be read safely (unsafe_artifact)-

GET /api/v1/repositories/{name}/sbom/{id} ​

Get SBOM report

Get details of a specific SBOM report

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
200SBOM report detailsapplication/json: SBOMReport
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404SBOM report not found-

DELETE /api/v1/repositories/{name}/sbom/{id} ​

Delete SBOM report

Delete a specific SBOM report

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
204SBOM report deleted-
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404SBOM report not found-

GET /api/v1/repositories/{name}/sbom/{id}/download ​

Download SBOM report

Download an SBOM report file

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-
attestquerystringnotrue returns the document as a signed in-toto attestation in a DSSE envelope; bundle returns a Sigstore bundle, the input of cosign verify-blob-attestation. Verify with the key from /.well-known/openartifact/attestation-key.pem. One of: true, bundle.

Responses

StatusDescriptionBody
200SBOM file, or its attestation with attestapplication/octet-stream: string (binary); application/vnd.dev.sigstore.bundle.v0.3+json: object; application/vnd.dsse.envelope.v1+json: object
400Invalid attest value, or the SBOM is not a JSON document (SPDX tag-value cannot be attested)-
403Forbiddenapplication/json: Error
404SBOM report not found-
501Attestations are not enabled-

POST /api/v1/repositories/{name}/secrets/scan ​

Scan secrets

Trigger a secrets scan for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
201Secrets scan started-
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

GET /api/v1/repositories/{name}/secrets/scans ​

List secrets scans

List secrets scans for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200List of secrets scansapplication/json: object
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
scansarray of ScanResultno-

GET /api/v1/repositories/{name}/secrets/scans/{id} ​

Get secrets scan

Get details of a specific secrets scan

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
200Secrets scan details-
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Scan not found-

DELETE /api/v1/repositories/{name}/secrets/scans/{id} ​

Delete secrets scan

Delete a secrets scan

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
204Secrets scan deleted-
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Scan not found-

POST /api/v1/repositories/{name}/secrets/scans/{id}/quarantine ​

Quarantine secrets scan artifact

Quarantine an artifact found in a secrets scan

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
200Artifact quarantined-
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

POST /api/v1/repositories/{name}/uploads ​

Start a presigned upload

Hosted raw repositories on any storage backend with a staging area: S3-compatible and GCS (presigned URLs), Azure (SAS URLs), and the filesystem and OCI registry backends (short-lived HMAC-signed URLs served by this server, which need baseUrl to be set). Returns a short-lived presigned PUT URL to a staging object; upload the bytes directly to it, then call the complete endpoint. Files above 5 GiB (up to 5 TiB) must set multipart: the response then carries the part plan instead of a URL, and each part URL comes from the parts endpoint. Requires write permission on the repository and on the path. The response carries a bearer credential and is sent with Cache-Control: no-store. A user may have at most storage.presignMaxPendingUploads uploads outstanding (not completed, not expired).

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: PresignedUploadRequest

Responses

StatusDescriptionBody
201Upload targetapplication/json: PresignedUpload
400Invalid path, size, part size or sha256 (code invalid_size also when a size above 5 GiB lacks multipart, or is too large for a single upload on Azure), or the repository is not a hosted raw repositoryapplication/json: Error
401Authentication required-
403Write permission denied-
404Repository not found-
429Too many outstanding uploads for this user (retry after the Retry-After header)application/json: Error
501The storage backend does not support presigned uploadsapplication/json: Error

POST /api/v1/repositories/{name}/uploads/{id}/abort ​

Abort a presigned upload

Discards an upload that will not be completed: the staging object, the parts uploaded so far and the upload record. Only the creator of the upload or an administrator may abort it. Abandoned uploads are also swept automatically after they expire.

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
204The upload was discarded-
400Invalid requestapplication/json: Error
401Authentication required-
403Write permission denied, or the caller is neither the creator of the upload nor an administrator-
404Repository or upload not found (or expired and swept)-
409Code upload_completed: the upload is already completed. Code upload_in_progress: a complete is running (retry after the Retry-After header)application/json: Error
501The storage backend does not support presigned uploadsapplication/json: Error

POST /api/v1/repositories/{name}/uploads/{id}/complete ​

Complete a presigned upload

Verifies that the staged object has the declared size and sha256, moves it to its content-addressed key, records the artifact (overwriting an existing path, like a raw PUT) and deletes the staging object. Only the creator of the upload or an administrator may complete it. The server reads the object back (up to 5 TiB) in a detached job (30 minutes plus about one second per 20 MiB, at most 6 hours) that survives a client disconnect; the read and the move are conditional on the object version seen at verification, so an object re-uploaded in between is refused. The call is idempotent: the first success returns 201, a retry returns 200 with the same body, and a retry while a verification is running returns 409 upload_in_progress. On a size or sha256 mismatch, or when the object changed during verification, the staging object and the upload are discarded and nothing is recorded. The repository's storage quota is enforced (507 quota_exceeded: the upload stays pending, nothing is recorded, and completing again after freeing space works); license and secret scanning are not applied, as for a raw PUT.

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-
forcequerybooleannoAdministrators only: true overwrites an existing file of a repository with immutable_releases. Ignored for everyone else.

Responses

StatusDescriptionBody
200The upload was already completed; the original resultapplication/json: PresignedUploadResult
201Artifact recordedapplication/json: PresignedUploadResult
400The repository is not a hosted raw repositoryapplication/json: Error
401Authentication required-
403Write permission denied, or the caller is neither the creator of the upload nor an administrator-
404Repository or upload not found (or expired and swept)-
409Code upload_missing: nothing has been uploaded to the upload URL yet. Code upload_in_progress: another complete is verifying this upload (retry after the Retry-After header). Code upload_incomplete: a part of a multipart upload is missing or has the wrong size (the message names the part numbers; upload them and call complete again). Code upload_changed: the staged object was overwritten during verification; the upload was discarded. Code immutable_release: the path already exists in a repository with immutable_releases; nothing was recorded and the upload stays pending (retry with force=true as an administrator)application/json: Error
410The upload expiredapplication/json: Error
422Size or sha256 does not match the declaration; the upload was discardedapplication/json: Error
501The storage backend does not support presigned uploadsapplication/json: Error
507Code quota_exceeded: the repository's storage quota would be exceeded; nothing was recorded and the upload stays pendingapplication/json: Error

POST /api/v1/repositories/{name}/uploads/{id}/parts ​

Sign the parts of a multipart upload

Returns presigned PUT URLs for up to 100 parts of a multipart upload, each for exactly the returned size. Call it as often as needed (URLs live as long as the single-upload URL, and every call extends the upload's deadline), PUT the parts in any order and in parallel, then call complete. A part may be re-uploaded. The response carries bearer credentials and is sent with Cache-Control: no-store. Only the creator of the upload or an administrator may call it.

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Request body (required)

application/json: PresignedPartsRequest

Responses

StatusDescriptionBody
200Part upload targetsapplication/json: PresignedParts
400Code invalid_part_numbers: empty, duplicate, more than 100 or out-of-range part numbers. Code not_multipart: the upload is a single uploadapplication/json: Error
401Authentication required-
403Write permission denied, or the caller is neither the creator of the upload nor an administrator-
404Repository or upload not found (or expired and swept)-
409Code upload_completed: the upload is already completedapplication/json: Error
410The upload expiredapplication/json: Error
501The storage backend does not support multipart uploadsapplication/json: Error

GET /api/v1/repositories/{name}/usage ​

Get repository usage

What the repository holds (packages, versions, stored bytes, newest publish) next to its quota. Package and version counts scan the repository's package rows: use it for one repository on demand, not in a loop. Requires global admin or the maintainer or owner role in the repository's project (a caller who cannot read the repository gets 404).

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200Repository usageapplication/json: RepositoryUsage
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Admin or project maintainer access required-
404Repository not found-

GET /api/v1/repositories/{name}/vex ​

Download a VEX document

Build an OpenVEX 0.2.0 (default) or CycloneDX VEX document from the latest vulnerability scans and the recorded VEX decisions. With artifact_id it covers one artifact, otherwise every scanned artifact of the repository. Status per vulnerability: the recorded decision; else fixed when the scan's fixed_in is at or below the artifact version; else affected when the scan quarantined the artifact; else under_investigation. not_affected only comes from a recorded decision. Admin only.

Parameters

NameInTypeRequiredDescription
namepathstringyes-
formatquerystringnoOne of: openvex, cyclonedx. Default: openvex.
spec_versionquerystringnoCycloneDX spec version (1.4, 1.5 or 1.6; default 1.5). CycloneDX only.
artifact_idquerystringnoRestrict the document to one artifact (name@version).
attestquerystringnotrue returns the document as a signed in-toto attestation in a DSSE envelope; bundle returns a Sigstore bundle, the input of cosign verify-blob-attestation. Verify with the key from /.well-known/openartifact/attestation-key.pem. One of: true, bundle.

Responses

StatusDescriptionBody
200VEX document, or its attestation with attestapplication/json: object; application/vnd.dev.sigstore.bundle.v0.3+json: object; application/vnd.dsse.envelope.v1+json: object
400Invalid format, spec_version or artifact_id-
403Forbiddenapplication/json: Error
404Repository not found-
501Attestations are not enabled-

GET /api/v1/repositories/{name}/vex/statements ​

List VEX decisions

List the VEX decisions recorded for a repository, optionally for one artifact. Admin only.

Parameters

NameInTypeRequiredDescription
namepathstringyes-
artifact_idquerystringno-

Responses

StatusDescriptionBody
200VEX decisionsapplication/json: object
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not found-

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
statementsarray of VEXStatementno-

PUT /api/v1/repositories/{name}/vex/statements ​

Record a VEX decision

Record (or replace) the decision for one vulnerability of one artifact. not_affected requires a justification; other statuses must not carry one. Admin only.

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: object

FieldTypeRequiredDescription
action_statementstringno-
artifact_idstringyes-
impact_statementstringno-
justificationstringnoOne of: component_not_present, vulnerable_code_not_present, vulnerable_code_not_in_execute_path, vulnerable_code_cannot_be_controlled_by_adversary, inline_mitigations_already_exist.
statusstringyesOne of: affected, not_affected, fixed, under_investigation.
vuln_idstringyese.g. CVE-2024-1234 or GHSA-xxxx

Responses

StatusDescriptionBody
200Recorded decisionapplication/json: VEXStatement
400Validation failed-
403Forbiddenapplication/json: Error
404Repository not found-

DELETE /api/v1/repositories/{name}/vex/statements/{id} ​

Delete a VEX decision

Delete a recorded VEX decision; the vulnerability falls back to its derived status. Admin only.

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
204Decision deleted-
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or decision not found-

POST /api/v1/repositories/{name}/vuln/scan ​

Scan vulnerabilities

Start a vulnerability scan for an artifact. The scan runs in the background: poll the scan until scan_status is completed, partial or failed. A scanner that cannot run (not installed, timeout, non-zero exit, unreadable output, upstream error, unsupported ecosystem) is recorded as failed instead of completed with zero findings.

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: VulnScanRequest

Responses

StatusDescriptionBody
200Vulnerability scan started (scan_status is scanning)application/json: VulnScanResult
400Invalid body or unknown scanner-
403Admin access required-
404Repository not found-

GET /api/v1/repositories/{name}/vuln/scanners ​

List vulnerability scanners

Report which vulnerability scanners can run on the server: osv is always ready; trivy and grype need their binary and a downloaded vulnerability database (see the scanning guide). A client should disable a scanner that is not ready and show its message.

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200Scanners in the order osv, trivy, grypeapplication/json: object
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Admin access required-

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
scannersarray of VulnScanneryes-

GET /api/v1/repositories/{name}/vuln/scans ​

List vulnerability scans

List vulnerability scans for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200List of vulnerability scansapplication/json: object
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
scansarray of VulnScanResultno-

GET /api/v1/repositories/{name}/vuln/scans/{id} ​

Get vulnerability scan

Get details of a specific vulnerability scan

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
200Vulnerability scan detailsapplication/json: VulnScanResult
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Scan not found-

DELETE /api/v1/repositories/{name}/vuln/scans/{id} ​

Delete vulnerability scan

Delete a vulnerability scan

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Responses

StatusDescriptionBody
204Vulnerability scan deleted-
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Scan not found-

POST /api/v1/repositories/{name}/vuln/scans/{id}/quarantine ​

Quarantine vulnerability scan artifact

Quarantine (quarantined: true) or release (quarantined: false) the artifact of a vulnerability scan (admin only).

Parameters

NameInTypeRequiredDescription
namepathstringyes-
idpathstring (uuid)yes-

Request body (required)

application/json: object

FieldTypeRequiredDescription
quarantinedbooleanyes-

Responses

StatusDescriptionBody
200Updated vulnerability scanapplication/json: VulnScanResult
400Invalid body-
403Admin access required-
404Repository or scan not found-

GET /api/v1/repositories/{name}/webhooks ​

List repository webhooks

List webhooks for a specific repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200List of webhooksapplication/json: object
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not found-

Fields of the 200 response (application/json):

FieldTypeRequiredDescription
webhooksarray of Webhookno-

POST /api/v1/repositories/{name}/webhooks ​

Create repository webhook

Create a new webhook for a repository

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: object

FieldTypeRequiredDescription
content_typestringno-
enabledbooleanno-
eventsarray of stringyesItems: one of: artifact.uploaded, artifact.deleted, repository.created, repository.deleted, artifact.restored, artifact.purged, repository.restored, repository.purged, bundle.promoted.
max_retriesintegerno-
namestringyes-
payload_formatstringnoDelivery body format. openartifact is the native JSON; cloudevents is CloudEvents 1.0 structured mode (application/cloudevents+json); slack, teams and discord are the services' incoming-webhook shapes. One of: openartifact, cloudevents, slack, teams, discord. Default: openartifact.
secretstringno-
ssl_verifybooleanno-
timeout_secondsintegerno-
urlstring (uri)yes-

Responses

StatusDescriptionBody
201Webhook createdapplication/json: Webhook
400Invalid requestapplication/json: Error
403Forbiddenapplication/json: Error
404Repository or addressed resource not foundapplication/json: Error

GET /api/v1/repository/{name} ​

Get repository

Get details of a specific repository

Security: bearerAuth or cookieAuth or .

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Responses

StatusDescriptionBody
200Repository detailsapplication/json: Repository
400Invalid request, including a NUL byte in the URL or the bodyapplication/json: Error
403Forbiddenapplication/json: Error
404Repository not found-

PATCH /api/v1/repository/{name} ​

Update repository

Update repository configuration. Requires global admin, or the maintainer or owner role in the repository's project; a caller with neither and no read access gets 404. A project maintainer may not send project (use the transfer route), blocked or presign_downloads, nor make the repository public unless the project allows public repositories (403); member_repos must be readable by the caller (403).

Parameters

NameInTypeRequiredDescription
namepathstringyes-

Request body (required)

application/json: object

FieldTypeRequiredDescription
blockedbooleanno-
cache_ttl_secondsintegerno-
descriptionstringno-
immutable_releasesbooleannoWhen true, deleting or overwriting a released version is refused with 409 (SNAPSHOT/pre-release versions stay mutable). An admin can override with ?force=true.
max_stale_secondsintegernoSeconds past a cached file's expiry during which it may still be served, with a Warning: 110 header, when the upstream is unreachable, times out or answers 5xx. 0 disables serve-stale; default 604800 (7 days); max 31536000.
member_reposarray of stringno-
merge_proxy_versionsbooleannoGroup repositories only, administrators only (403 otherwise). Absent leaves it unchanged.
negative_cache_ttl_secondsintegerno-
presign_downloadsbooleannoPer-repository override of storage.presignDownloads: true always redirects eligible blob downloads to a presigned object-store URL, false always streams, null inherits the global setting. Metadata and manifests are never redirected. Omit to leave unchanged; send null to inherit. Nullable.
projectstringnoMove the repository to the named project (global admin only; unknown project: 404). Access of the old and new project's members changes immediately.
publicbooleanno-
sign_packagesbooleannoHosted rpm repositories only (400 otherwise when true). When true, uploaded RPMs are signed with the active GPG key; existing packages are not re-signed.
trash_retention_daysintegernoAbsent leaves it unchanged; an explicit null resets it to the server default; 0..36500 sets it (0 = no trash). Nullable. Minimum: 0. Maximum: 36500.
upstream_passwordstringno-
upstream_urlstringno-
upstream_usernamestringno-

Responses

StatusDescriptionBody
200Repository updatedapplication/json: Repository
400Invalid request (for example trash_retention_days out of range)-
403Admin access required-
404Repository not found-

DELETE /api/v1/repository/{name} ​

Delete repository (to the trash)

Delete a repository (global admin, or maintainer or owner of its project). The request must confirm the repository name, as the confirm query parameter or a JSON body {"confirm": "<name>"}; otherwise 400 confirmation_required. When the repository's trash retention is above 0 the repository is moved to the trash (hidden everywhere, its name stays reserved, restorable and purged after the retention window); with retention 0 it is deleted permanently, contents included.

Parameters

NameInTypeRequiredDescription
namepathstringyes-
confirmquerystringnoMust equal the repository name (alternatively send it in the JSON body).

Request body

application/json: object

FieldTypeRequiredDescription
confirmstringnoMust equal the repository name.

Responses

StatusDescriptionBody
204Repository deleted (moved to the trash, or permanently deleted when retention is 0)-
400Missing or mismatched confirmation (error code confirmation_required)application/json: Error
403Admin access required-
404Repository not found-
409The repository is still referenced (for example by a release bundle or promotion); only possible when it is deleted permanently-

Free software under the AGPL-3.0-or-later.