Control Plane
All paths are relative to the registry base URL (https://registry.dodil.io, staging https://registry.dodil.io). {org} is your organization name; {reference} is a tag or URL-encoded digest. Auth and pagination conventions: API Reference.
List repositories
GET /{org}?page=1&page_size=15{
"items": [
{
"name": "web",
"project_name": "acme",
"artifact_count": 4,
"pull_count": 132,
"creation_time": "2026-07-02T09:11:40Z",
"update_time": "2026-08-01T10:14:02Z",
"public": false
}
],
"total_count": 2
}There is no create endpoint — a repository appears here after the first docker push to its name.
List artifacts
GET /{org}/{repo}/artifacts?page=1&page_size=15{
"items": [
{
"digest": "sha256:4f5c2a8b91d2…",
"tags": ["latest", "1.2.0"],
"size": 54923776,
"media_type": "application/vnd.docker.distribution.manifest.v2+json",
"push_time": "2026-08-01T10:14:02Z",
"pull_time": "2026-08-03T18:40:11Z",
"scan_overview": {
"scan_status": "Success",
"severity": "Low",
"total": 3,
"fixable": 1
}
}
],
"total_count": 4
}scan_overview is absent until the push-time scan has produced a result. size is bytes.
Delete artifact
DELETE /{org}/{repo}/artifacts/{reference}Deletes the artifact and all its tags; the reference may be any tag or the digest. Empty response on success.
List tags
GET /{org}/{repo}/artifacts/{reference}/tags?page=1&page_size=15{
"items": [
{ "name": "1.2.0", "push_time": "2026-08-01T10:14:02Z", "pull_time": "2026-08-03T18:40:11Z", "immutable": true },
{ "name": "latest", "push_time": "2026-08-01T10:14:02Z", "pull_time": "", "immutable": false }
],
"total_count": 2
}Vulnerability report
GET /{org}/{repo}/artifacts/{reference}/vulnerabilities{
"scan_status": "Success",
"severity": "High",
"total": 12,
"fixable": 7,
"vulnerabilities": [
{
"id": "CVE-2026-1234",
"severity": "High",
"package": "openssl",
"version": "3.0.11",
"fix_version": "3.0.14",
"description": "…",
"links": ["https://nvd.nist.gov/vuln/detail/CVE-2026-1234"]
}
]
}severity is the worst finding (Critical > High > Medium > Low > Negligible > None, or Unknown); fix_version is empty when no fixed release exists. Not paginated — the full report returns in one response.
Set visibility
PATCH /{org}/{repo}/visibility
Content-Type: application/json
{ "public": true }"public": true allows anonymous pulls; false returns the repository to private. Empty response on success.
Health
GET /health{ "status": "ok", "service": "registry" }See also
- Docker Registry v2 — the plane that moves image bytes
- CLI Guide — every endpoint here has a
dodil registrycommand