1
0
mirror of https://github.com/docker/docs.git synced 2026-10-23 18:09:02 +03:00
Files
docs/content/reference/api/dvp/latest.yaml
David Karlsson 9b1f7de05f docs: unify Hub, DVP, and Registry API references (#26048)
@netlify /reference/api/

[Preview the API
reference](https://deploy-preview-26048--docsdocker.netlify.app/reference/api/)

Adds a shared API reference experience for Hub, DVP, and Registry: a
catalog, operation navigation, linked schemas, request and response
examples, and matching HTML and Markdown output. A validation and
generation pipeline prepares the reference data for Hugo and runs as
part of Docker and Netlify builds.

Migrates the three specifications to OpenAPI 3.2, correcting response
shapes, nullable fields, and authentication and token examples. The Hub
migration also corrects SCIM contracts and CSV exports; DVP gains
complete report response schemas and examples. Registry keeps its
documented Hub-specific subset, with authentication and media
negotiation expressed through OpenAPI security and content fields.

Validation is strict for both checks and generation, with no exception
baseline or bypass flag. The build uses the migrated sources directly,
without migration scripts or records.

Page and specification URLs remain stable, including the DVP alias.
Operation and schema anchors change. Engine and Governance retain their
existing references.

Validated locally with Go tests, strict validation of all three
specifications (zero diagnostics), scoped formatting and lint, and a
full Hugo build checking all 176 HTML/Markdown page pairs, example
parity, reference links, and byte-identical published specifications. A
browser check confirmed raw CSV rendering and the generated request
header. No live API requests were made.
2026-09-17 16:56:32 +02:00

900 lines
28 KiB
YAML

openapi: 3.2.0
info:
title: DVP Data API
version: 1.0.0
x-logo:
url: https://docs.docker.com/assets/images/logo-docker-main.png
href: /reference
description: |
The Docker DVP Data API allows [Docker Verified Publishers](https://docs.docker.com/docker-hub/publish/) to view image pull analytics data for their namespaces. Analytics data can be retrieved in a CSV as raw data, or in a summary format.
#### Summary data
In your summary data CSV, you will have access to the data points listed below. You can request summary data for a complete week (Monday through Sunday) or for a complete month (available on the first day of the following month).
There are two levels of summary data:
- Repository-level, a summary of every namespace and repository
- Tag- or digest-level, a summary of every namespace, repository, and reference
(tag or digest)
The summary data formats contain the following data points:
- Unique IP address count
- Pulls by tag count
- Pulls by digest count
- Version check count
#### Raw data
In your raw data CSV you will have access to the data points listed below. You can request raw data for a complete week (Monday through Sunday) or for a complete month (available on the first day of the following month). **Note:** each action is represented as a single row.
- Type (industry)
- Host (cloud provider)
- Country (geolocation)
- Timestamp
- Namespace
- Repository
- Reference (digest is always included, tag is provided when available)
- HTTP request method
- Action, one of the following:
- Pull by tag
- Pull by digest
- Version check
- User-Agent
servers:
- url: https://hub.docker.com/api/publisher/analytics/v1
security:
- HubAuth: []
tags:
- name: authentication
summary: Authentication Endpoints
kind: nav
description: Authentication Endpoints reference.
- name: namespaces
summary: Namespace data
kind: nav
description: Namespace data reference.
- name: discovery
summary: Discovery
kind: nav
description: Discovery reference.
- name: responseDataFile
description: |
[ResponseDataFile](#schema-ResponseDataFile)
summary: ResponseDataFile
kind: info
- name: yearModel
description: |
[YearModel](#schema-YearModel)
summary: Year Data Model
kind: info
- name: monthModel
description: |
[MonthModel](#schema-MonthModel)
summary: Month Data Model
kind: info
- name: weekModel
description: |
[WeekModel](#schema-WeekModel)
summary: Week Data Model
kind: info
x-tagGroups:
- name: API
tags:
- authentication
- discovery
- namespaces
- name: Models
tags:
- responseDataFile
- yearModel
- monthModel
- weekModel
paths:
/v2/users/login:
servers:
- url: https://hub.docker.com
post:
security: []
tags:
- authentication
summary: Create an authentication token
operationId: PostUsersLogin
description: |
Creates and returns a bearer token in JWT format that you can use to
authenticate with Docker Hub APIs.
The returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.
Most Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UsersLoginRequest"
description: Login details.
required: true
responses:
"200":
description: Authentication successful
content:
application/json:
schema:
$ref: "#/components/schemas/PostUsersLoginSuccessResponse"
"401":
description: Authentication failed or second factor required
content:
application/json:
schema:
$ref: "#/components/schemas/PostUsersLoginErrorResponse"
/v2/users/2fa-login:
servers:
- url: https://hub.docker.com
post:
security: []
tags:
- authentication
summary: Second factor authentication
operationId: PostUsers2FALogin
description: |
When a user has 2FA enabled, this is the second call to perform after
`/v2/users/login` call.
Creates and returns a bearer token in JWT format that you can use to authenticate with Docker Hub APIs.
The returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.
Most Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/Users2FALoginRequest"
description: Login details.
required: true
responses:
"200":
description: Authentication successful
content:
application/json:
schema:
$ref: "#/components/schemas/PostUsersLoginSuccessResponse"
"401":
description: Authentication failed or second factor required
content:
application/json:
schema:
$ref: "#/components/schemas/PostUsers2FALoginErrorResponse"
/:
get:
tags:
- discovery
summary: Get namespaces and repos
description: Gets a list of your namespaces and repos which have data available.
operationId: getNamespaces
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/NamespaceData"
/namespaces:
get:
tags:
- discovery
summary: Get user's namespaces
description: Get metadata associated with the namespaces the user has access to, including extra repos associated with the namespaces.
operationId: getUserNamespaces
responses:
"200":
description: Success
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/NamespaceMetadata"
examples:
publishers:
summary: Namespace metadata
value:
- datasets:
- name: pulls
timespans:
- months
- weeks
views:
- raw
- summary
- repo-summary
- namespace-summary
- geo-repo-summary
extraRepos: null
namespace: org1
publisherType: DVP
extensionPublisher: false
"401":
description: Authentication failed or second factor required
/namespaces/{namespace}:
get:
tags:
- discovery
summary: Get namespace
description: Gets metadata associated with specified namespace, including extra repos associated with the namespace.
operationId: getNamespace
parameters:
- in: path
name: namespace
schema:
type: string
required: true
description: Namespace to fetch data for
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/NamespaceMetadata"
/namespaces/{namespace}/pulls:
get:
tags:
- namespaces
summary: Get pull data
description: Gets pulls for the given namespace.
operationId: getNamespacePulls
parameters:
- in: path
name: namespace
schema:
type: string
required: true
description: Namespace to fetch data for
- in: query
name: timespan
schema:
$ref: "#/components/schemas/TimespanType"
required: false
description: Timespan type for fetching data
- in: query
name: period
schema:
$ref: "#/components/schemas/PeriodType"
required: false
description: Relative period of the period to fetch data
- in: query
name: group
schema:
$ref: "#/components/schemas/GroupType"
required: false
description: Field to group the data by
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/PullData"
"404":
description: Not found - namespace doesn't exist or user does not have permission to access it
/namespaces/{namespace}/repos/{repo}/pulls:
get:
tags:
- namespaces
summary: Get pull data
description: Gets pulls for the given repo.
operationId: getRepoPulls
parameters:
- in: path
name: namespace
schema:
type: string
required: true
description: Namespace to fetch data for
- in: path
name: repo
schema:
type: string
required: true
description: Repository to fetch data for
- in: query
name: timespan
schema:
$ref: "#/components/schemas/TimespanType"
required: false
description: Timespan type for fetching data
- in: query
name: period
schema:
$ref: "#/components/schemas/PeriodType"
required: false
description: Relative period of the period to fetch data
- in: query
name: group
schema:
$ref: "#/components/schemas/GroupType"
required: false
description: Field to group the data by
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/PullData"
"404":
description: Not found - repo doesn't exist or user does not have permission to access it
/namespaces/{namespace}/pulls/exports/years:
get:
tags:
- namespaces
summary: Get years with data
description: Gets a list of years that have data for the given namespace.
operationId: getNamespaceYears
parameters:
- in: path
name: namespace
schema:
type: string
required: true
description: Namespace to fetch data for
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/YearData"
/namespaces/{namespace}/pulls/exports/years/{year}/{timespantype}:
get:
tags:
- namespaces
summary: Get timespans with data
description: Gets a list of timespans of the given type that have data for the given namespace and year.
operationId: getNamespaceTimespans
parameters:
- in: path
name: namespace
schema:
type: string
required: true
description: Namespace to fetch data for
- in: path
name: year
schema:
type: integer
required: true
description: Year to fetch data for
- in: path
name: timespantype
schema:
$ref: "#/components/schemas/TimespanType"
required: true
description: Type of timespan to fetch data for
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/TimespanData"
/namespaces/{namespace}/pulls/exports/years/{year}/{timespantype}/{timespan}:
get:
tags:
- namespaces
summary: Get namespace metadata for timespan
description: Gets info about data for the given namespace and timespan.
operationId: getNamespaceTimespanMetadata
parameters:
- in: path
name: namespace
schema:
type: string
required: true
description: Namespace to fetch data for
- in: path
name: year
schema:
type: integer
required: true
description: Year to fetch data for
- in: path
name: timespantype
schema:
$ref: "#/components/schemas/TimespanType"
required: true
description: Type of timespan to fetch data for
- in: path
name: timespan
schema:
type: integer
required: true
description: Timespan to fetch data for
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/TimespanModel"
"404":
description: Not Found
/namespaces/{namespace}/pulls/exports/years/{year}/{timespantype}/{timespan}/{dataview}:
get:
tags:
- namespaces
summary: Get namespace data for timespan
description: Gets a list of URLs that can be used to download the pull data for the given namespace and timespan.
operationId: getNamespaceDataByTimespan
parameters:
- in: path
name: namespace
schema:
type: string
required: true
description: Namespace to fetch data for
- in: path
name: year
schema:
type: integer
required: true
description: Year to fetch data for
- in: path
name: timespantype
schema:
$ref: "#/components/schemas/TimespanType"
required: true
description: Type of timespan to fetch data for
- in: path
name: timespan
schema:
type: integer
required: true
description: Timespan to fetch data for
- in: path
name: dataview
schema:
$ref: "#/components/schemas/DataviewType"
required: true
description: Type of data to fetch
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/ResponseData"
examples:
download:
summary: Illustrative download location
description: Use the signed URL returned by the API. The URL and file size in this example are illustrative.
value:
data:
- url: https://example.invalid/exports/pulls.csv.gz?X-Amz-Expires=21600&X-Amz-Signature=EXAMPLE
size: 1024
/repos/pulls:
get:
tags:
- namespaces
summary: Get pull data for multiple repos
description: Gets pull for the given repos.
operationId: getManyReposPulls
parameters:
- in: query
name: repos
schema:
type: array
items:
type: string
required: true
description: Repositories to fetch data for (maximum of 50 repositories per request).
- in: query
name: timespan
schema:
$ref: "#/components/schemas/TimespanType"
required: false
description: Timespan type for fetching data
- in: query
name: period
schema:
$ref: "#/components/schemas/PeriodType"
required: false
description: Relative period of the period to fetch data
- in: query
name: group
schema:
$ref: "#/components/schemas/GroupType"
required: false
description: Field to group the data by
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/ReposPullData"
components:
schemas:
UsersLoginRequest:
examples:
- username: myusername
password: hunter2
description: User login details
type: object
required:
- username
- password
properties:
username:
description: The username of the Docker Hub account to authenticate with.
type: string
example: myusername
password:
description: The password or personal access token (PAT) of the Docker Hub account to authenticate with.
type: string
example: hunter2
PostUsersLoginSuccessResponse:
examples:
- token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
description: successful user login response
type: object
properties:
token:
description: |
Created authentication token.
This token can be used in the HTTP Authorization header as a JWT to authenticate with the Docker Hub APIs.
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
PostUsersLoginErrorResponse:
examples:
- detail: Incorrect authentication credentials
description: failed user login response or second factor required
type: object
required:
- detail
properties:
detail:
description: Description of the error.
type: string
example: Incorrect authentication credentials
login_2fa_token:
description: Short-lived token to be used on `/v2/users/2fa-login` to complete the authentication. This field is present only if 2FA is enabled.
type:
- string
- "null"
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Users2FALoginRequest:
examples:
- login_2fa_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
code: "123456"
description: Second factor user login details
type: object
required:
- login_2fa_token
- code
properties:
login_2fa_token:
description: The intermediate 2FA token returned from `/v2/users/login` API.
type: string
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
code:
description: The Time-based One-Time Password of the Docker Hub account to authenticate with.
type: string
example: "123456"
PostUsers2FALoginErrorResponse:
examples:
- detail: Incorrect authentication credentials
description: failed second factor login response.
type: object
properties:
detail:
description: Description of the error.
type: string
example: Incorrect authentication credentials
ResponseData:
properties:
data:
type: array
description: Download URLs and file sizes for the export.
items:
$ref: "#/components/schemas/ResponseDataFile"
type: object
description: Download locations for the selected export. Large exports can span multiple files.
ResponseDataFile:
properties:
url:
type: string
format: uri
description: Signed download URL. URLs expire six hours after generation.
size:
type: integer
format: int64
description: Size of the file in bytes.
type: object
NamespaceData:
examples:
- namespaces:
- myorganization
properties:
namespaces:
type: array
items:
type: string
type: object
NamespaceMetadata:
properties:
namespace:
type: string
extraRepos:
type:
- array
- "null"
items:
type: string
description: Additional repositories associated with the namespace. Null when none are configured.
datasets:
type: array
items:
$ref: "#/components/schemas/DatasetModel"
publisherType:
type: string
description: Publisher program associated with the namespace.
extensionPublisher:
type: boolean
description: Whether the namespace is an extension publisher.
type: object
examples:
- datasets:
- name: pulls
timespans:
- months
- weeks
views:
- raw
- summary
- repo-summary
- namespace-summary
- geo-repo-summary
extraRepos: null
namespace: org1
publisherType: DVP
extensionPublisher: false
- datasets:
- name: pulls
timespans:
- months
- weeks
views:
- repo-summary
- namespace-summary
- name: extensions
timespans:
- months
- weeks
views:
- ext-summary
extraRepos: null
namespace: org4
publisherType: DVP
extensionPublisher: true
DatasetModel:
properties:
name:
$ref: "#/components/schemas/DatasetType"
views:
type: array
items:
$ref: "#/components/schemas/DataviewType"
timespans:
type: array
items:
$ref: "#/components/schemas/TimespanType"
type: object
description: Datasets and views available to the publisher, based on its entitlements.
PullData:
properties:
pulls:
type:
- array
- "null"
items:
$ref: "#/components/schemas/PullModel"
description: Pull statistics for the selected interval. Null when no records are returned.
type: object
examples:
- pulls:
- end: "2022-08-07T00:00:00Z"
pullCount: 11
repo: neo4j-admin
start: "2022-08-01T00:00:00Z"
ipCount: 10
- end: "2022-08-14T00:00:00Z"
pullCount: 11
repo: neo4j-admin
start: "2022-08-08T00:00:00Z"
ipCount: 10
- pulls: null
ReposPullData:
properties:
repos:
type: object
additionalProperties:
$ref: "#/components/schemas/PullData"
type: object
examples:
- repos:
org2/neo4j-admin:
pulls:
- end: "2022-08-07T00:00:00Z"
pullCount: 11
repo: neo4j-admin
start: "2022-08-01T00:00:00Z"
ipCount: 10
- end: "2022-08-14T00:00:00Z"
pullCount: 11
repo: neo4j-admin
start: "2022-08-08T00:00:00Z"
ipCount: 10
org2/neo4j:
pulls:
- end: "2022-08-07T00:00:00Z"
pullCount: 272407
repo: neo4j
start: "2022-08-01T00:00:00Z"
ipCount: 41490
- end: "2022-08-14T00:00:00Z"
pullCount: 272407
repo: neo4j
start: "2022-08-08T00:00:00Z"
ipCount: 41490
PullModel:
properties:
start:
type: string
format: date-time
description: Start of the reporting interval in RFC 3339 format.
end:
type: string
format: date-time
description: End of the reporting interval in RFC 3339 format.
repo:
type: string
description: Repository name. Present for results grouped by repository.
namespace:
type: string
description: Namespace name. Present for results grouped by namespace.
pullCount:
type: integer
ipCount:
type: integer
country:
type: string
description: Country. Present for results grouped by geography and repository.
type: object
YearData:
examples:
- years:
- year: 2025
properties:
years:
type: array
items:
$ref: "#/components/schemas/YearModel"
type: object
YearModel:
properties:
year:
type: integer
type: object
MonthData:
properties:
months:
type: array
items:
$ref: "#/components/schemas/MonthModel"
type: object
required:
- months
examples:
- months:
- month: 5
- month: 7
MonthModel:
properties:
month:
type: integer
type: object
required:
- month
examples:
- month: 7
WeekData:
properties:
weeks:
type: array
items:
$ref: "#/components/schemas/WeekModel"
type: object
required:
- weeks
examples:
- weeks:
- week: 31
- week: 32
WeekModel:
properties:
week:
type: integer
type: object
required:
- week
examples:
- week: 31
TimespanType:
type: string
enum:
- months
- weeks
PeriodType:
type: string
enum:
- last-2-months
- last-3-months
- last-6-months
- last-12-months
DataviewType:
type: string
enum:
- raw
- summary
- repo-summary
- namespace-summary
- geo-repo-summary
- ext-summary
- ext-premium-summary
- ext-premium-geo
DatasetType:
type: string
enum:
- pulls
- extensions
TimespanModel:
oneOf:
- $ref: "#/components/schemas/MonthModel"
- $ref: "#/components/schemas/WeekModel"
examples:
- month: 7
- week: 31
TimespanData:
oneOf:
- $ref: "#/components/schemas/MonthData"
- $ref: "#/components/schemas/WeekData"
examples:
- months:
- month: 5
- month: 7
- weeks:
- week: 31
- week: 32
GroupType:
type: string
enum:
- repo
- namespace
securitySchemes:
HubAuth:
type: http
scheme: bearer
bearerFormat: JWT
description: |
JWT Bearer Authentication is required to access the Docker DVP Data API.
This authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)
x-displayName: Docker Hub Authentication
jsonSchemaDialect: https://spec.openapis.org/oas/3.1/dialect/base
x-features-openapi:
schemaDefinitionsTagName: Schemas