diff --git a/.gitattributes b/.gitattributes index 5d685b7d139e..e79ba3c59a01 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11,3 +11,5 @@ content/**/*.md linguist-detectable /_vendor/** linguist-generated=true # Generated CLI reference data (vendored from upstream) /data/cli/** linguist-generated=true +# Generated API presentation data +/data/api-reference.json linguist-generated=true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 992f6e74850a..d3321d62e873 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,6 +72,7 @@ jobs: validate: runs-on: ubuntu-24.04 + continue-on-error: ${{ matrix.target == 'validate-api-reference' }} strategy: fail-fast: false matrix: @@ -83,6 +84,7 @@ jobs: - test-go-redirects - dockerfile-lint - validate-vendor + - validate-api-reference steps: - name: Checkout diff --git a/.prettierignore b/.prettierignore index de056073aff3..74756670b804 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,2 @@ **/*.md +/data/api-reference.json diff --git a/Dockerfile b/Dockerfile index c0d288a83d11..766ace607bb9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,11 +8,11 @@ ARG VALE_VERSION=3.17.0 ARG HUGO_VERSION=0.163.0 ARG NODE_VERSION=24 ARG PAGEFIND_VERSION=1.5.2 +ARG TARGETARCH # base defines the generic base stage FROM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS base RUN apk add --no-cache \ - bash \ git \ nodejs \ npm \ @@ -42,9 +42,6 @@ WORKDIR /project COPY --from=hugo /out/hugo /bin/hugo COPY --from=npm /out/node_modules node_modules COPY . . -RUN --mount=type=cache,target=/root/go/pkg/mod \ - --mount=type=cache,target=/root/.cache/go-build \ - ./hack/api-docs/run.sh test && ./hack/api-docs/run.sh generate # build creates production builds with Hugo FROM build-base AS build @@ -70,6 +67,37 @@ RUN node hack/api-docs/verify-output.mjs public FROM ghcr.io/rvben/rumdl:0.2.49-alpine AS lint RUN --mount=type=bind,target=. rumdl check content +# vacuum downloads the prebuilt validator for the target architecture +FROM scratch AS vacuum-amd64 +ADD --unpack --checksum=sha256:973b8ed30cd36533da4cdb76729e833324a3043bad48c74f61b6a1cc3df40b78 \ + https://github.com/daveshanley/vacuum/releases/download/v0.30.3/vacuum_0.30.3_linux_x86_64.tar.gz /out/ + +FROM scratch AS vacuum-arm64 +ADD --unpack --checksum=sha256:04b604df0b1b570d5abd58b577c816122da162eb8ba12a7f70c3060aec12b3a9 \ + https://github.com/daveshanley/vacuum/releases/download/v0.30.3/vacuum_0.30.3_linux_arm64.tar.gz /out/ + +FROM vacuum-${TARGETARCH} AS vacuum + +# validate-api-reference checks the vendored presentation data +FROM base AS validate-api-reference +RUN apk add --no-cache bash +WORKDIR /project +COPY --from=vacuum /out/vacuum /usr/local/bin/vacuum +COPY hack/api-docs ./hack/api-docs +COPY content/reference/api ./content/reference/api +COPY data/api-reference.json ./data/api-reference.json +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build <<"EOT" +set -eu +cp data/api-reference.json /tmp/api-reference-committed.json +./hack/api-docs/run.sh test +./hack/api-docs/run.sh generate +if ! cmp -s /tmp/api-reference-committed.json data/api-reference.json; then + echo >&2 'ERROR: API reference data is stale. Run ./hack/api-docs/run.sh generate and commit data/api-reference.json.' + exit 1 +fi +EOT + # test validates HTML output and checks for broken links FROM wjdp/htmltest:v${HTMLTEST_VERSION} AS test WORKDIR /test diff --git a/compose.yaml b/compose.yaml index 6e3e0a1e1882..b25ecb95c8e1 100644 --- a/compose.yaml +++ b/compose.yaml @@ -11,19 +11,3 @@ services: - action: sync path: . target: /project - ignore: - - hack/api-docs/ - - content/reference/api/hub/latest.yaml - - content/reference/api/dvp/latest.yaml - - content/reference/api/registry/latest.yaml - - content/reference/api/ai-governance/api.yaml - - action: rebuild - path: hack/api-docs - - action: rebuild - path: content/reference/api/hub/latest.yaml - - action: rebuild - path: content/reference/api/dvp/latest.yaml - - action: rebuild - path: content/reference/api/registry/latest.yaml - - action: rebuild - path: content/reference/api/ai-governance/api.yaml diff --git a/content/reference/api/_content.gotmpl b/content/reference/api/_content.gotmpl index be5cc328dc43..d3e104d9fa40 100644 --- a/content/reference/api/_content.gotmpl +++ b/content/reference/api/_content.gotmpl @@ -1,6 +1,6 @@ {{- $data := index hugo.Data "api-reference" -}} {{- if not $data }} - {{ errorf "API reference data missing: run ./hack/api-docs/run.sh generate before Hugo" }} + {{ errorf "API reference data missing: regenerate data/api-reference.json with ./hack/api-docs/run.sh generate" }} {{ end -}} {{- if ne (int $data.modelVersion) 1 }} {{ errorf "Unsupported API presentation model version" }} diff --git a/data/api-reference.json b/data/api-reference.json new file mode 100644 index 000000000000..df187b8cac52 --- /dev/null +++ b/data/api-reference.json @@ -0,0 +1,52896 @@ +{ + "apis": [ + { + "connection": "hosted", + "description": "Docker Hub is a service provided by Docker for finding and sharing container images with your team.\n\nIt is the world's largest library and community for container images.\n\nIn addition to the [Docker Hub UI](https://docs.docker.com/docker-hub/) and [Docker Hub CLI tool](https://github.com/docker/hub-tool#readme) (currently experimental), Docker provides an API that allows you to interact with Docker Hub.\n\nBrowse through the Docker Hub API documentation to explore the supported endpoints.\n", + "diagnostics": [], + "digest": "46c09f04fd8e7b3fe464c9b406a1bf8a0a6a164c87083f57ebbab64ccb7c8d3f", + "exampleCount": 315, + "experimental": false, + "guides": [ + "/manuals/security/provisioning/scim/provision-scim.md" + ], + "id": "hub", + "manual": "/manuals/docker-hub/", + "operations": [ + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/access-tokens'", + "curlNotes": [], + "deprecated": null, + "description": "Returns a paginated list of personal access tokens.", + "id": "getV2AccessTokens", + "line": 325, + "method": "GET", + "parameters": [ + { + "description": "Page number to return.", + "in": "query", + "name": "page", + "pointer": "/paths/~1v2~1access-tokens/get/parameters/0", + "schema": { + "default": 1, + "type": "number" + } + }, + { + "description": "Number of results per page.", + "in": "query", + "name": "page_size", + "pointer": "/paths/~1v2~1access-tokens/get/parameters/1", + "schema": { + "default": 10, + "type": "number" + } + } + ], + "path": "/v2/access-tokens", + "pointer": "/paths/~1v2~1access-tokens/get", + "raw": { + "description": "Returns a paginated list of personal access tokens.", + "operationId": "getV2AccessTokens", + "parameters": [ + { + "description": "Page number to return.", + "in": "query", + "name": "page", + "schema": { + "default": 1, + "type": "number" + } + }, + { + "description": "Number of results per page.", + "in": "query", + "name": "page_size", + "schema": { + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getAccessTokensResponse" + } + } + }, + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "List personal access tokens", + "tags": [ + "access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/BadRequest", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/getAccessTokensResponse", + "url": "/reference/api/hub/latest/schemas/getAccessTokensResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List personal access tokens", + "tags": [ + "access-tokens" + ], + "url": "/reference/api/hub/latest/operations/getV2AccessTokens/", + "variants": [ + { + "description": "OK", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"active_count\": 1,\n \"count\": 1,\n \"next\": null,\n \"previous\": null,\n \"results\": [\n {\n \"client_id\": \"HUB\",\n \"created_at\": \"2021-07-20T12:00:00.000000Z\",\n \"creator_ip\": \"127.0.0.1\",\n \"creator_ua\": \"some user agent\",\n \"expires_at\": \"2021-10-28T18:30:19.520861Z\",\n \"generated_by\": \"manual\",\n \"is_active\": true,\n \"last_used\": null,\n \"scopes\": [\n \"repo:read\"\n ],\n \"token\": \"***\",\n \"token_label\": \"My read only token\",\n \"uuid\": \"b30bbf97-506c-4ecd-aabc-842f3cb484fb\"\n }\n ]\n}", + "value": { + "active_count": 1, + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "client_id": "HUB", + "created_at": "2021-07-20T12:00:00.000000Z", + "creator_ip": "127.0.0.1", + "creator_ua": "some user agent", + "expires_at": "2021-10-28T18:30:19.520861Z", + "generated_by": "manual", + "is_active": true, + "last_used": null, + "scopes": [ + "repo:read" + ], + "token": "***", + "token_label": "My read only token", + "uuid": "b30bbf97-506c-4ecd-aabc-842f3cb484fb" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/getAccessTokensResponse" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens/get/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"scopes\": [\n \"repo:read\"\n ],\n \"token_label\": \"My read only token\"\n}' \\\n 'https://hub.docker.com/v2/access-tokens'", + "curlNotes": [], + "deprecated": null, + "description": "Creates and returns a personal access token.", + "id": "postV2AccessTokens", + "line": 300, + "method": "POST", + "parameters": [], + "path": "/v2/access-tokens", + "pointer": "/paths/~1v2~1access-tokens/post", + "raw": { + "description": "Creates and returns a personal access token.", + "operationId": "postV2AccessTokens", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createAccessTokenRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createAccessTokensResponse" + } + } + }, + "description": "Created" + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Create personal access token", + "tags": [ + "access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/BadRequest", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/createAccessTokenRequest", + "url": "/reference/api/hub/latest/schemas/createAccessTokenRequest/" + }, + { + "ref": "#/components/schemas/createAccessTokensResponse", + "url": "/reference/api/hub/latest/schemas/createAccessTokensResponse/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/createAccessTokenRequest" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Create personal access token", + "tags": [ + "access-tokens" + ], + "url": "/reference/api/hub/latest/operations/postV2AccessTokens/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"scopes\": [\n \"repo:read\"\n ],\n \"token_label\": \"My read only token\"\n}", + "value": { + "scopes": [ + "repo:read" + ], + "token_label": "My read only token" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/createAccessTokenRequest" + }, + "status": "" + }, + { + "description": "Created", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"client_id\": \"HUB\",\n \"created_at\": \"2021-07-20T12:00:00.000000Z\",\n \"creator_ip\": \"127.0.0.1\",\n \"creator_ua\": \"some user agent\",\n \"expires_at\": \"2021-10-28T18:30:19.520861Z\",\n \"generated_by\": \"manual\",\n \"is_active\": true,\n \"last_used\": null,\n \"scopes\": [\n \"repo:read\"\n ],\n \"token\": \"a7a5ef25-8889-43a0-8cc7-f2a94268e861\",\n \"token_label\": \"My read only token\",\n \"uuid\": \"b30bbf97-506c-4ecd-aabc-842f3cb484fb\"\n}", + "value": { + "client_id": "HUB", + "created_at": "2021-07-20T12:00:00.000000Z", + "creator_ip": "127.0.0.1", + "creator_ua": "some user agent", + "expires_at": "2021-10-28T18:30:19.520861Z", + "generated_by": "manual", + "is_active": true, + "last_used": null, + "scopes": [ + "repo:read" + ], + "token": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "token_label": "My read only token", + "uuid": "b30bbf97-506c-4ecd-aabc-842f3cb484fb" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/createAccessTokensResponse" + }, + "status": "201" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens/post/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/access-tokens/\u003cUUID\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Returns a personal access token by UUID.", + "id": "getV2AccessTokensByUuid", + "line": 391, + "method": "GET", + "parameters": [ + { + "description": "UUID of the personal access token.", + "in": "path", + "name": "uuid", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/access-tokens/{uuid}", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/get", + "raw": { + "description": "Returns a personal access token by UUID.", + "operationId": "getV2AccessTokensByUuid", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/accessToken" + }, + { + "properties": { + "token": { + "example": "***", + "type": "string" + } + }, + "type": "object" + } + ], + "examples": [ + { + "client_id": "HUB", + "created_at": "2021-07-20T12:00:00.000000Z", + "creator_ip": "127.0.0.1", + "creator_ua": "some user agent", + "expires_at": "2021-10-28T18:30:19.520861Z", + "generated_by": "manual", + "is_active": true, + "last_used": null, + "scopes": [ + "repo:read" + ], + "token": "***", + "token_label": "My read only token", + "uuid": "b30bbf97-506c-4ecd-aabc-842f3cb484fb" + } + ] + } + } + }, + "description": "OK" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Get personal access token", + "tags": [ + "access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/accessToken", + "url": "/reference/api/hub/latest/schemas/accessToken/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get personal access token", + "tags": [ + "access-tokens" + ], + "url": "/reference/api/hub/latest/operations/getV2AccessTokensByUuid/", + "variants": [ + { + "description": "OK", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"client_id\": \"HUB\",\n \"created_at\": \"2021-07-20T12:00:00.000000Z\",\n \"creator_ip\": \"127.0.0.1\",\n \"creator_ua\": \"some user agent\",\n \"expires_at\": \"2021-10-28T18:30:19.520861Z\",\n \"generated_by\": \"manual\",\n \"is_active\": true,\n \"last_used\": null,\n \"scopes\": [\n \"repo:read\"\n ],\n \"token\": \"***\",\n \"token_label\": \"My read only token\",\n \"uuid\": \"b30bbf97-506c-4ecd-aabc-842f3cb484fb\"\n}", + "value": { + "client_id": "HUB", + "created_at": "2021-07-20T12:00:00.000000Z", + "creator_ip": "127.0.0.1", + "creator_ua": "some user agent", + "expires_at": "2021-10-28T18:30:19.520861Z", + "generated_by": "manual", + "is_active": true, + "last_used": null, + "scopes": [ + "repo:read" + ], + "token": "***", + "token_label": "My read only token", + "uuid": "b30bbf97-506c-4ecd-aabc-842f3cb484fb" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/accessToken" + }, + { + "properties": { + "token": { + "example": "***", + "type": "string" + } + }, + "type": "object" + } + ], + "examples": [ + { + "client_id": "HUB", + "created_at": "2021-07-20T12:00:00.000000Z", + "creator_ip": "127.0.0.1", + "creator_ua": "some user agent", + "expires_at": "2021-10-28T18:30:19.520861Z", + "generated_by": "manual", + "is_active": true, + "last_used": null, + "scopes": [ + "repo:read" + ], + "token": "***", + "token_label": "My read only token", + "uuid": "b30bbf97-506c-4ecd-aabc-842f3cb484fb" + } + ] + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://hub.docker.com/v2/access-tokens/\u003cUUID\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Deletes a personal access token permanently. This cannot be undone.\n", + "id": "deleteV2AccessTokensByUuid", + "line": 430, + "method": "DELETE", + "parameters": [ + { + "description": "UUID of the personal access token.", + "in": "path", + "name": "uuid", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/access-tokens/{uuid}", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/delete", + "raw": { + "description": "Deletes a personal access token permanently. This cannot be undone.\n", + "operationId": "deleteV2AccessTokensByUuid", + "responses": { + "204": { + "description": "A successful response." + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Delete personal access token", + "tags": [ + "access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Delete personal access token", + "tags": [ + "access-tokens" + ], + "url": "/reference/api/hub/latest/operations/deleteV2AccessTokensByUuid/", + "variants": [ + { + "description": "A successful response.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/delete/responses/204", + "status": "204" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/delete/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/delete/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PATCH \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"is_active\": false,\n \"token_label\": \"My read only token\"\n}' \\\n 'https://hub.docker.com/v2/access-tokens/\u003cUUID\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Updates a personal access token partially. You can either update the token's label or enable/disable it.\n", + "id": "patchV2AccessTokensByUuid", + "line": 365, + "method": "PATCH", + "parameters": [ + { + "description": "UUID of the personal access token.", + "in": "path", + "name": "uuid", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/access-tokens/{uuid}", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/patch", + "raw": { + "description": "Updates a personal access token partially. You can either update the token's label or enable/disable it.\n", + "operationId": "patchV2AccessTokensByUuid", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/patchAccessTokenRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/patchAccessTokenResponse" + } + } + }, + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Update personal access token", + "tags": [ + "access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/BadRequest", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/patchAccessTokenRequest", + "url": "/reference/api/hub/latest/schemas/patchAccessTokenRequest/" + }, + { + "ref": "#/components/schemas/patchAccessTokenResponse", + "url": "/reference/api/hub/latest/schemas/patchAccessTokenResponse/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/patchAccessTokenRequest" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Update personal access token", + "tags": [ + "access-tokens" + ], + "url": "/reference/api/hub/latest/operations/patchV2AccessTokensByUuid/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"is_active\": false,\n \"token_label\": \"My read only token\"\n}", + "value": { + "is_active": false, + "token_label": "My read only token" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/patch/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/patchAccessTokenRequest" + }, + "status": "" + }, + { + "description": "OK", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"client_id\": \"HUB\",\n \"created_at\": \"2021-07-20T12:00:00.000000Z\",\n \"creator_ip\": \"127.0.0.1\",\n \"creator_ua\": \"some user agent\",\n \"expires_at\": \"2021-10-28T18:30:19.520861Z\",\n \"generated_by\": \"manual\",\n \"is_active\": true,\n \"last_used\": null,\n \"scopes\": [\n \"repo:read\"\n ],\n \"token\": \"***\",\n \"token_label\": \"My read only token\",\n \"uuid\": \"b30bbf97-506c-4ecd-aabc-842f3cb484fb\"\n}", + "value": { + "client_id": "HUB", + "created_at": "2021-07-20T12:00:00.000000Z", + "creator_ip": "127.0.0.1", + "creator_ua": "some user agent", + "expires_at": "2021-10-28T18:30:19.520861Z", + "generated_by": "manual", + "is_active": true, + "last_used": null, + "scopes": [ + "repo:read" + ], + "token": "***", + "token_label": "My read only token", + "uuid": "b30bbf97-506c-4ecd-aabc-842f3cb484fb" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/patch/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/patchAccessTokenResponse" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/patch/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1access-tokens~1{uuid}/patch/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/auditlogs/\u003cACCOUNT\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "List audit log events for a given namespace.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "AuditLogs_ListAuditLogs", + "line": 754, + "method": "GET", + "parameters": [ + { + "description": "Namespace to query audit logs for.", + "in": "path", + "name": "account", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "action name one of [\"repo.tag.push\", ...]. Optional parameter to filter specific audit log actions.\n", + "in": "query", + "name": "action", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/parameters/1", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "name. Optional parameter to filter audit log events to a specific name. For repository events, this is the name of the repository. For organization events, this is the name of the organization. For team member events, this is the username of the team member.\n", + "in": "query", + "name": "name", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/parameters/2", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "actor name. Optional parameter to filter audit log events to the specific user who triggered the event.\n", + "in": "query", + "name": "actor", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/parameters/3", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Start of the time window you wish to query audit events for.", + "in": "query", + "name": "from", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/parameters/4", + "required": false, + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "description": "End of the time window you wish to query audit events for.", + "in": "query", + "name": "to", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/parameters/5", + "required": false, + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "description": "page - specify page number. Page number to get.", + "in": "query", + "name": "page", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/parameters/6", + "required": false, + "schema": { + "default": 1, + "format": "int32", + "type": "integer" + } + }, + { + "description": "page_size - specify page size. Number of events to return per page.", + "in": "query", + "name": "page_size", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/parameters/7", + "required": false, + "schema": { + "default": 25, + "format": "int32", + "type": "integer" + } + } + ], + "path": "/v2/auditlogs/{account}", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get", + "raw": { + "description": "List audit log events for a given namespace.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "AuditLogs_ListAuditLogs", + "parameters": [ + { + "description": "Namespace to query audit logs for.", + "in": "path", + "name": "account", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "action name one of [\"repo.tag.push\", ...]. Optional parameter to filter specific audit log actions.\n", + "in": "query", + "name": "action", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "name. Optional parameter to filter audit log events to a specific name. For repository events, this is the name of the repository. For organization events, this is the name of the organization. For team member events, this is the username of the team member.\n", + "in": "query", + "name": "name", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "actor name. Optional parameter to filter audit log events to the specific user who triggered the event.\n", + "in": "query", + "name": "actor", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Start of the time window you wish to query audit events for.", + "in": "query", + "name": "from", + "required": false, + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "description": "End of the time window you wish to query audit events for.", + "in": "query", + "name": "to", + "required": false, + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "description": "page - specify page number. Page number to get.", + "in": "query", + "name": "page", + "required": false, + "schema": { + "default": 1, + "format": "int32", + "type": "integer" + } + }, + { + "description": "page_size - specify page size. Number of events to return per page.", + "in": "query", + "name": "page_size", + "required": false, + "schema": { + "default": 25, + "format": "int32", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "response": { + "value": { + "logs": [ + { + "account": "docker", + "action": "repo.tag.push", + "action_description": "pushed the tag latest with the digest sha256:c1ae9c435032a to the repository docker/example\n", + "actor": "docker", + "data": { + "digest": "sha256:c1ae9c435032a276f80220c7d9b40f76266bbe79243d34f9cda30b76fe114dfa", + "tag": "latest" + }, + "name": "docker/example", + "timestamp": "2021-02-19T01:34:35Z" + }, + { + "account": "docker", + "action": "offload.lease.end", + "action_description": "offload lease 'l_3EgPuRCjtUqT279CFPOQWcO8zOf' ended, ran for '12m22s'", + "actor": "docker", + "data": { + "lease_id": "l_3EgPuRCjtUqT279CFPOQWcO8zOf", + "org_id": "b908ca6e-b9a9-4a53-a9a5-6bec96f72432", + "resource_type": "run_4cpu_8mem", + "started_at": "2026-06-04T18:24:21Z", + "updated_at": "2026-06-04T18:36:43Z", + "user_id": "ecae6747-e42c-43cb-925d-cfce1ab32b02" + }, + "name": "docker", + "timestamp": "2026-06-04T18:36:43Z" + } + ] + } + } + }, + "schema": { + "$ref": "#/components/schemas/GetAuditLogsResponse" + } + } + }, + "description": "A successful response." + }, + "429": { + "content": { + "application/json": { + "examples": { + "response": { + "value": { + "detail": "Rate limit exceeded", + "error": false + } + } + }, + "schema": {} + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "examples": { + "error": { + "summary": "Example error response", + "value": { + "errinfo": null, + "message": "internal error" + } + } + }, + "schema": { + "$ref": "#/components/schemas/error" + } + } + }, + "description": "" + }, + "default": { + "content": { + "application/json": { + "examples": { + "error": { + "summary": "Example error response", + "value": { + "errinfo": null, + "message": "internal error" + } + } + }, + "schema": { + "$ref": "#/components/schemas/error" + } + } + }, + "description": "An unexpected error response." + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "List audit log events", + "tags": [ + "audit-logs" + ] + }, + "references": [ + { + "ref": "#/components/schemas/GetAuditLogsResponse", + "url": "/reference/api/hub/latest/schemas/GetAuditLogsResponse/" + }, + { + "ref": "#/components/schemas/error", + "url": "/reference/api/hub/latest/schemas/error/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List audit log events", + "tags": [ + "audit-logs" + ], + "url": "/reference/api/hub/latest/operations/AuditLogs_ListAuditLogs/", + "variants": [ + { + "description": "A successful response.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "response", + "text": "{\n \"logs\": [\n {\n \"account\": \"docker\",\n \"action\": \"repo.tag.push\",\n \"action_description\": \"pushed the tag latest with the digest sha256:c1ae9c435032a to the repository docker/example\\n\",\n \"actor\": \"docker\",\n \"data\": {\n \"digest\": \"sha256:c1ae9c435032a276f80220c7d9b40f76266bbe79243d34f9cda30b76fe114dfa\",\n \"tag\": \"latest\"\n },\n \"name\": \"docker/example\",\n \"timestamp\": \"2021-02-19T01:34:35Z\"\n },\n {\n \"account\": \"docker\",\n \"action\": \"offload.lease.end\",\n \"action_description\": \"offload lease 'l_3EgPuRCjtUqT279CFPOQWcO8zOf' ended, ran for '12m22s'\",\n \"actor\": \"docker\",\n \"data\": {\n \"lease_id\": \"l_3EgPuRCjtUqT279CFPOQWcO8zOf\",\n \"org_id\": \"b908ca6e-b9a9-4a53-a9a5-6bec96f72432\",\n \"resource_type\": \"run_4cpu_8mem\",\n \"started_at\": \"2026-06-04T18:24:21Z\",\n \"updated_at\": \"2026-06-04T18:36:43Z\",\n \"user_id\": \"ecae6747-e42c-43cb-925d-cfce1ab32b02\"\n },\n \"name\": \"docker\",\n \"timestamp\": \"2026-06-04T18:36:43Z\"\n }\n ]\n}", + "value": { + "logs": [ + { + "account": "docker", + "action": "repo.tag.push", + "action_description": "pushed the tag latest with the digest sha256:c1ae9c435032a to the repository docker/example\n", + "actor": "docker", + "data": { + "digest": "sha256:c1ae9c435032a276f80220c7d9b40f76266bbe79243d34f9cda30b76fe114dfa", + "tag": "latest" + }, + "name": "docker/example", + "timestamp": "2021-02-19T01:34:35Z" + }, + { + "account": "docker", + "action": "offload.lease.end", + "action_description": "offload lease 'l_3EgPuRCjtUqT279CFPOQWcO8zOf' ended, ran for '12m22s'", + "actor": "docker", + "data": { + "lease_id": "l_3EgPuRCjtUqT279CFPOQWcO8zOf", + "org_id": "b908ca6e-b9a9-4a53-a9a5-6bec96f72432", + "resource_type": "run_4cpu_8mem", + "started_at": "2026-06-04T18:24:21Z", + "updated_at": "2026-06-04T18:36:43Z", + "user_id": "ecae6747-e42c-43cb-925d-cfce1ab32b02" + }, + "name": "docker", + "timestamp": "2026-06-04T18:36:43Z" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/GetAuditLogsResponse" + }, + "status": "200" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "response", + "text": "{\n \"detail\": \"Rate limit exceeded\",\n \"error\": false\n}", + "value": { + "detail": "Rate limit exceeded", + "error": false + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/responses/429/content/application~1json", + "required": null, + "schema": {}, + "status": "429" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"internal error\"\n}", + "value": { + "errinfo": null, + "message": "internal error" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "500" + }, + { + "description": "An unexpected error response.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"internal error\"\n}", + "value": { + "errinfo": null, + "message": "internal error" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auditlogs~1{account}/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/auditlogs/\u003cACCOUNT\u003e/actions'", + "curlNotes": [], + "deprecated": null, + "description": "List audit log actions for a namespace to be used as a filter for querying audit log events.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "AuditLogs_ListAuditActions", + "line": 447, + "method": "GET", + "parameters": [ + { + "description": "Namespace to query audit log actions for.", + "in": "path", + "name": "account", + "pointer": "/paths/~1v2~1auditlogs~1{account}~1actions/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/auditlogs/{account}/actions", + "pointer": "/paths/~1v2~1auditlogs~1{account}~1actions/get", + "raw": { + "description": "List audit log actions for a namespace to be used as a filter for querying audit log events.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "AuditLogs_ListAuditActions", + "parameters": [ + { + "description": "Namespace to query audit log actions for.", + "in": "path", + "name": "account", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "response": { + "value": { + "actions": { + "billing": { + "actions": [ + { + "description": "Occurs when your organization’s billing plan is upgraded to a higher tier plan.", + "label": "Plan Upgraded", + "name": "plan.upgrade" + }, + { + "description": "Occurs when your organization’s billing plan is downgraded to a lower tier plan.", + "label": "Plan Downgraded", + "name": "plan.downgrade" + }, + { + "description": "Occurs when a seat is added to your organization’s billing plan.", + "label": "Seat Added", + "name": "plan.seat_add" + }, + { + "description": "Occurs when a seat is removed from your organization’s billing plan.", + "label": "Seat Removed", + "name": "plan.seat_remove" + }, + { + "description": "Occurs when there is a change in the recurring interval that your organization is charged.", + "label": "Billing Cycle Changed", + "name": "plan.cycle_change" + }, + { + "description": "Occurs when a scheduled plan downgrade for your organization is canceled.", + "label": "Plan Downgrade Canceled", + "name": "plan.downgrade_cancel" + }, + { + "description": "Occurs when a scheduled seat removal for an organization’s billing plan is canceled.", + "label": "Seat Removal Canceled", + "name": "plan.seat_removal_cancel" + }, + { + "description": "Occurs when a user in your organization requests a plan upgrade.", + "label": "Plan Upgrade Requested", + "name": "plan.upgrade.request" + }, + { + "description": "Occurs when a user in your organization requests a plan downgrade.", + "label": "Plan Downgrade Requested", + "name": "plan.downgrade.request" + }, + { + "description": "Occurs when a user in your organization requests an increase in the number of seats.", + "label": "Seat Addition Requested", + "name": "plan.seat_add.request" + }, + { + "description": "Occurs when a user in your organization requests a decrease in the number of seats.", + "label": "Seat Removal Requested", + "name": "plan.seat_removal.request" + }, + { + "description": "Occurs when a user in your organization requests a change in the billing cycle.", + "label": "Billing Cycle Change Requested", + "name": "plan.cycle_change.request" + }, + { + "description": "Occurs when a user in your organization requests a cancellation of a scheduled plan downgrade.", + "label": "Plan Downgrade Cancellation Requested", + "name": "plan.downgrade_cancel.request" + }, + { + "description": "Occurs when a user in your organization requests a cancellation of a scheduled seat removal.", + "label": "Seat Removal Cancellation Requested", + "name": "plan.seat_removal_cancel.request" + }, + { + "description": "Occurs when there is a change in the product that your organization subscribes to.", + "label": "Billing Product Changed", + "name": "plan.product_change" + } + ], + "label": "Billing" + }, + "enterprise": { + "actions": [ + { + "description": "Details of adding an admin settings policy", + "label": "Policy created", + "name": "setting.policy.create" + }, + { + "description": "Details of updating an admin settings policy", + "label": "Policy updated", + "name": "setting.policy.update" + }, + { + "description": "Details of deleting an admin settings policy", + "label": "Policy deleted", + "name": "setting.policy.delete" + }, + { + "description": "Details of transferring an admin settings policy to another owner", + "label": "Policy transferred", + "name": "setting.policy.transfer" + }, + { + "description": "Details of creating a new org/company SSO connection", + "label": "Create SSO Connection", + "name": "sso.connection.create" + }, + { + "description": "Details of updating an existing org/company SSO connection", + "label": "Update SSO Connection", + "name": "sso.connection.update" + }, + { + "description": "Details of deleting an existing org/company SSO connection", + "label": "Delete SSO Connection", + "name": "sso.connection.delete" + }, + { + "description": "Details of toggling enforcement on an existing org/company SSO connection", + "label": "Enforce SSO", + "name": "sso.connection.enforcement_toggle" + }, + { + "description": "Details of toggling SCIM on an existing org/company SSO connection", + "label": "Enforce SCIM", + "name": "sso.connection.scim_toggle" + }, + { + "description": "Details of a SCIM token refresh on an existing org/company SSO connection", + "label": "Refresh SCIM Token", + "name": "sso.connection.scim_token_refresh" + }, + { + "description": "Details of a connection type change on an existing org/company SSO connection", + "label": "Change SSO Connection Type", + "name": "sso.connection.connection_type_change" + }, + { + "description": "Details of a JIT toggle on an existing org/company SSO connection", + "label": "Toggle JIT provisioning", + "name": "sso.connection.jit_toggle" + } + ], + "label": "Enterprise" + }, + "offload": { + "actions": [ + { + "description": "Details of the started Offload lease.", + "label": "Offload lease start", + "name": "lease.start" + }, + { + "description": "Details of the ended Offload lease.", + "label": "Offload lease end", + "name": "lease.end" + } + ], + "label": "Offload" + }, + "oidc": { + "actions": [ + { + "description": "Details of creating an OIDC connection.", + "label": "OIDC connection created", + "name": "connection.create" + }, + { + "description": "Details of updating an OIDC connection.", + "label": "OIDC connection updated", + "name": "connection.update" + }, + { + "description": "Details of deleting an OIDC connection.", + "label": "OIDC connection deleted", + "name": "connection.delete" + } + ], + "label": "OIDC" + }, + "org": { + "actions": [ + { + "description": "Activities related to the creation of a new organization", + "label": "Organization Created", + "name": "create" + }, + { + "description": "Details of the member added to your organization", + "label": "Organization Member Added", + "name": "member.add" + }, + { + "description": "Details about the member removed from your organization", + "label": "Organization Member Removed", + "name": "member.remove" + }, + { + "description": "Details about the role changed for a member in your organization", + "label": "Member Role Changed", + "name": "member.role.change" + }, + { + "description": "Details of the member invited to your organization", + "label": "Org Member Invited", + "name": "member.invite.send" + }, + { + "description": "Activities related to the creation of a team", + "label": "Organization Created", + "name": "team.create" + }, + { + "description": "Activities related to the modification of a team", + "label": "Organization Deleted", + "name": "team.update" + }, + { + "description": "Activities related to the deletion of a team", + "label": "Organization Deleted", + "name": "team.delete" + }, + { + "description": "Details of the member added to your team", + "label": "Team Member Added", + "name": "team.member.add" + }, + { + "description": "Details of the member removed from your team", + "label": "Team Member Removed", + "name": "team.member.remove" + }, + { + "description": "Details of the single sign-on domain added to your organization", + "label": "Single Sign-On domain added", + "name": "domain.create" + }, + { + "description": "Details of the single sign-on domain verified for your organization", + "label": "Single Sign-On domain verified", + "name": "domain.verify" + }, + { + "description": "Details of the single sign-on domain removed from your organization", + "label": "Single Sign-On domain deleted", + "name": "domain.delete" + }, + { + "description": "Details of toggling the Auto-Provisioning feature on a domain on or off", + "label": "Organization Auto-Provisioning Toggled", + "name": "domain.auto-provisioning.toggle" + }, + { + "description": "Details related to the organization setting that was updated", + "label": "Organization Settings Updated", + "name": "settings.update" + }, + { + "description": "Activities related to enabling Registry Access Management", + "label": "Registry Access Management enabled", + "name": "registry_access.enabled" + }, + { + "description": "Activities related to disabling Registry Access Management", + "label": "Registry Access Management disabled", + "name": "registry_access.disabled" + }, + { + "description": "Activities related to the addition of a registry", + "label": "Registry Access Management registry added", + "name": "registry_access.registry_added" + }, + { + "description": "Details related to the registry that was updated", + "label": "Registry Access Management registry updated", + "name": "registry_access.registry_updated" + }, + { + "description": "Activities related to the removal of a registry", + "label": "Registry Access Management registry removed", + "name": "registry_access.registry_removed" + }, + { + "description": "Access token created in organization", + "label": "Access token created", + "name": "access_token.create" + }, + { + "description": "Access token updated in organization", + "label": "Access token updated", + "name": "access_token.update" + }, + { + "description": "Access token deleted in organization", + "label": "Access token deleted", + "name": "access_token.delete" + }, + { + "description": "A custom role was created", + "label": "Custom role created", + "name": "customrole.create" + }, + { + "description": "An existing custom role was updated", + "label": "Custom role updated", + "name": "customrole.update" + }, + { + "description": "A custom role was deleted", + "label": "Custom role deleted", + "name": "customrole.delete" + }, + { + "description": "A secure policy configuration was created", + "label": "Secure Policy Configuration created", + "name": "securepolicyconfigure.create" + }, + { + "description": "A secure policy configuration was updated", + "label": "Secure Policy Configuration updated", + "name": "securepolicyconfigure.update" + }, + { + "description": "A secure policy configuration was deleted", + "label": "Secure Policy Configuration deleted", + "name": "securepolicyconfigure.delete" + }, + { + "description": "A secure policy client was created", + "label": "Secure Policy Client created", + "name": "securepolicyclient.create" + }, + { + "description": "A secure policy client was updated", + "label": "Secure Policy Client updated", + "name": "securepolicyclient.update" + }, + { + "description": "A secure policy client was deleted", + "label": "Secure Policy Client deleted", + "name": "securepolicyclient.delete" + }, + { + "description": "A secure policy profile was created", + "label": "Secure Policy Profile created", + "name": "securepolicyprofile.create" + }, + { + "description": "A secure policy profile was updated", + "label": "Secure Policy Profile updated", + "name": "securepolicyprofile.update" + }, + { + "description": "A secure policy profile was deleted", + "label": "Secure Policy Profile deleted", + "name": "securepolicyprofile.delete" + } + ], + "label": "Organization" + }, + "repo": { + "actions": [ + { + "description": "Activities related to the creation of a new repository", + "label": "Repository Created", + "name": "create" + }, + { + "description": "Activities related to the modification of a repository", + "label": "Repository Updated", + "name": "update" + }, + { + "description": "Activities related to the deletion of a repository", + "label": "Repository Deleted", + "name": "delete" + }, + { + "description": "Details related to the privacy policies that were updated", + "label": "Privacy Changed", + "name": "change_privacy" + }, + { + "description": "Details related to updating a repository categories", + "label": "Categories updated", + "name": "category.updated" + }, + { + "description": "Details related to updating tag immutability of a repository", + "label": "Tag immutability updated", + "name": "immutable.tags.updated" + }, + { + "description": "Activities related to the tags pushed", + "label": "Tag Pushed", + "name": "tag.push" + }, + { + "description": "Activities related to the tags deleted", + "label": "Tag Deleted", + "name": "tag.delete" + } + ], + "label": "Repository" + } + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/GetAuditActionsResponse" + } + } + }, + "description": "A successful response." + }, + "429": { + "content": { + "application/json": { + "examples": { + "response": { + "value": { + "detail": "Rate limit exceeded", + "error": false + } + } + }, + "schema": {} + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "examples": { + "error": { + "summary": "Example error response", + "value": { + "errinfo": null, + "message": "internal error" + } + } + }, + "schema": { + "$ref": "#/components/schemas/error" + } + } + }, + "description": "" + }, + "default": { + "content": { + "application/json": { + "examples": { + "error": { + "summary": "Example error response", + "value": { + "errinfo": null, + "message": "internal error" + } + } + }, + "schema": { + "$ref": "#/components/schemas/error" + } + } + }, + "description": "An unexpected error response." + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "List audit log actions", + "tags": [ + "audit-logs" + ] + }, + "references": [ + { + "ref": "#/components/schemas/GetAuditActionsResponse", + "url": "/reference/api/hub/latest/schemas/GetAuditActionsResponse/" + }, + { + "ref": "#/components/schemas/error", + "url": "/reference/api/hub/latest/schemas/error/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List audit log actions", + "tags": [ + "audit-logs" + ], + "url": "/reference/api/hub/latest/operations/AuditLogs_ListAuditActions/", + "variants": [ + { + "description": "A successful response.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "response", + "text": "{\n \"actions\": {\n \"billing\": {\n \"actions\": [\n {\n \"description\": \"Occurs when your organization’s billing plan is upgraded to a higher tier plan.\",\n \"label\": \"Plan Upgraded\",\n \"name\": \"plan.upgrade\"\n },\n {\n \"description\": \"Occurs when your organization’s billing plan is downgraded to a lower tier plan.\",\n \"label\": \"Plan Downgraded\",\n \"name\": \"plan.downgrade\"\n },\n {\n \"description\": \"Occurs when a seat is added to your organization’s billing plan.\",\n \"label\": \"Seat Added\",\n \"name\": \"plan.seat_add\"\n },\n {\n \"description\": \"Occurs when a seat is removed from your organization’s billing plan.\",\n \"label\": \"Seat Removed\",\n \"name\": \"plan.seat_remove\"\n },\n {\n \"description\": \"Occurs when there is a change in the recurring interval that your organization is charged.\",\n \"label\": \"Billing Cycle Changed\",\n \"name\": \"plan.cycle_change\"\n },\n {\n \"description\": \"Occurs when a scheduled plan downgrade for your organization is canceled.\",\n \"label\": \"Plan Downgrade Canceled\",\n \"name\": \"plan.downgrade_cancel\"\n },\n {\n \"description\": \"Occurs when a scheduled seat removal for an organization’s billing plan is canceled.\",\n \"label\": \"Seat Removal Canceled\",\n \"name\": \"plan.seat_removal_cancel\"\n },\n {\n \"description\": \"Occurs when a user in your organization requests a plan upgrade.\",\n \"label\": \"Plan Upgrade Requested\",\n \"name\": \"plan.upgrade.request\"\n },\n {\n \"description\": \"Occurs when a user in your organization requests a plan downgrade.\",\n \"label\": \"Plan Downgrade Requested\",\n \"name\": \"plan.downgrade.request\"\n },\n {\n \"description\": \"Occurs when a user in your organization requests an increase in the number of seats.\",\n \"label\": \"Seat Addition Requested\",\n \"name\": \"plan.seat_add.request\"\n },\n {\n \"description\": \"Occurs when a user in your organization requests a decrease in the number of seats.\",\n \"label\": \"Seat Removal Requested\",\n \"name\": \"plan.seat_removal.request\"\n },\n {\n \"description\": \"Occurs when a user in your organization requests a change in the billing cycle.\",\n \"label\": \"Billing Cycle Change Requested\",\n \"name\": \"plan.cycle_change.request\"\n },\n {\n \"description\": \"Occurs when a user in your organization requests a cancellation of a scheduled plan downgrade.\",\n \"label\": \"Plan Downgrade Cancellation Requested\",\n \"name\": \"plan.downgrade_cancel.request\"\n },\n {\n \"description\": \"Occurs when a user in your organization requests a cancellation of a scheduled seat removal.\",\n \"label\": \"Seat Removal Cancellation Requested\",\n \"name\": \"plan.seat_removal_cancel.request\"\n },\n {\n \"description\": \"Occurs when there is a change in the product that your organization subscribes to.\",\n \"label\": \"Billing Product Changed\",\n \"name\": \"plan.product_change\"\n }\n ],\n \"label\": \"Billing\"\n },\n \"enterprise\": {\n \"actions\": [\n {\n \"description\": \"Details of adding an admin settings policy\",\n \"label\": \"Policy created\",\n \"name\": \"setting.policy.create\"\n },\n {\n \"description\": \"Details of updating an admin settings policy\",\n \"label\": \"Policy updated\",\n \"name\": \"setting.policy.update\"\n },\n {\n \"description\": \"Details of deleting an admin settings policy\",\n \"label\": \"Policy deleted\",\n \"name\": \"setting.policy.delete\"\n },\n {\n \"description\": \"Details of transferring an admin settings policy to another owner\",\n \"label\": \"Policy transferred\",\n \"name\": \"setting.policy.transfer\"\n },\n {\n \"description\": \"Details of creating a new org/company SSO connection\",\n \"label\": \"Create SSO Connection\",\n \"name\": \"sso.connection.create\"\n },\n {\n \"description\": \"Details of updating an existing org/company SSO connection\",\n \"label\": \"Update SSO Connection\",\n \"name\": \"sso.connection.update\"\n },\n {\n \"description\": \"Details of deleting an existing org/company SSO connection\",\n \"label\": \"Delete SSO Connection\",\n \"name\": \"sso.connection.delete\"\n },\n {\n \"description\": \"Details of toggling enforcement on an existing org/company SSO connection\",\n \"label\": \"Enforce SSO\",\n \"name\": \"sso.connection.enforcement_toggle\"\n },\n {\n \"description\": \"Details of toggling SCIM on an existing org/company SSO connection\",\n \"label\": \"Enforce SCIM\",\n \"name\": \"sso.connection.scim_toggle\"\n },\n {\n \"description\": \"Details of a SCIM token refresh on an existing org/company SSO connection\",\n \"label\": \"Refresh SCIM Token\",\n \"name\": \"sso.connection.scim_token_refresh\"\n },\n {\n \"description\": \"Details of a connection type change on an existing org/company SSO connection\",\n \"label\": \"Change SSO Connection Type\",\n \"name\": \"sso.connection.connection_type_change\"\n },\n {\n \"description\": \"Details of a JIT toggle on an existing org/company SSO connection\",\n \"label\": \"Toggle JIT provisioning\",\n \"name\": \"sso.connection.jit_toggle\"\n }\n ],\n \"label\": \"Enterprise\"\n },\n \"offload\": {\n \"actions\": [\n {\n \"description\": \"Details of the started Offload lease.\",\n \"label\": \"Offload lease start\",\n \"name\": \"lease.start\"\n },\n {\n \"description\": \"Details of the ended Offload lease.\",\n \"label\": \"Offload lease end\",\n \"name\": \"lease.end\"\n }\n ],\n \"label\": \"Offload\"\n },\n \"oidc\": {\n \"actions\": [\n {\n \"description\": \"Details of creating an OIDC connection.\",\n \"label\": \"OIDC connection created\",\n \"name\": \"connection.create\"\n },\n {\n \"description\": \"Details of updating an OIDC connection.\",\n \"label\": \"OIDC connection updated\",\n \"name\": \"connection.update\"\n },\n {\n \"description\": \"Details of deleting an OIDC connection.\",\n \"label\": \"OIDC connection deleted\",\n \"name\": \"connection.delete\"\n }\n ],\n \"label\": \"OIDC\"\n },\n \"org\": {\n \"actions\": [\n {\n \"description\": \"Activities related to the creation of a new organization\",\n \"label\": \"Organization Created\",\n \"name\": \"create\"\n },\n {\n \"description\": \"Details of the member added to your organization\",\n \"label\": \"Organization Member Added\",\n \"name\": \"member.add\"\n },\n {\n \"description\": \"Details about the member removed from your organization\",\n \"label\": \"Organization Member Removed\",\n \"name\": \"member.remove\"\n },\n {\n \"description\": \"Details about the role changed for a member in your organization\",\n \"label\": \"Member Role Changed\",\n \"name\": \"member.role.change\"\n },\n {\n \"description\": \"Details of the member invited to your organization\",\n \"label\": \"Org Member Invited\",\n \"name\": \"member.invite.send\"\n },\n {\n \"description\": \"Activities related to the creation of a team\",\n \"label\": \"Organization Created\",\n \"name\": \"team.create\"\n },\n {\n \"description\": \"Activities related to the modification of a team\",\n \"label\": \"Organization Deleted\",\n \"name\": \"team.update\"\n },\n {\n \"description\": \"Activities related to the deletion of a team\",\n \"label\": \"Organization Deleted\",\n \"name\": \"team.delete\"\n },\n {\n \"description\": \"Details of the member added to your team\",\n \"label\": \"Team Member Added\",\n \"name\": \"team.member.add\"\n },\n {\n \"description\": \"Details of the member removed from your team\",\n \"label\": \"Team Member Removed\",\n \"name\": \"team.member.remove\"\n },\n {\n \"description\": \"Details of the single sign-on domain added to your organization\",\n \"label\": \"Single Sign-On domain added\",\n \"name\": \"domain.create\"\n },\n {\n \"description\": \"Details of the single sign-on domain verified for your organization\",\n \"label\": \"Single Sign-On domain verified\",\n \"name\": \"domain.verify\"\n },\n {\n \"description\": \"Details of the single sign-on domain removed from your organization\",\n \"label\": \"Single Sign-On domain deleted\",\n \"name\": \"domain.delete\"\n },\n {\n \"description\": \"Details of toggling the Auto-Provisioning feature on a domain on or off\",\n \"label\": \"Organization Auto-Provisioning Toggled\",\n \"name\": \"domain.auto-provisioning.toggle\"\n },\n {\n \"description\": \"Details related to the organization setting that was updated\",\n \"label\": \"Organization Settings Updated\",\n \"name\": \"settings.update\"\n },\n {\n \"description\": \"Activities related to enabling Registry Access Management\",\n \"label\": \"Registry Access Management enabled\",\n \"name\": \"registry_access.enabled\"\n },\n {\n \"description\": \"Activities related to disabling Registry Access Management\",\n \"label\": \"Registry Access Management disabled\",\n \"name\": \"registry_access.disabled\"\n },\n {\n \"description\": \"Activities related to the addition of a registry\",\n \"label\": \"Registry Access Management registry added\",\n \"name\": \"registry_access.registry_added\"\n },\n {\n \"description\": \"Details related to the registry that was updated\",\n \"label\": \"Registry Access Management registry updated\",\n \"name\": \"registry_access.registry_updated\"\n },\n {\n \"description\": \"Activities related to the removal of a registry\",\n \"label\": \"Registry Access Management registry removed\",\n \"name\": \"registry_access.registry_removed\"\n },\n {\n \"description\": \"Access token created in organization\",\n \"label\": \"Access token created\",\n \"name\": \"access_token.create\"\n },\n {\n \"description\": \"Access token updated in organization\",\n \"label\": \"Access token updated\",\n \"name\": \"access_token.update\"\n },\n {\n \"description\": \"Access token deleted in organization\",\n \"label\": \"Access token deleted\",\n \"name\": \"access_token.delete\"\n },\n {\n \"description\": \"A custom role was created\",\n \"label\": \"Custom role created\",\n \"name\": \"customrole.create\"\n },\n {\n \"description\": \"An existing custom role was updated\",\n \"label\": \"Custom role updated\",\n \"name\": \"customrole.update\"\n },\n {\n \"description\": \"A custom role was deleted\",\n \"label\": \"Custom role deleted\",\n \"name\": \"customrole.delete\"\n },\n {\n \"description\": \"A secure policy configuration was created\",\n \"label\": \"Secure Policy Configuration created\",\n \"name\": \"securepolicyconfigure.create\"\n },\n {\n \"description\": \"A secure policy configuration was updated\",\n \"label\": \"Secure Policy Configuration updated\",\n \"name\": \"securepolicyconfigure.update\"\n },\n {\n \"description\": \"A secure policy configuration was deleted\",\n \"label\": \"Secure Policy Configuration deleted\",\n \"name\": \"securepolicyconfigure.delete\"\n },\n {\n \"description\": \"A secure policy client was created\",\n \"label\": \"Secure Policy Client created\",\n \"name\": \"securepolicyclient.create\"\n },\n {\n \"description\": \"A secure policy client was updated\",\n \"label\": \"Secure Policy Client updated\",\n \"name\": \"securepolicyclient.update\"\n },\n {\n \"description\": \"A secure policy client was deleted\",\n \"label\": \"Secure Policy Client deleted\",\n \"name\": \"securepolicyclient.delete\"\n },\n {\n \"description\": \"A secure policy profile was created\",\n \"label\": \"Secure Policy Profile created\",\n \"name\": \"securepolicyprofile.create\"\n },\n {\n \"description\": \"A secure policy profile was updated\",\n \"label\": \"Secure Policy Profile updated\",\n \"name\": \"securepolicyprofile.update\"\n },\n {\n \"description\": \"A secure policy profile was deleted\",\n \"label\": \"Secure Policy Profile deleted\",\n \"name\": \"securepolicyprofile.delete\"\n }\n ],\n \"label\": \"Organization\"\n },\n \"repo\": {\n \"actions\": [\n {\n \"description\": \"Activities related to the creation of a new repository\",\n \"label\": \"Repository Created\",\n \"name\": \"create\"\n },\n {\n \"description\": \"Activities related to the modification of a repository\",\n \"label\": \"Repository Updated\",\n \"name\": \"update\"\n },\n {\n \"description\": \"Activities related to the deletion of a repository\",\n \"label\": \"Repository Deleted\",\n \"name\": \"delete\"\n },\n {\n \"description\": \"Details related to the privacy policies that were updated\",\n \"label\": \"Privacy Changed\",\n \"name\": \"change_privacy\"\n },\n {\n \"description\": \"Details related to updating a repository categories\",\n \"label\": \"Categories updated\",\n \"name\": \"category.updated\"\n },\n {\n \"description\": \"Details related to updating tag immutability of a repository\",\n \"label\": \"Tag immutability updated\",\n \"name\": \"immutable.tags.updated\"\n },\n {\n \"description\": \"Activities related to the tags pushed\",\n \"label\": \"Tag Pushed\",\n \"name\": \"tag.push\"\n },\n {\n \"description\": \"Activities related to the tags deleted\",\n \"label\": \"Tag Deleted\",\n \"name\": \"tag.delete\"\n }\n ],\n \"label\": \"Repository\"\n }\n }\n}", + "value": { + "actions": { + "billing": { + "actions": [ + { + "description": "Occurs when your organization’s billing plan is upgraded to a higher tier plan.", + "label": "Plan Upgraded", + "name": "plan.upgrade" + }, + { + "description": "Occurs when your organization’s billing plan is downgraded to a lower tier plan.", + "label": "Plan Downgraded", + "name": "plan.downgrade" + }, + { + "description": "Occurs when a seat is added to your organization’s billing plan.", + "label": "Seat Added", + "name": "plan.seat_add" + }, + { + "description": "Occurs when a seat is removed from your organization’s billing plan.", + "label": "Seat Removed", + "name": "plan.seat_remove" + }, + { + "description": "Occurs when there is a change in the recurring interval that your organization is charged.", + "label": "Billing Cycle Changed", + "name": "plan.cycle_change" + }, + { + "description": "Occurs when a scheduled plan downgrade for your organization is canceled.", + "label": "Plan Downgrade Canceled", + "name": "plan.downgrade_cancel" + }, + { + "description": "Occurs when a scheduled seat removal for an organization’s billing plan is canceled.", + "label": "Seat Removal Canceled", + "name": "plan.seat_removal_cancel" + }, + { + "description": "Occurs when a user in your organization requests a plan upgrade.", + "label": "Plan Upgrade Requested", + "name": "plan.upgrade.request" + }, + { + "description": "Occurs when a user in your organization requests a plan downgrade.", + "label": "Plan Downgrade Requested", + "name": "plan.downgrade.request" + }, + { + "description": "Occurs when a user in your organization requests an increase in the number of seats.", + "label": "Seat Addition Requested", + "name": "plan.seat_add.request" + }, + { + "description": "Occurs when a user in your organization requests a decrease in the number of seats.", + "label": "Seat Removal Requested", + "name": "plan.seat_removal.request" + }, + { + "description": "Occurs when a user in your organization requests a change in the billing cycle.", + "label": "Billing Cycle Change Requested", + "name": "plan.cycle_change.request" + }, + { + "description": "Occurs when a user in your organization requests a cancellation of a scheduled plan downgrade.", + "label": "Plan Downgrade Cancellation Requested", + "name": "plan.downgrade_cancel.request" + }, + { + "description": "Occurs when a user in your organization requests a cancellation of a scheduled seat removal.", + "label": "Seat Removal Cancellation Requested", + "name": "plan.seat_removal_cancel.request" + }, + { + "description": "Occurs when there is a change in the product that your organization subscribes to.", + "label": "Billing Product Changed", + "name": "plan.product_change" + } + ], + "label": "Billing" + }, + "enterprise": { + "actions": [ + { + "description": "Details of adding an admin settings policy", + "label": "Policy created", + "name": "setting.policy.create" + }, + { + "description": "Details of updating an admin settings policy", + "label": "Policy updated", + "name": "setting.policy.update" + }, + { + "description": "Details of deleting an admin settings policy", + "label": "Policy deleted", + "name": "setting.policy.delete" + }, + { + "description": "Details of transferring an admin settings policy to another owner", + "label": "Policy transferred", + "name": "setting.policy.transfer" + }, + { + "description": "Details of creating a new org/company SSO connection", + "label": "Create SSO Connection", + "name": "sso.connection.create" + }, + { + "description": "Details of updating an existing org/company SSO connection", + "label": "Update SSO Connection", + "name": "sso.connection.update" + }, + { + "description": "Details of deleting an existing org/company SSO connection", + "label": "Delete SSO Connection", + "name": "sso.connection.delete" + }, + { + "description": "Details of toggling enforcement on an existing org/company SSO connection", + "label": "Enforce SSO", + "name": "sso.connection.enforcement_toggle" + }, + { + "description": "Details of toggling SCIM on an existing org/company SSO connection", + "label": "Enforce SCIM", + "name": "sso.connection.scim_toggle" + }, + { + "description": "Details of a SCIM token refresh on an existing org/company SSO connection", + "label": "Refresh SCIM Token", + "name": "sso.connection.scim_token_refresh" + }, + { + "description": "Details of a connection type change on an existing org/company SSO connection", + "label": "Change SSO Connection Type", + "name": "sso.connection.connection_type_change" + }, + { + "description": "Details of a JIT toggle on an existing org/company SSO connection", + "label": "Toggle JIT provisioning", + "name": "sso.connection.jit_toggle" + } + ], + "label": "Enterprise" + }, + "offload": { + "actions": [ + { + "description": "Details of the started Offload lease.", + "label": "Offload lease start", + "name": "lease.start" + }, + { + "description": "Details of the ended Offload lease.", + "label": "Offload lease end", + "name": "lease.end" + } + ], + "label": "Offload" + }, + "oidc": { + "actions": [ + { + "description": "Details of creating an OIDC connection.", + "label": "OIDC connection created", + "name": "connection.create" + }, + { + "description": "Details of updating an OIDC connection.", + "label": "OIDC connection updated", + "name": "connection.update" + }, + { + "description": "Details of deleting an OIDC connection.", + "label": "OIDC connection deleted", + "name": "connection.delete" + } + ], + "label": "OIDC" + }, + "org": { + "actions": [ + { + "description": "Activities related to the creation of a new organization", + "label": "Organization Created", + "name": "create" + }, + { + "description": "Details of the member added to your organization", + "label": "Organization Member Added", + "name": "member.add" + }, + { + "description": "Details about the member removed from your organization", + "label": "Organization Member Removed", + "name": "member.remove" + }, + { + "description": "Details about the role changed for a member in your organization", + "label": "Member Role Changed", + "name": "member.role.change" + }, + { + "description": "Details of the member invited to your organization", + "label": "Org Member Invited", + "name": "member.invite.send" + }, + { + "description": "Activities related to the creation of a team", + "label": "Organization Created", + "name": "team.create" + }, + { + "description": "Activities related to the modification of a team", + "label": "Organization Deleted", + "name": "team.update" + }, + { + "description": "Activities related to the deletion of a team", + "label": "Organization Deleted", + "name": "team.delete" + }, + { + "description": "Details of the member added to your team", + "label": "Team Member Added", + "name": "team.member.add" + }, + { + "description": "Details of the member removed from your team", + "label": "Team Member Removed", + "name": "team.member.remove" + }, + { + "description": "Details of the single sign-on domain added to your organization", + "label": "Single Sign-On domain added", + "name": "domain.create" + }, + { + "description": "Details of the single sign-on domain verified for your organization", + "label": "Single Sign-On domain verified", + "name": "domain.verify" + }, + { + "description": "Details of the single sign-on domain removed from your organization", + "label": "Single Sign-On domain deleted", + "name": "domain.delete" + }, + { + "description": "Details of toggling the Auto-Provisioning feature on a domain on or off", + "label": "Organization Auto-Provisioning Toggled", + "name": "domain.auto-provisioning.toggle" + }, + { + "description": "Details related to the organization setting that was updated", + "label": "Organization Settings Updated", + "name": "settings.update" + }, + { + "description": "Activities related to enabling Registry Access Management", + "label": "Registry Access Management enabled", + "name": "registry_access.enabled" + }, + { + "description": "Activities related to disabling Registry Access Management", + "label": "Registry Access Management disabled", + "name": "registry_access.disabled" + }, + { + "description": "Activities related to the addition of a registry", + "label": "Registry Access Management registry added", + "name": "registry_access.registry_added" + }, + { + "description": "Details related to the registry that was updated", + "label": "Registry Access Management registry updated", + "name": "registry_access.registry_updated" + }, + { + "description": "Activities related to the removal of a registry", + "label": "Registry Access Management registry removed", + "name": "registry_access.registry_removed" + }, + { + "description": "Access token created in organization", + "label": "Access token created", + "name": "access_token.create" + }, + { + "description": "Access token updated in organization", + "label": "Access token updated", + "name": "access_token.update" + }, + { + "description": "Access token deleted in organization", + "label": "Access token deleted", + "name": "access_token.delete" + }, + { + "description": "A custom role was created", + "label": "Custom role created", + "name": "customrole.create" + }, + { + "description": "An existing custom role was updated", + "label": "Custom role updated", + "name": "customrole.update" + }, + { + "description": "A custom role was deleted", + "label": "Custom role deleted", + "name": "customrole.delete" + }, + { + "description": "A secure policy configuration was created", + "label": "Secure Policy Configuration created", + "name": "securepolicyconfigure.create" + }, + { + "description": "A secure policy configuration was updated", + "label": "Secure Policy Configuration updated", + "name": "securepolicyconfigure.update" + }, + { + "description": "A secure policy configuration was deleted", + "label": "Secure Policy Configuration deleted", + "name": "securepolicyconfigure.delete" + }, + { + "description": "A secure policy client was created", + "label": "Secure Policy Client created", + "name": "securepolicyclient.create" + }, + { + "description": "A secure policy client was updated", + "label": "Secure Policy Client updated", + "name": "securepolicyclient.update" + }, + { + "description": "A secure policy client was deleted", + "label": "Secure Policy Client deleted", + "name": "securepolicyclient.delete" + }, + { + "description": "A secure policy profile was created", + "label": "Secure Policy Profile created", + "name": "securepolicyprofile.create" + }, + { + "description": "A secure policy profile was updated", + "label": "Secure Policy Profile updated", + "name": "securepolicyprofile.update" + }, + { + "description": "A secure policy profile was deleted", + "label": "Secure Policy Profile deleted", + "name": "securepolicyprofile.delete" + } + ], + "label": "Organization" + }, + "repo": { + "actions": [ + { + "description": "Activities related to the creation of a new repository", + "label": "Repository Created", + "name": "create" + }, + { + "description": "Activities related to the modification of a repository", + "label": "Repository Updated", + "name": "update" + }, + { + "description": "Activities related to the deletion of a repository", + "label": "Repository Deleted", + "name": "delete" + }, + { + "description": "Details related to the privacy policies that were updated", + "label": "Privacy Changed", + "name": "change_privacy" + }, + { + "description": "Details related to updating a repository categories", + "label": "Categories updated", + "name": "category.updated" + }, + { + "description": "Details related to updating tag immutability of a repository", + "label": "Tag immutability updated", + "name": "immutable.tags.updated" + }, + { + "description": "Activities related to the tags pushed", + "label": "Tag Pushed", + "name": "tag.push" + }, + { + "description": "Activities related to the tags deleted", + "label": "Tag Deleted", + "name": "tag.delete" + } + ], + "label": "Repository" + } + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auditlogs~1{account}~1actions/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/GetAuditActionsResponse" + }, + "status": "200" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "response", + "text": "{\n \"detail\": \"Rate limit exceeded\",\n \"error\": false\n}", + "value": { + "detail": "Rate limit exceeded", + "error": false + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auditlogs~1{account}~1actions/get/responses/429/content/application~1json", + "required": null, + "schema": {}, + "status": "429" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"internal error\"\n}", + "value": { + "errinfo": null, + "message": "internal error" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auditlogs~1{account}~1actions/get/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "500" + }, + { + "description": "An unexpected error response.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"internal error\"\n}", + "value": { + "errinfo": null, + "message": "internal error" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auditlogs~1{account}~1actions/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"identifier\": \"myusername\",\n \"secret\": \"dckr_pat_124509ugsdjga93\"\n}' \\\n 'https://hub.docker.com/v2/auth/token'", + "curlNotes": [], + "deprecated": null, + "description": "Creates and returns a short-lived access token in JWT format for use as a bearer when calling Docker APIs.\n\nIf successful, the access token returned should be used in the HTTP Authorization header like \n`Authorization: Bearer {access_token}`.\n\n_**If your organization has SSO enforced, you must use a personal access token (PAT) instead of a password.**_\n", + "id": "AuthCreateAccessToken", + "line": 251, + "method": "POST", + "parameters": [], + "path": "/v2/auth/token", + "pointer": "/paths/~1v2~1auth~1token/post", + "raw": { + "description": "Creates and returns a short-lived access token in JWT format for use as a bearer when calling Docker APIs.\n\nIf successful, the access token returned should be used in the HTTP Authorization header like \n`Authorization: Bearer {access_token}`.\n\n_**If your organization has SSO enforced, you must use a personal access token (PAT) instead of a password.**_\n", + "operationId": "AuthCreateAccessToken", + "requestBody": { + "content": { + "application/json": { + "schema": { + "description": "Request to create access token", + "examples": [ + { + "identifier": "myusername", + "secret": "dckr_pat_124509ugsdjga93" + } + ], + "properties": { + "identifier": { + "description": "The identifier of the account to create an access token for. If using a password or personal access token,\nthis must be a username. If using an organization access token, this must be an organization name.\n", + "example": "myusername", + "type": "string" + }, + "secret": { + "description": "The secret of the account to create an access token for. This can be a password, personal access token, or\norganization access token.\n", + "example": "dckr_pat_124509ugsdjga93", + "type": "string" + } + }, + "required": [ + "identifier", + "secret" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthCreateTokenResponse" + } + } + }, + "description": "Token created" + }, + "401": { + "$ref": "#/components/responses/unauthorized", + "description": "Authentication failed" + } + }, + "security": [], + "summary": "Create access token", + "tags": [ + "authentication-api" + ] + }, + "references": [ + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/AuthCreateTokenResponse", + "url": "/reference/api/hub/latest/schemas/AuthCreateTokenResponse/" + } + ], + "requestSchema": { + "description": "Request to create access token", + "examples": [ + { + "identifier": "myusername", + "secret": "dckr_pat_124509ugsdjga93" + } + ], + "properties": { + "identifier": { + "description": "The identifier of the account to create an access token for. If using a password or personal access token,\nthis must be a username. If using an organization access token, this must be an organization name.\n", + "example": "myusername", + "type": "string" + }, + "secret": { + "description": "The secret of the account to create an access token for. This can be a password, personal access token, or\norganization access token.\n", + "example": "dckr_pat_124509ugsdjga93", + "type": "string" + } + }, + "required": [ + "identifier", + "secret" + ], + "type": "object" + }, + "security": [], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Create access token", + "tags": [ + "authentication-api" + ], + "url": "/reference/api/hub/latest/operations/AuthCreateAccessToken/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"identifier\": \"myusername\",\n \"secret\": \"dckr_pat_124509ugsdjga93\"\n}", + "value": { + "identifier": "myusername", + "secret": "dckr_pat_124509ugsdjga93" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auth~1token/post/requestBody/content/application~1json", + "required": null, + "schema": { + "description": "Request to create access token", + "examples": [ + { + "identifier": "myusername", + "secret": "dckr_pat_124509ugsdjga93" + } + ], + "properties": { + "identifier": { + "description": "The identifier of the account to create an access token for. If using a password or personal access token,\nthis must be a username. If using an organization access token, this must be an organization name.\n", + "example": "myusername", + "type": "string" + }, + "secret": { + "description": "The secret of the account to create an access token for. This can be a password, personal access token, or\norganization access token.\n", + "example": "dckr_pat_124509ugsdjga93", + "type": "string" + } + }, + "required": [ + "identifier", + "secret" + ], + "type": "object" + }, + "status": "" + }, + { + "description": "Token created", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n}", + "value": { + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auth~1token/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/AuthCreateTokenResponse" + }, + "status": "200" + }, + { + "description": "Authentication failed", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1auth~1token/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"dry_run\": true,\n \"invitees\": [\n \"invitee1DockerId\",\n \"invitee2@docker.com\",\n \"invitee3@docker.com\"\n ],\n \"org\": \"docker\",\n \"role\": \"member\",\n \"team\": \"owners\"\n}' \\\n 'https://hub.docker.com/v2/invites/bulk'", + "curlNotes": [], + "deprecated": null, + "description": "Create multiple invites by emails or DockerIDs. Only a team owner can create invites.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "postV2InvitesBulk", + "line": 2249, + "method": "POST", + "parameters": [ + { + "description": "Optional string that indicates the feature used to submit the bulk invites (e.g.'file', 'web')", + "in": "header", + "name": "X-Analytics-Client-Feature", + "pointer": "/paths/~1v2~1invites~1bulk/parameters/0", + "schema": { + "type": "string" + } + } + ], + "path": "/v2/invites/bulk", + "pointer": "/paths/~1v2~1invites~1bulk/post", + "raw": { + "description": "Create multiple invites by emails or DockerIDs. Only a team owner can create invites.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "postV2InvitesBulk", + "requestBody": { + "$ref": "#/components/requestBodies/bulk_invite_request" + }, + "responses": { + "202": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/bulk_invite" + } + } + }, + "description": "Accepted" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "409": { + "$ref": "#/components/responses/conflict" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Bulk create invites", + "tags": [ + "invites" + ] + }, + "references": [ + { + "ref": "#/components/requestBodies/bulk_invite_request", + "url": null + }, + { + "ref": "#/components/responses/bad_request", + "url": null + }, + { + "ref": "#/components/responses/conflict", + "url": null + }, + { + "ref": "#/components/schemas/bulk_invite", + "url": "/reference/api/hub/latest/schemas/bulk_invite/" + } + ], + "requestSchema": { + "examples": [ + { + "dry_run": true, + "invitees": [ + "invitee1DockerId", + "invitee2@docker.com", + "invitee3@docker.com" + ], + "org": "docker", + "role": "member", + "team": "owners" + } + ], + "properties": { + "dry_run": { + "description": "Optional, run through validation but don't actually change data.", + "example": true, + "type": "boolean" + }, + "invitees": { + "description": "list of invitees emails or Docker Ids", + "example": [ + "invitee1DockerId", + "invitee2@docker.com", + "invitee3@docker.com" + ], + "items": { + "description": "invitee email or Docker ID", + "type": "string" + }, + "type": "array" + }, + "org": { + "description": "organization name", + "example": "docker", + "type": "string" + }, + "role": { + "description": "role for invitees", + "example": "member", + "type": "string" + }, + "team": { + "description": "team name", + "example": "owners", + "type": "string" + } + }, + "required": [ + "org", + "invitees" + ], + "type": "object" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Bulk create invites", + "tags": [ + "invites" + ], + "url": "/reference/api/hub/latest/operations/postV2InvitesBulk/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"dry_run\": true,\n \"invitees\": [\n \"invitee1DockerId\",\n \"invitee2@docker.com\",\n \"invitee3@docker.com\"\n ],\n \"org\": \"docker\",\n \"role\": \"member\",\n \"team\": \"owners\"\n}", + "value": { + "dry_run": true, + "invitees": [ + "invitee1DockerId", + "invitee2@docker.com", + "invitee3@docker.com" + ], + "org": "docker", + "role": "member", + "team": "owners" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1bulk/post/requestBody/content/application~1json", + "required": true, + "schema": { + "examples": [ + { + "dry_run": true, + "invitees": [ + "invitee1DockerId", + "invitee2@docker.com", + "invitee3@docker.com" + ], + "org": "docker", + "role": "member", + "team": "owners" + } + ], + "properties": { + "dry_run": { + "description": "Optional, run through validation but don't actually change data.", + "example": true, + "type": "boolean" + }, + "invitees": { + "description": "list of invitees emails or Docker Ids", + "example": [ + "invitee1DockerId", + "invitee2@docker.com", + "invitee3@docker.com" + ], + "items": { + "description": "invitee email or Docker ID", + "type": "string" + }, + "type": "array" + }, + "org": { + "description": "organization name", + "example": "docker", + "type": "string" + }, + "role": { + "description": "role for invitees", + "example": "member", + "type": "string" + }, + "team": { + "description": "team name", + "example": "owners", + "type": "string" + } + }, + "required": [ + "org", + "invitees" + ], + "type": "object" + }, + "status": "" + }, + { + "description": "Accepted", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"invitees\": [\n {\n \"invite\": {\n \"created_at\": \"2021-10-28T18:30:19.520861Z\",\n \"id\": \"e36eca69-4cc8-4f17-9845-ae8c2b832691\",\n \"invitee\": \"invitee@docker.com\",\n \"inviter_username\": \"moby\",\n \"org\": \"docker\",\n \"team\": \"owners\"\n },\n \"invitee\": \"invitee@docker.com\",\n \"status\": \"invited\"\n },\n {\n \"invitee\": \"invitee2@docker.com\",\n \"status\": \"existing_org_member\"\n },\n {\n \"invitee\": \"invitee3@docker.com\",\n \"status\": \"invalid_email_or_docker_id\"\n }\n ]\n}", + "value": { + "invitees": [ + { + "invite": { + "created_at": "2021-10-28T18:30:19.520861Z", + "id": "e36eca69-4cc8-4f17-9845-ae8c2b832691", + "invitee": "invitee@docker.com", + "inviter_username": "moby", + "org": "docker", + "team": "owners" + }, + "invitee": "invitee@docker.com", + "status": "invited" + }, + { + "invitee": "invitee2@docker.com", + "status": "existing_org_member" + }, + { + "invitee": "invitee3@docker.com", + "status": "invalid_email_or_docker_id" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1bulk/post/responses/202/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/bulk_invite" + }, + "status": "202" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1bulk/post/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Conflict", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"conflict\"\n}", + "value": { + "errinfo": null, + "message": "conflict" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1bulk/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "409" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://hub.docker.com/v2/invites/\u003cID\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Mark the invite as cancelled so it doesn't show up on the list of pending invites\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "deleteV2InvitesById", + "line": 2196, + "method": "DELETE", + "parameters": [ + { + "description": "ID of the invitation.", + "in": "path", + "name": "id", + "pointer": "/paths/~1v2~1invites~1{id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/invites/{id}", + "pointer": "/paths/~1v2~1invites~1{id}/delete", + "raw": { + "description": "Mark the invite as cancelled so it doesn't show up on the list of pending invites\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "deleteV2InvitesById", + "responses": { + "204": { + "description": "" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Cancel an invite", + "tags": [ + "invites" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Cancel an invite", + "tags": [ + "invites" + ], + "url": "/reference/api/hub/latest/operations/deleteV2InvitesById/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1invites~1{id}/delete/responses/204", + "status": "204" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1{id}/delete/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1{id}/delete/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1{id}/delete/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request PATCH \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://hub.docker.com/v2/invites/\u003cID\u003e/resend'", + "curlNotes": [], + "deprecated": null, + "description": "Resend a pending invite to the user, any org owner can resend an invite\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "patchV2InvitesByIdResend", + "line": 2225, + "method": "PATCH", + "parameters": [ + { + "description": "ID of the invitation.", + "in": "path", + "name": "id", + "pointer": "/paths/~1v2~1invites~1{id}~1resend/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/invites/{id}/resend", + "pointer": "/paths/~1v2~1invites~1{id}~1resend/patch", + "raw": { + "description": "Resend a pending invite to the user, any org owner can resend an invite\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "patchV2InvitesByIdResend", + "responses": { + "204": { + "description": "" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Resend an invite", + "tags": [ + "invites" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Resend an invite", + "tags": [ + "invites" + ], + "url": "/reference/api/hub/latest/operations/patchV2InvitesByIdResend/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1invites~1{id}~1resend/patch/responses/204", + "status": "204" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1{id}~1resend/patch/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1{id}~1resend/patch/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1invites~1{id}~1resend/patch/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories'", + "curlNotes": [ + "This example uses the first authentication alternative. Review the complete requirements." + ], + "deprecated": null, + "description": "Returns a list of repositories within the specified namespace (organization or user).\n\nPublic repositories are accessible to everyone, while private repositories require appropriate authentication and permissions.\n\n\n\n**OAT listing behavior**: an OAT with the `scope-repository-list` scope sees all repositories including private ones. An OAT without that scope only sees public repositories. This filtering is silent: the response is a normal `200` with no indication that private repositories were withheld.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "listNamespaceRepositories", + "line": 1323, + "method": "GET", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Page number to get. Defaults to 1.", + "in": "query", + "name": "page", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get/parameters/0", + "required": false, + "schema": { + "default": 1, + "minimum": 1, + "type": "integer" + } + }, + { + "description": "Number of repositories to get per page. Defaults to 10. Max of 100.", + "in": "query", + "name": "page_size", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get/parameters/1", + "required": false, + "schema": { + "default": 10, + "maximum": 100, + "minimum": 1, + "type": "integer" + } + }, + { + "description": "Filter repositories by name (partial match).", + "in": "query", + "name": "name", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get/parameters/2", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Order repositories by the specified field. Prefix with '-' for descending order.\nAvailable options:\n- `name` / `-name`: Repository name (ascending/descending)\n- `last_updated` / `-last_updated`: Last update time (ascending/descending)\n- `pull_count` / `-pull_count`: Number of pulls (ascending/descending)\n", + "in": "query", + "name": "ordering", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get/parameters/3", + "required": false, + "schema": { + "enum": [ + "name", + "-name", + "last_updated", + "-last_updated", + "pull_count", + "-pull_count" + ], + "type": "string" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get", + "raw": { + "description": "Returns a list of repositories within the specified namespace (organization or user).\n\nPublic repositories are accessible to everyone, while private repositories require appropriate authentication and permissions.\n\n\n\n**OAT listing behavior**: an OAT with the `scope-repository-list` scope sees all repositories including private ones. An OAT without that scope only sees public repositories. This filtering is silent: the response is a normal `200` with no indication that private repositories were withheld.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "listNamespaceRepositories", + "parameters": [ + { + "description": "Page number to get. Defaults to 1.", + "in": "query", + "name": "page", + "required": false, + "schema": { + "default": 1, + "minimum": 1, + "type": "integer" + } + }, + { + "description": "Number of repositories to get per page. Defaults to 10. Max of 100.", + "in": "query", + "name": "page_size", + "required": false, + "schema": { + "default": 10, + "maximum": 100, + "minimum": 1, + "type": "integer" + } + }, + { + "description": "Filter repositories by name (partial match).", + "in": "query", + "name": "name", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Order repositories by the specified field. Prefix with '-' for descending order.\nAvailable options:\n- `name` / `-name`: Repository name (ascending/descending)\n- `last_updated` / `-last_updated`: Last update time (ascending/descending)\n- `pull_count` / `-pull_count`: Number of pulls (ascending/descending)\n", + "in": "query", + "name": "ordering", + "required": false, + "schema": { + "enum": [ + "name", + "-name", + "last_updated", + "-last_updated", + "pull_count", + "-pull_count" + ], + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "repositories_list": { + "value": { + "count": 287, + "next": "https://hub.docker.com/v2/namespaces/docker/repositories?page=2\u0026page_size=2", + "previous": null, + "results": [ + { + "affiliation": "", + "categories": [ + { + "name": "Languages \u0026 frameworks", + "slug": "languages-and-frameworks" + }, + { + "name": "Integration \u0026 delivery", + "slug": "integration-and-delivery" + }, + { + "name": "Operating systems", + "slug": "operating-systems" + } + ], + "content_types": [ + "unrecognized", + "image" + ], + "date_registered": "2015-05-19T21:13:35.937763Z", + "description": "Image for performing Docker build requests", + "is_private": false, + "last_modified": "2024-10-16T13:48:34.145251Z", + "last_updated": "2023-06-20T10:44:45.459826Z", + "media_types": [ + "application/octet-stream", + "application/vnd.docker.container.image.v1+json", + "application/vnd.docker.distribution.manifest.v1+prettyjws" + ], + "name": "highland_builder", + "namespace": "docker", + "pull_count": 15722123, + "repository_type": "image", + "star_count": 7, + "status": 1, + "status_description": "active", + "storage_size": 488723114800 + }, + { + "affiliation": "", + "categories": [ + { + "name": "Languages \u0026 frameworks", + "slug": "languages-and-frameworks" + }, + { + "name": "Integration \u0026 delivery", + "slug": "integration-and-delivery" + } + ], + "content_types": [ + "image" + ], + "date_registered": "2015-06-09T18:16:36.527329Z", + "description": "An image for use in the Docker demo tutorial", + "is_private": false, + "last_modified": "2024-10-16T13:48:34.145251Z", + "last_updated": "2015-06-19T19:06:27.388123Z", + "media_types": [ + "application/vnd.docker.distribution.manifest.v1+prettyjws" + ], + "name": "whalesay", + "namespace": "docker", + "pull_count": 130737682, + "repository_type": null, + "star_count": 757, + "status": 1, + "status_description": "active", + "storage_size": 103666708 + } + ] + } + } + }, + "schema": { + "$ref": "#/components/schemas/list_repositories_response" + } + } + }, + "description": "List of repositories" + }, + "400": { + "content": { + "application/json": { + "examples": { + "invalid_ordering": { + "summary": "Invalid ordering value", + "value": { + "fields": { + "ordering": [ + "Invalid ordering value. Must be one of: name, -name, last_updated, -last_updated, pull_count, -pull_count" + ] + }, + "text": "Invalid ordering value" + } + } + }, + "schema": { + "$ref": "#/components/schemas/error" + } + } + }, + "description": "Bad Request - Invalid request parameters" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "content": { + "application/json": { + "examples": { + "error": { + "summary": "Example error response", + "value": { + "errinfo": null, + "message": "not found" + } + } + }, + "schema": { + "$ref": "#/components/schemas/error" + } + } + }, + "description": "Page not found - occurs when requesting a page number `\u003e1` that exceeds the available results" + } + }, + "security": [ + { + "bearerAuth": [] + }, + {} + ], + "summary": "List repositories in a namespace", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/error", + "url": "/reference/api/hub/latest/schemas/error/" + }, + { + "ref": "#/components/schemas/list_repositories_response", + "url": "/reference/api/hub/latest/schemas/list_repositories_response/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + }, + {} + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List repositories in a namespace", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/listNamespaceRepositories/", + "variants": [ + { + "description": "List of repositories", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "repositories_list", + "text": "{\n \"count\": 287,\n \"next\": \"https://hub.docker.com/v2/namespaces/docker/repositories?page=2\\u0026page_size=2\",\n \"previous\": null,\n \"results\": [\n {\n \"affiliation\": \"\",\n \"categories\": [\n {\n \"name\": \"Languages \\u0026 frameworks\",\n \"slug\": \"languages-and-frameworks\"\n },\n {\n \"name\": \"Integration \\u0026 delivery\",\n \"slug\": \"integration-and-delivery\"\n },\n {\n \"name\": \"Operating systems\",\n \"slug\": \"operating-systems\"\n }\n ],\n \"content_types\": [\n \"unrecognized\",\n \"image\"\n ],\n \"date_registered\": \"2015-05-19T21:13:35.937763Z\",\n \"description\": \"Image for performing Docker build requests\",\n \"is_private\": false,\n \"last_modified\": \"2024-10-16T13:48:34.145251Z\",\n \"last_updated\": \"2023-06-20T10:44:45.459826Z\",\n \"media_types\": [\n \"application/octet-stream\",\n \"application/vnd.docker.container.image.v1+json\",\n \"application/vnd.docker.distribution.manifest.v1+prettyjws\"\n ],\n \"name\": \"highland_builder\",\n \"namespace\": \"docker\",\n \"pull_count\": 15722123,\n \"repository_type\": \"image\",\n \"star_count\": 7,\n \"status\": 1,\n \"status_description\": \"active\",\n \"storage_size\": 488723114800\n },\n {\n \"affiliation\": \"\",\n \"categories\": [\n {\n \"name\": \"Languages \\u0026 frameworks\",\n \"slug\": \"languages-and-frameworks\"\n },\n {\n \"name\": \"Integration \\u0026 delivery\",\n \"slug\": \"integration-and-delivery\"\n }\n ],\n \"content_types\": [\n \"image\"\n ],\n \"date_registered\": \"2015-06-09T18:16:36.527329Z\",\n \"description\": \"An image for use in the Docker demo tutorial\",\n \"is_private\": false,\n \"last_modified\": \"2024-10-16T13:48:34.145251Z\",\n \"last_updated\": \"2015-06-19T19:06:27.388123Z\",\n \"media_types\": [\n \"application/vnd.docker.distribution.manifest.v1+prettyjws\"\n ],\n \"name\": \"whalesay\",\n \"namespace\": \"docker\",\n \"pull_count\": 130737682,\n \"repository_type\": null,\n \"star_count\": 757,\n \"status\": 1,\n \"status_description\": \"active\",\n \"storage_size\": 103666708\n }\n ]\n}", + "value": { + "count": 287, + "next": "https://hub.docker.com/v2/namespaces/docker/repositories?page=2\u0026page_size=2", + "previous": null, + "results": [ + { + "affiliation": "", + "categories": [ + { + "name": "Languages \u0026 frameworks", + "slug": "languages-and-frameworks" + }, + { + "name": "Integration \u0026 delivery", + "slug": "integration-and-delivery" + }, + { + "name": "Operating systems", + "slug": "operating-systems" + } + ], + "content_types": [ + "unrecognized", + "image" + ], + "date_registered": "2015-05-19T21:13:35.937763Z", + "description": "Image for performing Docker build requests", + "is_private": false, + "last_modified": "2024-10-16T13:48:34.145251Z", + "last_updated": "2023-06-20T10:44:45.459826Z", + "media_types": [ + "application/octet-stream", + "application/vnd.docker.container.image.v1+json", + "application/vnd.docker.distribution.manifest.v1+prettyjws" + ], + "name": "highland_builder", + "namespace": "docker", + "pull_count": 15722123, + "repository_type": "image", + "star_count": 7, + "status": 1, + "status_description": "active", + "storage_size": 488723114800 + }, + { + "affiliation": "", + "categories": [ + { + "name": "Languages \u0026 frameworks", + "slug": "languages-and-frameworks" + }, + { + "name": "Integration \u0026 delivery", + "slug": "integration-and-delivery" + } + ], + "content_types": [ + "image" + ], + "date_registered": "2015-06-09T18:16:36.527329Z", + "description": "An image for use in the Docker demo tutorial", + "is_private": false, + "last_modified": "2024-10-16T13:48:34.145251Z", + "last_updated": "2015-06-19T19:06:27.388123Z", + "media_types": [ + "application/vnd.docker.distribution.manifest.v1+prettyjws" + ], + "name": "whalesay", + "namespace": "docker", + "pull_count": 130737682, + "repository_type": null, + "star_count": 757, + "status": 1, + "status_description": "active", + "storage_size": 103666708 + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/list_repositories_response" + }, + "status": "200" + }, + { + "description": "Bad Request - Invalid request parameters", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "invalid_ordering", + "text": "{\n \"fields\": {\n \"ordering\": [\n \"Invalid ordering value. Must be one of: name, -name, last_updated, -last_updated, pull_count, -pull_count\"\n ]\n },\n \"text\": \"Invalid ordering value\"\n}", + "value": { + "fields": { + "ordering": [ + "Invalid ordering value. Must be one of: name, -name, last_updated, -last_updated, pull_count, -pull_count" + ] + }, + "text": "Invalid ordering value" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Page not found - occurs when requesting a page number `\u003e1` that exceeds the available results", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"description\": \"A sample application repository\",\n \"full_description\": \"This is a comprehensive description of my application repository that contains additional details about the project.\",\n \"is_private\": false,\n \"name\": \"my-app\",\n \"namespace\": \"myorganization\",\n \"registry\": \"docker.io\"\n}' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories'", + "curlNotes": [], + "deprecated": null, + "description": "Creates a new repository within the specified namespace. The repository will be created\nwith the provided metadata including name, description, and privacy settings.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "CreateRepository", + "line": 1478, + "method": "POST", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/post", + "raw": { + "description": "Creates a new repository within the specified namespace. The repository will be created\nwith the provided metadata including name, description, and privacy settings.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "CreateRepository", + "requestBody": { + "content": { + "application/json": { + "example": { + "description": "A sample application repository", + "full_description": "This is a comprehensive description of my application repository that contains additional details about the project.", + "is_private": false, + "name": "my-app", + "namespace": "myorganization", + "registry": "docker.io" + }, + "schema": { + "$ref": "#/components/schemas/repo_creation_request" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "example": { + "categories": [], + "collaborator_count": 0, + "content_types": [], + "date_registered": "2025-01-20T10:30:00Z", + "description": "A sample application repository", + "full_description": "This is a comprehensive description of my application repository that contains additional details about the project.", + "has_starred": false, + "hub_user": "myorganization", + "immutable_tags_settings": { + "enabled": false, + "rules": [] + }, + "is_automated": false, + "is_private": false, + "last_updated": "2025-01-20T10:30:00Z", + "media_types": [], + "name": "my-app", + "namespace": "myorganization", + "permissions": { + "admin": true, + "read": true, + "write": true + }, + "pull_count": 0, + "repository_type": "image", + "source": null, + "star_count": 0, + "status": 1, + "status_description": "Active", + "storage_size": null, + "user": "myorganization" + }, + "schema": { + "$ref": "#/components/schemas/repository_info" + } + } + }, + "description": "Repository created successfully" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "500": { + "$ref": "#/components/responses/internal_error" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Create a new repository", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/responses/bad_request", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/internal_error", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/repo_creation_request", + "url": "/reference/api/hub/latest/schemas/repo_creation_request/" + }, + { + "ref": "#/components/schemas/repository_info", + "url": "/reference/api/hub/latest/schemas/repository_info/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/repo_creation_request" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Create a new repository", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/CreateRepository/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Example", + "text": "{\n \"description\": \"A sample application repository\",\n \"full_description\": \"This is a comprehensive description of my application repository that contains additional details about the project.\",\n \"is_private\": false,\n \"name\": \"my-app\",\n \"namespace\": \"myorganization\",\n \"registry\": \"docker.io\"\n}", + "value": { + "description": "A sample application repository", + "full_description": "This is a comprehensive description of my application repository that contains additional details about the project.", + "is_private": false, + "name": "my-app", + "namespace": "myorganization", + "registry": "docker.io" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/repo_creation_request" + }, + "status": "" + }, + { + "description": "Repository created successfully", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Example", + "text": "{\n \"categories\": [],\n \"collaborator_count\": 0,\n \"content_types\": [],\n \"date_registered\": \"2025-01-20T10:30:00Z\",\n \"description\": \"A sample application repository\",\n \"full_description\": \"This is a comprehensive description of my application repository that contains additional details about the project.\",\n \"has_starred\": false,\n \"hub_user\": \"myorganization\",\n \"immutable_tags_settings\": {\n \"enabled\": false,\n \"rules\": []\n },\n \"is_automated\": false,\n \"is_private\": false,\n \"last_updated\": \"2025-01-20T10:30:00Z\",\n \"media_types\": [],\n \"name\": \"my-app\",\n \"namespace\": \"myorganization\",\n \"permissions\": {\n \"admin\": true,\n \"read\": true,\n \"write\": true\n },\n \"pull_count\": 0,\n \"repository_type\": \"image\",\n \"source\": null,\n \"star_count\": 0,\n \"status\": 1,\n \"status_description\": \"Active\",\n \"storage_size\": null,\n \"user\": \"myorganization\"\n}", + "value": { + "categories": [], + "collaborator_count": 0, + "content_types": [], + "date_registered": "2025-01-20T10:30:00Z", + "description": "A sample application repository", + "full_description": "This is a comprehensive description of my application repository that contains additional details about the project.", + "has_starred": false, + "hub_user": "myorganization", + "immutable_tags_settings": { + "enabled": false, + "rules": [] + }, + "is_automated": false, + "is_private": false, + "last_updated": "2025-01-20T10:30:00Z", + "media_types": [], + "name": "my-app", + "namespace": "myorganization", + "permissions": { + "admin": true, + "read": true, + "write": true + }, + "pull_count": 0, + "repository_type": "image", + "source": null, + "star_count": 0, + "status": 1, + "status_description": "Active", + "storage_size": null, + "user": "myorganization" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/repository_info" + }, + "status": "201" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/post/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/post/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/post/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + }, + { + "description": "Internal", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"internal error\"\n}", + "value": { + "errinfo": null, + "message": "internal error" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories/post/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories/\u003cREPOSITORY\u003e'", + "curlNotes": [ + "This example uses the first authentication alternative. Review the complete requirements." + ], + "deprecated": null, + "description": "Returns a repository within the specified namespace (organization or user).\n\nPublic repositories are accessible to everyone, while private repositories require appropriate authentication and permissions.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "GetRepository", + "line": 1554, + "method": "GET", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the repository within the namespace.", + "in": "path", + "name": "repository", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories/{repository}", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/get", + "raw": { + "description": "Returns a repository within the specified namespace (organization or user).\n\nPublic repositories are accessible to everyone, while private repositories require appropriate authentication and permissions.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "GetRepository", + "responses": { + "200": { + "content": { + "application/json": { + "example": { + "categories": [], + "collaborator_count": 0, + "content_types": [], + "date_registered": "2025-01-20T10:30:00Z", + "description": "A sample application repository", + "full_description": "This is a comprehensive description of my application repository that contains additional details about the project.", + "has_starred": false, + "hub_user": "myorganization", + "immutable_tags_settings": { + "enabled": false, + "rules": [] + }, + "is_automated": false, + "is_private": false, + "last_updated": "2025-01-20T10:30:00Z", + "media_types": [], + "name": "my-app", + "namespace": "myorganization", + "permissions": { + "admin": true, + "read": true, + "write": true + }, + "pull_count": 0, + "repository_type": "image", + "source": null, + "star_count": 0, + "status": 1, + "status_description": "Active", + "storage_size": null, + "user": "myorganization" + }, + "schema": { + "$ref": "#/components/schemas/repository_info" + } + } + } + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "500": { + "$ref": "#/components/responses/internal_error" + } + }, + "security": [ + { + "bearerAuth": [] + }, + {} + ], + "summary": "Get repository in a namespace", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/internal_error", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/repository_info", + "url": "/reference/api/hub/latest/schemas/repository_info/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + }, + {} + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get repository in a namespace", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/GetRepository/", + "variants": [ + { + "description": null, + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Example", + "text": "{\n \"categories\": [],\n \"collaborator_count\": 0,\n \"content_types\": [],\n \"date_registered\": \"2025-01-20T10:30:00Z\",\n \"description\": \"A sample application repository\",\n \"full_description\": \"This is a comprehensive description of my application repository that contains additional details about the project.\",\n \"has_starred\": false,\n \"hub_user\": \"myorganization\",\n \"immutable_tags_settings\": {\n \"enabled\": false,\n \"rules\": []\n },\n \"is_automated\": false,\n \"is_private\": false,\n \"last_updated\": \"2025-01-20T10:30:00Z\",\n \"media_types\": [],\n \"name\": \"my-app\",\n \"namespace\": \"myorganization\",\n \"permissions\": {\n \"admin\": true,\n \"read\": true,\n \"write\": true\n },\n \"pull_count\": 0,\n \"repository_type\": \"image\",\n \"source\": null,\n \"star_count\": 0,\n \"status\": 1,\n \"status_description\": \"Active\",\n \"storage_size\": null,\n \"user\": \"myorganization\"\n}", + "value": { + "categories": [], + "collaborator_count": 0, + "content_types": [], + "date_registered": "2025-01-20T10:30:00Z", + "description": "A sample application repository", + "full_description": "This is a comprehensive description of my application repository that contains additional details about the project.", + "has_starred": false, + "hub_user": "myorganization", + "immutable_tags_settings": { + "enabled": false, + "rules": [] + }, + "is_automated": false, + "is_private": false, + "last_updated": "2025-01-20T10:30:00Z", + "media_types": [], + "name": "my-app", + "namespace": "myorganization", + "permissions": { + "admin": true, + "read": true, + "write": true + }, + "pull_count": 0, + "repository_type": "image", + "source": null, + "star_count": 0, + "status": 1, + "status_description": "Active", + "storage_size": null, + "user": "myorganization" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/repository_info" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + }, + { + "description": "Internal", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"internal error\"\n}", + "value": { + "errinfo": null, + "message": "internal error" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/get/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --head \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories/\u003cREPOSITORY\u003e'", + "curlNotes": [ + "This example uses the first authentication alternative. Review the complete requirements." + ], + "deprecated": null, + "description": "Check a repository within the specified namespace (organization or user).\n\nPublic repositories are accessible to everyone, while private repositories require appropriate authentication and permissions.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "CheckRepository", + "line": 1612, + "method": "HEAD", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the repository within the namespace.", + "in": "path", + "name": "repository", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories/{repository}", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/head", + "raw": { + "description": "Check a repository within the specified namespace (organization or user).\n\nPublic repositories are accessible to everyone, while private repositories require appropriate authentication and permissions.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "CheckRepository", + "responses": { + "200": {}, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "500": { + "$ref": "#/components/responses/internal_error" + } + }, + "security": [ + { + "bearerAuth": [] + }, + {} + ], + "summary": "Check repository in a namespace", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/internal_error", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + }, + {} + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Check repository in a namespace", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/CheckRepository/", + "variants": [ + { + "description": null, + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/head/responses/200", + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/head/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/head/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/head/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + }, + { + "description": "Internal", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"internal error\"\n}", + "value": { + "errinfo": null, + "message": "internal error" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}/head/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PATCH \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"immutable_tags\": true,\n \"immutable_tags_rules\": [\n \"v.*\",\n \".*-RELEASE\"\n ]\n}' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories/\u003cREPOSITORY\u003e/immutabletags'", + "curlNotes": [], + "deprecated": null, + "description": "Updates the immutable tags configuration for this repository.\n\n**Only users with administrative privileges for the repository can modify these settings.**\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "UpdateRepositoryImmutableTags", + "line": 1211, + "method": "PATCH", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the repository within the namespace.", + "in": "path", + "name": "repository", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories/{repository}/immutabletags", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags/patch", + "raw": { + "description": "Updates the immutable tags configuration for this repository.\n\n**Only users with administrative privileges for the repository can modify these settings.**\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "UpdateRepositoryImmutableTags", + "requestBody": { + "$ref": "#/components/requestBodies/update_repository_immutable_tags_request" + }, + "responses": { + "200": { + "$ref": "#/components/responses/update_repository_immutable_tags_response" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Update repository immutable tags", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/requestBodies/update_repository_immutable_tags_request", + "url": null + }, + { + "ref": "#/components/responses/bad_request", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/responses/update_repository_immutable_tags_response", + "url": null + } + ], + "requestSchema": { + "$ref": "#/components/schemas/update_repository_immutable_tags_request" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Update repository immutable tags", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/UpdateRepositoryImmutableTags/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"immutable_tags\": true,\n \"immutable_tags_rules\": [\n \"v.*\",\n \".*-RELEASE\"\n ]\n}", + "value": { + "immutable_tags": true, + "immutable_tags_rules": [ + "v.*", + ".*-RELEASE" + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags/patch/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/update_repository_immutable_tags_request" + }, + "status": "" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"categories\": [],\n \"collaborator_count\": 0,\n \"content_types\": [],\n \"date_registered\": \"2025-01-20T10:30:00Z\",\n \"description\": \"A sample application repository\",\n \"full_description\": \"This is a comprehensive description of my application repository that contains additional details about the project.\",\n \"has_starred\": false,\n \"hub_user\": \"myorganization\",\n \"immutable_tags_settings\": {\n \"enabled\": false,\n \"rules\": []\n },\n \"is_automated\": false,\n \"is_private\": false,\n \"last_updated\": \"2025-01-20T10:30:00Z\",\n \"media_types\": [],\n \"name\": \"my-app\",\n \"namespace\": \"myorganization\",\n \"permissions\": {\n \"admin\": true,\n \"read\": true,\n \"write\": true\n },\n \"pull_count\": 0,\n \"repository_type\": \"image\",\n \"source\": null,\n \"star_count\": 0,\n \"status\": 1,\n \"status_description\": \"Active\",\n \"storage_size\": null,\n \"user\": \"myorganization\"\n}", + "value": { + "categories": [], + "collaborator_count": 0, + "content_types": [], + "date_registered": "2025-01-20T10:30:00Z", + "description": "A sample application repository", + "full_description": "This is a comprehensive description of my application repository that contains additional details about the project.", + "has_starred": false, + "hub_user": "myorganization", + "immutable_tags_settings": { + "enabled": false, + "rules": [] + }, + "is_automated": false, + "is_private": false, + "last_updated": "2025-01-20T10:30:00Z", + "media_types": [], + "name": "my-app", + "namespace": "myorganization", + "permissions": { + "admin": true, + "read": true, + "write": true + }, + "pull_count": 0, + "repository_type": "image", + "source": null, + "star_count": 0, + "status": 1, + "status_description": "Active", + "storage_size": null, + "user": "myorganization" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags/patch/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/repository_info" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags/patch/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags/patch/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags/patch/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags/patch/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"regex\": \"v.*\"\n}' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories/\u003cREPOSITORY\u003e/immutabletags/verify'", + "curlNotes": [], + "deprecated": null, + "description": "Validates the immutable tags regex passed in the request body and returns a list of tags matching it in this repository.\n\n**Only users with administrative privileges for the repository can call this endpoint.**\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "VerifyRepositoryImmutableTags", + "line": 1241, + "method": "POST", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags~1verify/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the repository within the namespace.", + "in": "path", + "name": "repository", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags~1verify/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories/{repository}/immutabletags/verify", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags~1verify/post", + "raw": { + "description": "Validates the immutable tags regex passed in the request body and returns a list of tags matching it in this repository.\n\n**Only users with administrative privileges for the repository can call this endpoint.**\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "VerifyRepositoryImmutableTags", + "requestBody": { + "$ref": "#/components/requestBodies/immutable_tags_verify_request" + }, + "responses": { + "200": { + "$ref": "#/components/responses/immutable_tags_verify_response" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Verify repository immutable tags", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/requestBodies/immutable_tags_verify_request", + "url": null + }, + { + "ref": "#/components/responses/bad_request", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/immutable_tags_verify_response", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + } + ], + "requestSchema": { + "$ref": "#/components/schemas/immutable_tags_verify_request" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Verify repository immutable tags", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/VerifyRepositoryImmutableTags/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"regex\": \"v.*\"\n}", + "value": { + "regex": "v.*" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags~1verify/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/immutable_tags_verify_request" + }, + "status": "" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"tags\": [\n \"v1.0.0\",\n \"v2.1.3\",\n \"latest\"\n ]\n}", + "value": { + "tags": [ + "v1.0.0", + "v2.1.3", + "latest" + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags~1verify/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/immutable_tags_verify_response" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags~1verify/post/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags~1verify/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags~1verify/post/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1immutabletags~1verify/post/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories/\u003cREPOSITORY\u003e/tags'", + "curlNotes": [], + "deprecated": null, + "description": "Returns the list of tags for the specified repository.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "ListRepositoryTags", + "line": 1117, + "method": "GET", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the repository within the namespace.", + "in": "path", + "name": "repository", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Page number to get. Defaults to 1.", + "in": "query", + "name": "page", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/get/parameters/0", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Number of items to get per page. Defaults to 10. Max of 100.", + "in": "query", + "name": "page_size", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/get/parameters/1", + "required": false, + "schema": { + "type": "integer" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories/{repository}/tags", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/get", + "raw": { + "description": "Returns the list of tags for the specified repository.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "ListRepositoryTags", + "parameters": [ + { + "description": "Page number to get. Defaults to 1.", + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Number of items to get per page. Defaults to 10. Max of 100.", + "in": "query", + "name": "page_size", + "required": false, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_tags" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "List repository tags", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/list_tags", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List repository tags", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/ListRepositoryTags/", + "variants": [ + { + "description": "list repository tags", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"count\": 1,\n \"next\": null,\n \"previous\": null,\n \"results\": [\n {\n \"creator\": 1234,\n \"full_size\": 123456,\n \"id\": 12345,\n \"images\": [\n {\n \"architecture\": \"amd64\",\n \"features\": null,\n \"last_pulled\": null,\n \"last_pushed\": \"2021-01-05T21:06:53.506400Z\",\n \"os\": \"linux\",\n \"os_features\": null,\n \"os_version\": null,\n \"size\": 123456,\n \"status\": \"active\",\n \"variant\": null\n }\n ],\n \"last_updated\": \"2021-01-05T21:06:53.506400Z\",\n \"last_updater\": 1234,\n \"last_updater_username\": \"dockeruser\",\n \"name\": \"latest\",\n \"repository\": 5678,\n \"tag_last_pulled\": null,\n \"tag_last_pushed\": \"2021-01-05T21:06:53.506400Z\",\n \"tag_status\": \"active\",\n \"v2\": true\n }\n ]\n}", + "value": { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "creator": 1234, + "full_size": 123456, + "id": 12345, + "images": [ + { + "architecture": "amd64", + "features": null, + "last_pulled": null, + "last_pushed": "2021-01-05T21:06:53.506400Z", + "os": "linux", + "os_features": null, + "os_version": null, + "size": 123456, + "status": "active", + "variant": null + } + ], + "last_updated": "2021-01-05T21:06:53.506400Z", + "last_updater": 1234, + "last_updater_username": "dockeruser", + "name": "latest", + "repository": 5678, + "tag_last_pulled": null, + "tag_last_pushed": "2021-01-05T21:06:53.506400Z", + "tag_status": "active", + "v2": true + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/paginated_tags" + }, + "status": "200" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --head \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories/\u003cREPOSITORY\u003e/tags'", + "curlNotes": [], + "deprecated": null, + "description": "Checks whether the repository has any tags.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "headV2NamespacesByNamespaceRepositoriesByRepositoryTags", + "line": 1148, + "method": "HEAD", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the repository within the namespace.", + "in": "path", + "name": "repository", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories/{repository}/tags", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/head", + "raw": { + "description": "Checks whether the repository has any tags.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "headV2NamespacesByNamespaceRepositoriesByRepositoryTags", + "responses": { + "200": { + "description": "Repository contains tags" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Check repository tags", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Check repository tags", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/headV2NamespacesByNamespaceRepositoriesByRepositoryTags/", + "variants": [ + { + "description": "Repository contains tags", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/head/responses/200", + "status": "200" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/head/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags/head/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories/\u003cREPOSITORY\u003e/tags/\u003cTAG\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Returns details for a specific tag in the specified repository.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "GetRepositoryTag", + "line": 1171, + "method": "GET", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the repository within the namespace.", + "in": "path", + "name": "repository", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the image tag.", + "in": "path", + "name": "tag", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/parameters/2", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories/{repository}/tags/{tag}", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/get", + "raw": { + "description": "Returns details for a specific tag in the specified repository.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "GetRepositoryTag", + "responses": { + "200": { + "$ref": "#/components/responses/get_tag" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Read repository tag", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/get_tag", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Read repository tag", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/GetRepositoryTag/", + "variants": [ + { + "description": "repository tag", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"creator\": 1234,\n \"full_size\": 123456,\n \"id\": 12345,\n \"images\": [\n {\n \"architecture\": \"amd64\",\n \"features\": null,\n \"last_pulled\": null,\n \"last_pushed\": \"2021-01-05T21:06:53.506400Z\",\n \"os\": \"linux\",\n \"os_features\": null,\n \"os_version\": null,\n \"size\": 123456,\n \"status\": \"active\",\n \"variant\": null\n }\n ],\n \"last_updated\": \"2021-01-05T21:06:53.506400Z\",\n \"last_updater\": 1234,\n \"last_updater_username\": \"dockeruser\",\n \"name\": \"latest\",\n \"repository\": 5678,\n \"tag_last_pulled\": null,\n \"tag_last_pushed\": \"2021-01-05T21:06:53.506400Z\",\n \"tag_status\": \"active\",\n \"v2\": true\n}", + "value": { + "creator": 1234, + "full_size": 123456, + "id": 12345, + "images": [ + { + "architecture": "amd64", + "features": null, + "last_pulled": null, + "last_pushed": "2021-01-05T21:06:53.506400Z", + "os": "linux", + "os_features": null, + "os_version": null, + "size": 123456, + "status": "active", + "variant": null + } + ], + "last_updated": "2021-01-05T21:06:53.506400Z", + "last_updater": 1234, + "last_updater_username": "dockeruser", + "name": "latest", + "repository": 5678, + "tag_last_pulled": null, + "tag_last_pushed": "2021-01-05T21:06:53.506400Z", + "tag_status": "active", + "v2": true + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/tag" + }, + "status": "200" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --head \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/namespaces/\u003cNAMESPACE\u003e/repositories/\u003cREPOSITORY\u003e/tags/\u003cTAG\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Checks whether the specified tag exists in the repository.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "headV2NamespacesByNamespaceRepositoriesByRepositoryTagsByTag", + "line": 1189, + "method": "HEAD", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the repository within the namespace.", + "in": "path", + "name": "repository", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the image tag.", + "in": "path", + "name": "tag", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/parameters/2", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/namespaces/{namespace}/repositories/{repository}/tags/{tag}", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/head", + "raw": { + "description": "Checks whether the specified tag exists in the repository.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "headV2NamespacesByNamespaceRepositoriesByRepositoryTagsByTag", + "responses": { + "200": { + "description": "Repository tag exists" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Check repository tag", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Check repository tag", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/headV2NamespacesByNamespaceRepositoriesByRepositoryTagsByTag/", + "variants": [ + { + "description": "Repository tag exists", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/head/responses/200", + "status": "200" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/head/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1namespaces~1{namespace}~1repositories~1{repository}~1tags~1{tag}/head/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/{name}/access-tokens'", + "curlNotes": [], + "deprecated": null, + "description": "List access tokens for an organization.\n", + "id": "getV2OrgsByNameAccessTokens", + "line": 1000, + "method": "GET", + "parameters": [ + { + "description": "Page number to return.", + "in": "query", + "name": "page", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/get/parameters/0", + "schema": { + "default": 1, + "type": "number" + } + }, + { + "description": "Number of results per page.", + "in": "query", + "name": "page_size", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/get/parameters/1", + "schema": { + "default": 10, + "type": "number" + } + } + ], + "path": "/v2/orgs/{name}/access-tokens", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/get", + "raw": { + "description": "List access tokens for an organization.\n", + "operationId": "getV2OrgsByNameAccessTokens", + "parameters": [ + { + "description": "Page number to return.", + "in": "query", + "name": "page", + "schema": { + "default": 1, + "type": "number" + } + }, + { + "description": "Number of results per page.", + "in": "query", + "name": "page_size", + "schema": { + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getOrgAccessTokensResponse" + } + } + }, + "description": "OK" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "List access tokens", + "tags": [ + "org-access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/getOrgAccessTokensResponse", + "url": "/reference/api/hub/latest/schemas/getOrgAccessTokensResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List access tokens", + "tags": [ + "org-access-tokens" + ], + "url": "/reference/api/hub/latest/operations/getV2OrgsByNameAccessTokens/", + "variants": [ + { + "description": "OK", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"next\": null,\n \"previous\": null,\n \"results\": [\n {\n \"created_at\": \"2022-05-20T00:54:18Z\",\n \"created_by\": \"johndoe\",\n \"expires_at\": \"2023-05-20T00:54:18Z\",\n \"id\": \"a7a5ef25-8889-43a0-8cc7-f2a94268e861\",\n \"is_active\": true,\n \"label\": \"My organization token\",\n \"last_used_at\": \"2022-06-15T12:30:45Z\"\n }\n ],\n \"total\": 1\n}", + "value": { + "next": null, + "previous": null, + "results": [ + { + "created_at": "2022-05-20T00:54:18Z", + "created_by": "johndoe", + "expires_at": "2023-05-20T00:54:18Z", + "id": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "is_active": true, + "label": "My organization token", + "last_used_at": "2022-06-15T12:30:45Z" + } + ], + "total": 1 + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/getOrgAccessTokensResponse" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"description\": \"Token for CI/CD pipeline\",\n \"label\": \"My organization token\",\n \"resources\": [\n {\n \"path\": \"myorg/myrepo\",\n \"scopes\": [\n \"scope-image-pull\"\n ],\n \"type\": \"TYPE_REPO\"\n }\n ]\n}' \\\n 'https://hub.docker.com/v2/orgs/{name}/access-tokens'", + "curlNotes": [], + "deprecated": null, + "description": "Create an access token for an organization.\n", + "id": "postV2OrgsByNameAccessTokens", + "line": 970, + "method": "POST", + "parameters": [], + "path": "/v2/orgs/{name}/access-tokens", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/post", + "raw": { + "description": "Create an access token for an organization.\n", + "operationId": "postV2OrgsByNameAccessTokens", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createOrgAccessTokenRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/createOrgAccessTokenResponse" + } + } + }, + "description": "Created" + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Create access token", + "tags": [ + "org-access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/BadRequest", + "url": null + }, + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/createOrgAccessTokenRequest", + "url": "/reference/api/hub/latest/schemas/createOrgAccessTokenRequest/" + }, + { + "ref": "#/components/schemas/createOrgAccessTokenResponse", + "url": "/reference/api/hub/latest/schemas/createOrgAccessTokenResponse/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/createOrgAccessTokenRequest" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Create access token", + "tags": [ + "org-access-tokens" + ], + "url": "/reference/api/hub/latest/operations/postV2OrgsByNameAccessTokens/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"Token for CI/CD pipeline\",\n \"label\": \"My organization token\",\n \"resources\": [\n {\n \"path\": \"myorg/myrepo\",\n \"scopes\": [\n \"scope-image-pull\"\n ],\n \"type\": \"TYPE_REPO\"\n }\n ]\n}", + "value": { + "description": "Token for CI/CD pipeline", + "label": "My organization token", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/createOrgAccessTokenRequest" + }, + "status": "" + }, + { + "description": "Created", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"created_at\": \"2022-05-20T00:54:18Z\",\n \"expires_at\": \"2023-05-20T00:54:18Z\",\n \"id\": \"a7a5ef25-8889-43a0-8cc7-f2a94268e861\",\n \"is_active\": true,\n \"label\": \"My organization token\",\n \"last_used_at\": \"2022-06-15T12:30:45Z\",\n \"resources\": [\n {\n \"path\": \"myorg/myrepo\",\n \"scopes\": [\n \"scope-image-pull\"\n ],\n \"type\": \"TYPE_REPO\"\n }\n ],\n \"token\": \"dckr_oat_7awgM4jG5SQvxcvmNzhKj8PQjxo\"\n}", + "value": { + "created_at": "2022-05-20T00:54:18Z", + "expires_at": "2023-05-20T00:54:18Z", + "id": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "is_active": true, + "label": "My organization token", + "last_used_at": "2022-06-15T12:30:45Z", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ], + "token": "dckr_oat_7awgM4jG5SQvxcvmNzhKj8PQjxo" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/createOrgAccessTokenResponse" + }, + "status": "201" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/post/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/post/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1access-tokens/post/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/\u003cNAME\u003e/settings'", + "curlNotes": [], + "deprecated": null, + "description": "Returns organization settings by name.\n", + "id": "getV2OrgsByNameSettings", + "line": 899, + "method": "GET", + "parameters": [ + { + "description": "Name of the organization.", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{name}/settings", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/get", + "raw": { + "description": "Returns organization settings by name.\n", + "operationId": "getV2OrgsByNameSettings", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orgSettings" + } + } + }, + "description": "OK" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Get organization settings", + "tags": [ + "org-settings" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/orgSettings", + "url": "/reference/api/hub/latest/schemas/orgSettings/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get organization settings", + "tags": [ + "org-settings" + ], + "url": "/reference/api/hub/latest/operations/getV2OrgsByNameSettings/", + "variants": [ + { + "description": "OK", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"restricted_images\": {\n \"allow_official_images\": true,\n \"allow_verified_publishers\": true,\n \"enabled\": true\n }\n}", + "value": { + "restricted_images": { + "allow_official_images": true, + "allow_verified_publishers": true, + "enabled": true + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/orgSettings" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PUT \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"restricted_images\": {\n \"allow_official_images\": true,\n \"allow_verified_publishers\": true,\n \"enabled\": true\n }\n}' \\\n 'https://hub.docker.com/v2/orgs/\u003cNAME\u003e/settings'", + "curlNotes": [], + "deprecated": null, + "description": "Updates an organization's settings. Some settings are only used when the organization is on a business subscription.\n\n***Only users with administrative privileges for the organization (owner role) can modify these settings.***\n\nThe following settings are only used on a business subscription:\n- `restricted_images`\n", + "id": "putV2OrgsByNameSettings", + "line": 921, + "method": "PUT", + "parameters": [ + { + "description": "Name of the organization.", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{name}/settings", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/put", + "raw": { + "description": "Updates an organization's settings. Some settings are only used when the organization is on a business subscription.\n\n***Only users with administrative privileges for the organization (owner role) can modify these settings.***\n\nThe following settings are only used on a business subscription:\n- `restricted_images`\n", + "operationId": "putV2OrgsByNameSettings", + "requestBody": { + "content": { + "application/json": { + "schema": { + "examples": [ + { + "restricted_images": { + "allow_official_images": true, + "allow_verified_publishers": true, + "enabled": true + } + } + ], + "properties": { + "restricted_images": { + "allOf": [ + { + "$ref": "#/components/schemas/restricted_images" + }, + { + "required": [ + "enabled", + "allow_official_images", + "allow_verified_publishers" + ], + "type": "object" + } + ] + } + }, + "required": [ + "restricted_images" + ] + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/orgSettings" + } + } + }, + "description": "OK" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Update organization settings", + "tags": [ + "org-settings" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/orgSettings", + "url": "/reference/api/hub/latest/schemas/orgSettings/" + }, + { + "ref": "#/components/schemas/restricted_images", + "url": "/reference/api/hub/latest/schemas/restricted_images/" + } + ], + "requestSchema": { + "examples": [ + { + "restricted_images": { + "allow_official_images": true, + "allow_verified_publishers": true, + "enabled": true + } + } + ], + "properties": { + "restricted_images": { + "allOf": [ + { + "$ref": "#/components/schemas/restricted_images" + }, + { + "required": [ + "enabled", + "allow_official_images", + "allow_verified_publishers" + ], + "type": "object" + } + ] + } + }, + "required": [ + "restricted_images" + ] + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Update organization settings", + "tags": [ + "org-settings" + ], + "url": "/reference/api/hub/latest/operations/putV2OrgsByNameSettings/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"restricted_images\": {\n \"allow_official_images\": true,\n \"allow_verified_publishers\": true,\n \"enabled\": true\n }\n}", + "value": { + "restricted_images": { + "allow_official_images": true, + "allow_verified_publishers": true, + "enabled": true + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/put/requestBody/content/application~1json", + "required": true, + "schema": { + "examples": [ + { + "restricted_images": { + "allow_official_images": true, + "allow_verified_publishers": true, + "enabled": true + } + } + ], + "properties": { + "restricted_images": { + "allOf": [ + { + "$ref": "#/components/schemas/restricted_images" + }, + { + "required": [ + "enabled", + "allow_official_images", + "allow_verified_publishers" + ], + "type": "object" + } + ] + } + }, + "required": [ + "restricted_images" + ] + }, + "status": "" + }, + { + "description": "OK", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"restricted_images\": {\n \"allow_official_images\": true,\n \"allow_verified_publishers\": true,\n \"enabled\": true\n }\n}", + "value": { + "restricted_images": { + "allow_official_images": true, + "allow_verified_publishers": true, + "enabled": true + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/put/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/orgSettings" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/put/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/put/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{name}~1settings/put/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/myorganization/access-tokens/a7a5ef25-8889-43a0-8cc7-f2a94268e861'", + "curlNotes": [], + "deprecated": null, + "description": "Get details of a specific access token for an organization.\n", + "id": "getV2OrgsByOrgNameAccessTokensByAccessTokenId", + "line": 1045, + "method": "GET", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The ID of the access token to retrieve", + "example": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "in": "path", + "name": "access_token_id", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/access-tokens/{access_token_id}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/get", + "raw": { + "description": "Get details of a specific access token for an organization.\n", + "operationId": "getV2OrgsByOrgNameAccessTokensByAccessTokenId", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getOrgAccessTokenResponse" + } + } + }, + "description": "OK" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Get access token", + "tags": [ + "org-access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/getOrgAccessTokenResponse", + "url": "/reference/api/hub/latest/schemas/getOrgAccessTokenResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get access token", + "tags": [ + "org-access-tokens" + ], + "url": "/reference/api/hub/latest/operations/getV2OrgsByOrgNameAccessTokensByAccessTokenId/", + "variants": [ + { + "description": "OK", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"created_at\": \"2022-05-20T00:54:18Z\",\n \"created_by\": \"johndoe\",\n \"expires_at\": \"2023-05-20T00:54:18Z\",\n \"id\": \"a7a5ef25-8889-43a0-8cc7-f2a94268e861\",\n \"is_active\": true,\n \"label\": \"My organization token\",\n \"last_used_at\": \"2022-06-15T12:30:45Z\",\n \"resources\": [\n {\n \"path\": \"myorg/myrepo\",\n \"scopes\": [\n \"scope-image-pull\"\n ],\n \"type\": \"TYPE_REPO\"\n }\n ]\n}", + "value": { + "created_at": "2022-05-20T00:54:18Z", + "created_by": "johndoe", + "expires_at": "2023-05-20T00:54:18Z", + "id": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "is_active": true, + "label": "My organization token", + "last_used_at": "2022-06-15T12:30:45Z", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/getOrgAccessTokenResponse" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://hub.docker.com/v2/orgs/myorganization/access-tokens/a7a5ef25-8889-43a0-8cc7-f2a94268e861'", + "curlNotes": [], + "deprecated": null, + "description": "Delete a specific access token for an organization. This action cannot be undone.\n", + "id": "deleteV2OrgsByOrgNameAccessTokensByAccessTokenId", + "line": 1095, + "method": "DELETE", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The ID of the access token to retrieve", + "example": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "in": "path", + "name": "access_token_id", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/access-tokens/{access_token_id}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/delete", + "raw": { + "description": "Delete a specific access token for an organization. This action cannot be undone.\n", + "operationId": "deleteV2OrgsByOrgNameAccessTokensByAccessTokenId", + "responses": { + "204": { + "description": "Access token deleted successfully" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Delete access token", + "tags": [ + "org-access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Delete access token", + "tags": [ + "org-access-tokens" + ], + "url": "/reference/api/hub/latest/operations/deleteV2OrgsByOrgNameAccessTokensByAccessTokenId/", + "variants": [ + { + "description": "Access token deleted successfully", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/delete/responses/204", + "status": "204" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/delete/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/delete/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/delete/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PATCH \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"description\": \"Token for CI/CD pipeline\",\n \"is_active\": true,\n \"label\": \"My organization token\",\n \"resources\": [\n {\n \"path\": \"myorg/myrepo\",\n \"scopes\": [\n \"scope-image-pull\"\n ],\n \"type\": \"TYPE_REPO\"\n }\n ]\n}' \\\n 'https://hub.docker.com/v2/orgs/myorganization/access-tokens/a7a5ef25-8889-43a0-8cc7-f2a94268e861'", + "curlNotes": [], + "deprecated": null, + "description": "Update a specific access token for an organization.\n", + "id": "patchV2OrgsByOrgNameAccessTokensByAccessTokenId", + "line": 1067, + "method": "PATCH", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The ID of the access token to retrieve", + "example": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "in": "path", + "name": "access_token_id", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/access-tokens/{access_token_id}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/patch", + "raw": { + "description": "Update a specific access token for an organization.\n", + "operationId": "patchV2OrgsByOrgNameAccessTokensByAccessTokenId", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/updateOrgAccessTokenRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/updateOrgAccessTokenResponse" + } + } + }, + "description": "OK" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Update access token", + "tags": [ + "org-access-tokens" + ] + }, + "references": [ + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/updateOrgAccessTokenRequest", + "url": "/reference/api/hub/latest/schemas/updateOrgAccessTokenRequest/" + }, + { + "ref": "#/components/schemas/updateOrgAccessTokenResponse", + "url": "/reference/api/hub/latest/schemas/updateOrgAccessTokenResponse/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/updateOrgAccessTokenRequest" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Update access token", + "tags": [ + "org-access-tokens" + ], + "url": "/reference/api/hub/latest/operations/patchV2OrgsByOrgNameAccessTokensByAccessTokenId/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"Token for CI/CD pipeline\",\n \"is_active\": true,\n \"label\": \"My organization token\",\n \"resources\": [\n {\n \"path\": \"myorg/myrepo\",\n \"scopes\": [\n \"scope-image-pull\"\n ],\n \"type\": \"TYPE_REPO\"\n }\n ]\n}", + "value": { + "description": "Token for CI/CD pipeline", + "is_active": true, + "label": "My organization token", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/patch/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/updateOrgAccessTokenRequest" + }, + "status": "" + }, + { + "description": "OK", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"created_at\": \"2022-05-20T00:54:18Z\",\n \"created_by\": \"johndoe\",\n \"expires_at\": \"2023-05-20T00:54:18Z\",\n \"id\": \"a7a5ef25-8889-43a0-8cc7-f2a94268e861\",\n \"is_active\": true,\n \"label\": \"My organization token\",\n \"last_used_at\": \"2022-06-15T12:30:45Z\",\n \"resources\": [\n {\n \"path\": \"myorg/myrepo\",\n \"scopes\": [\n \"scope-image-pull\"\n ],\n \"type\": \"TYPE_REPO\"\n }\n ]\n}", + "value": { + "created_at": "2022-05-20T00:54:18Z", + "created_by": "johndoe", + "expires_at": "2023-05-20T00:54:18Z", + "id": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "is_active": true, + "label": "My organization token", + "last_used_at": "2022-06-15T12:30:45Z", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/patch/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/updateOrgAccessTokenResponse" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/patch/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/patch/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1access-tokens~1{access_token_id}/patch/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/myorganization/groups'", + "curlNotes": [], + "deprecated": null, + "description": "Get groups of an organization.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "getV2OrgsByOrgNameGroups", + "line": 1834, + "method": "GET", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Page number (starts on 1).", + "in": "query", + "name": "page", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/get/parameters/0", + "schema": { + "type": "integer" + } + }, + { + "description": "Number of items (rows) per page.", + "in": "query", + "name": "page_size", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/get/parameters/1", + "schema": { + "type": "integer" + } + }, + { + "description": "Get groups for the specified username in the organization.", + "in": "query", + "name": "username", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/get/parameters/2", + "schema": { + "type": "string" + } + }, + { + "description": "Get groups for the specified group in the organization.", + "in": "query", + "name": "search", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/get/parameters/3", + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/groups", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/get", + "raw": { + "description": "Get groups of an organization.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "getV2OrgsByOrgNameGroups", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "description": "Get groups for the specified username in the organization.", + "in": "query", + "name": "username", + "schema": { + "type": "string" + } + }, + { + "description": "Get groups for the specified group in the organization.", + "in": "query", + "name": "search", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "examples": [ + { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "description": "Development team", + "id": 10, + "member_count": 1, + "name": "developers", + "role": "member", + "uuid": "e36eca69-4cc8-4f17-9845-ae8c2b832691" + } + ] + } + ], + "properties": { + "count": { + "example": 1, + "type": "number" + }, + "next": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "previous": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "results": { + "items": { + "$ref": "#/components/schemas/org_group" + }, + "type": "array" + } + }, + "type": "object" + } + } + }, + "description": "" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Get groups of an organization", + "tags": [ + "groups" + ] + }, + "references": [ + { + "ref": "#/components/parameters/page", + "url": null + }, + { + "ref": "#/components/parameters/page_size", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/org_group", + "url": "/reference/api/hub/latest/schemas/org_group/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get groups of an organization", + "tags": [ + "groups" + ], + "url": "/reference/api/hub/latest/operations/getV2OrgsByOrgNameGroups/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"count\": 1,\n \"next\": null,\n \"previous\": null,\n \"results\": [\n {\n \"description\": \"Development team\",\n \"id\": 10,\n \"member_count\": 1,\n \"name\": \"developers\",\n \"role\": \"member\",\n \"uuid\": \"e36eca69-4cc8-4f17-9845-ae8c2b832691\"\n }\n ]\n}", + "value": { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "description": "Development team", + "id": 10, + "member_count": 1, + "name": "developers", + "role": "member", + "uuid": "e36eca69-4cc8-4f17-9845-ae8c2b832691" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/get/responses/200/content/application~1json", + "required": null, + "schema": { + "examples": [ + { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "description": "Development team", + "id": 10, + "member_count": 1, + "name": "developers", + "role": "member", + "uuid": "e36eca69-4cc8-4f17-9845-ae8c2b832691" + } + ] + } + ], + "properties": { + "count": { + "example": 1, + "type": "number" + }, + "next": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "previous": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "results": { + "items": { + "$ref": "#/components/schemas/org_group" + }, + "type": "array" + } + }, + "type": "object" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"description\": \"Development team\",\n \"name\": \"developers\"\n}' \\\n 'https://hub.docker.com/v2/orgs/myorganization/groups'", + "curlNotes": [], + "deprecated": null, + "description": "Create a new group within an organization.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "postV2OrgsByOrgNameGroups", + "line": 1900, + "method": "POST", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/groups", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/post", + "raw": { + "description": "Create a new group within an organization.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "postV2OrgsByOrgNameGroups", + "requestBody": { + "content": { + "application/json": { + "schema": { + "examples": [ + { + "description": "Development team", + "name": "developers" + } + ], + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/org_group" + } + } + }, + "description": "Group created successfully" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Create a new group", + "tags": [ + "groups" + ] + }, + "references": [ + { + "ref": "#/components/responses/bad_request", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/org_group", + "url": "/reference/api/hub/latest/schemas/org_group/" + } + ], + "requestSchema": { + "examples": [ + { + "description": "Development team", + "name": "developers" + } + ], + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Create a new group", + "tags": [ + "groups" + ], + "url": "/reference/api/hub/latest/operations/postV2OrgsByOrgNameGroups/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"Development team\",\n \"name\": \"developers\"\n}", + "value": { + "description": "Development team", + "name": "developers" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/post/requestBody/content/application~1json", + "required": null, + "schema": { + "examples": [ + { + "description": "Development team", + "name": "developers" + } + ], + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "status": "" + }, + { + "description": "Group created successfully", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"Development team\",\n \"id\": 10,\n \"member_count\": 1,\n \"name\": \"developers\",\n \"role\": \"member\",\n \"uuid\": \"e36eca69-4cc8-4f17-9845-ae8c2b832691\"\n}", + "value": { + "description": "Development team", + "id": 10, + "member_count": 1, + "name": "developers", + "role": "member", + "uuid": "e36eca69-4cc8-4f17-9845-ae8c2b832691" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/org_group" + }, + "status": "201" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/post/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups/post/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/myorganization/groups/developers'", + "curlNotes": [], + "deprecated": null, + "description": "Get a group of an organization.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "getV2OrgsByOrgNameGroupsByGroupName", + "line": 1943, + "method": "GET", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the group (team) in the organization.", + "in": "path", + "name": "group_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/parameters/1", + "required": true, + "schema": { + "example": "developers", + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/groups/{group_name}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/get", + "raw": { + "description": "Get a group of an organization.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "getV2OrgsByOrgNameGroupsByGroupName", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/org_group" + } + } + }, + "description": "" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Get a group of an organization", + "tags": [ + "groups" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/org_group", + "url": "/reference/api/hub/latest/schemas/org_group/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get a group of an organization", + "tags": [ + "groups" + ], + "url": "/reference/api/hub/latest/operations/getV2OrgsByOrgNameGroupsByGroupName/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"Development team\",\n \"id\": 10,\n \"member_count\": 1,\n \"name\": \"developers\",\n \"role\": \"member\",\n \"uuid\": \"e36eca69-4cc8-4f17-9845-ae8c2b832691\"\n}", + "value": { + "description": "Development team", + "id": 10, + "member_count": 1, + "name": "developers", + "role": "member", + "uuid": "e36eca69-4cc8-4f17-9845-ae8c2b832691" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/org_group" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PUT \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"description\": \"Development team\",\n \"name\": \"developers\"\n}' \\\n 'https://hub.docker.com/v2/orgs/myorganization/groups/developers'", + "curlNotes": [], + "deprecated": null, + "description": "Update the details for an organization group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "putV2OrgsByOrgNameGroupsByGroupName", + "line": 1967, + "method": "PUT", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the group (team) in the organization.", + "in": "path", + "name": "group_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/parameters/1", + "required": true, + "schema": { + "example": "developers", + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/groups/{group_name}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/put", + "raw": { + "description": "Update the details for an organization group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "putV2OrgsByOrgNameGroupsByGroupName", + "requestBody": { + "content": { + "application/json": { + "schema": { + "examples": [ + { + "description": "Development team", + "name": "developers" + } + ], + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/org_group" + } + } + }, + "description": "" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Update the details for an organization group", + "tags": [ + "groups" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/org_group", + "url": "/reference/api/hub/latest/schemas/org_group/" + } + ], + "requestSchema": { + "examples": [ + { + "description": "Development team", + "name": "developers" + } + ], + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Update the details for an organization group", + "tags": [ + "groups" + ], + "url": "/reference/api/hub/latest/operations/putV2OrgsByOrgNameGroupsByGroupName/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"Development team\",\n \"name\": \"developers\"\n}", + "value": { + "description": "Development team", + "name": "developers" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/put/requestBody/content/application~1json", + "required": null, + "schema": { + "examples": [ + { + "description": "Development team", + "name": "developers" + } + ], + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "status": "" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"Development team\",\n \"id\": 10,\n \"member_count\": 1,\n \"name\": \"developers\",\n \"role\": \"member\",\n \"uuid\": \"e36eca69-4cc8-4f17-9845-ae8c2b832691\"\n}", + "value": { + "description": "Development team", + "id": 10, + "member_count": 1, + "name": "developers", + "role": "member", + "uuid": "e36eca69-4cc8-4f17-9845-ae8c2b832691" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/put/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/org_group" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/put/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/put/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/put/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://hub.docker.com/v2/orgs/myorganization/groups/developers'", + "curlNotes": [], + "deprecated": null, + "description": "Delete an organization group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "deleteV2OrgsByOrgNameGroupsByGroupName", + "line": 2048, + "method": "DELETE", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the group (team) in the organization.", + "in": "path", + "name": "group_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/parameters/1", + "required": true, + "schema": { + "example": "developers", + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/groups/{group_name}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/delete", + "raw": { + "description": "Delete an organization group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "deleteV2OrgsByOrgNameGroupsByGroupName", + "responses": { + "204": { + "description": "Group deleted successfully" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Delete an organization group", + "tags": [ + "groups" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Delete an organization group", + "tags": [ + "groups" + ], + "url": "/reference/api/hub/latest/operations/deleteV2OrgsByOrgNameGroupsByGroupName/", + "variants": [ + { + "description": "Group deleted successfully", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/delete/responses/204", + "status": "204" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/delete/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/delete/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/delete/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PATCH \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"description\": \"Development team\",\n \"role\": \"member\"\n}' \\\n 'https://hub.docker.com/v2/orgs/myorganization/groups/developers'", + "curlNotes": [], + "deprecated": null, + "description": "Update some details for an organization group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "patchV2OrgsByOrgNameGroupsByGroupName", + "line": 2005, + "method": "PATCH", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the group (team) in the organization.", + "in": "path", + "name": "group_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/parameters/1", + "required": true, + "schema": { + "example": "developers", + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/groups/{group_name}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/patch", + "raw": { + "description": "Update some details for an organization group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "patchV2OrgsByOrgNameGroupsByGroupName", + "requestBody": { + "content": { + "application/json": { + "schema": { + "examples": [ + { + "description": "Development team", + "role": "member" + } + ], + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "role": { + "description": "Role assigned to the team. Valid values are the core roles\n`owner`, `editor`, and `member`, or the name of an\nexisting [custom role](https://docs.docker.com/security/roles-and-permissions/custom-roles/manage/).\nUse the custom role's name identifier, not its label or UUID.\n", + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/org_group" + } + } + }, + "description": "" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Update some details for an organization group", + "tags": [ + "groups" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/org_group", + "url": "/reference/api/hub/latest/schemas/org_group/" + } + ], + "requestSchema": { + "examples": [ + { + "description": "Development team", + "role": "member" + } + ], + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "role": { + "description": "Role assigned to the team. Valid values are the core roles\n`owner`, `editor`, and `member`, or the name of an\nexisting [custom role](https://docs.docker.com/security/roles-and-permissions/custom-roles/manage/).\nUse the custom role's name identifier, not its label or UUID.\n", + "type": "string" + } + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Update some details for an organization group", + "tags": [ + "groups" + ], + "url": "/reference/api/hub/latest/operations/patchV2OrgsByOrgNameGroupsByGroupName/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"Development team\",\n \"role\": \"member\"\n}", + "value": { + "description": "Development team", + "role": "member" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/patch/requestBody/content/application~1json", + "required": null, + "schema": { + "examples": [ + { + "description": "Development team", + "role": "member" + } + ], + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "role": { + "description": "Role assigned to the team. Valid values are the core roles\n`owner`, `editor`, and `member`, or the name of an\nexisting [custom role](https://docs.docker.com/security/roles-and-permissions/custom-roles/manage/).\nUse the custom role's name identifier, not its label or UUID.\n", + "type": "string" + } + } + }, + "status": "" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"Development team\",\n \"id\": 10,\n \"member_count\": 1,\n \"name\": \"developers\",\n \"role\": \"member\",\n \"uuid\": \"e36eca69-4cc8-4f17-9845-ae8c2b832691\"\n}", + "value": { + "description": "Development team", + "id": 10, + "member_count": 1, + "name": "developers", + "role": "member", + "uuid": "e36eca69-4cc8-4f17-9845-ae8c2b832691" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/patch/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/org_group" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/patch/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/patch/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}/patch/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/myorganization/groups/developers/members'", + "curlNotes": [], + "deprecated": null, + "description": "List the members (users) that are in a group.\nIf user is owner of the org or has otherwise elevated permissions, they can search by email and the result will also contain emails.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "getV2OrgsByOrgNameGroupsByGroupNameMembers", + "line": 2070, + "method": "GET", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the group (team) in the organization.", + "in": "path", + "name": "group_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get/parameters/1", + "required": true, + "schema": { + "example": "developers", + "type": "string" + } + }, + { + "description": "Page number (starts on 1).", + "in": "query", + "name": "page", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get/parameters/2", + "schema": { + "type": "integer" + } + }, + { + "description": "Number of items (rows) per page.", + "in": "query", + "name": "page_size", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get/parameters/3", + "schema": { + "type": "integer" + } + }, + { + "description": "Search members by username, full_name or email.", + "in": "query", + "name": "search", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get/parameters/4", + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/groups/{group_name}/members", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get", + "raw": { + "description": "List the members (users) that are in a group.\nIf user is owner of the org or has otherwise elevated permissions, they can search by email and the result will also contain emails.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "getV2OrgsByOrgNameGroupsByGroupNameMembers", + "parameters": [ + { + "$ref": "#/components/parameters/org_name" + }, + { + "$ref": "#/components/parameters/group_name" + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "description": "Search members by username, full_name or email.", + "in": "query", + "name": "search", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "examples": [ + { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "date_joined": "2021-01-05T21:06:53.506400Z", + "email": "example@docker.com", + "full_name": "Jon Snow", + "id": "0ab70deb065a43fcacd55d48caa945d8", + "type": "User", + "username": "dockeruser" + } + ] + } + ], + "properties": { + "count": { + "example": 1, + "type": "number" + }, + "next": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "previous": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "results": { + "items": { + "$ref": "#/components/schemas/group_member" + }, + "type": "array" + } + }, + "type": "object" + } + } + }, + "description": "" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "List members of a group", + "tags": [ + "groups" + ] + }, + "references": [ + { + "ref": "#/components/parameters/group_name", + "url": null + }, + { + "ref": "#/components/parameters/org_name", + "url": null + }, + { + "ref": "#/components/parameters/page", + "url": null + }, + { + "ref": "#/components/parameters/page_size", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/group_member", + "url": "/reference/api/hub/latest/schemas/group_member/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List members of a group", + "tags": [ + "groups" + ], + "url": "/reference/api/hub/latest/operations/getV2OrgsByOrgNameGroupsByGroupNameMembers/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"count\": 1,\n \"next\": null,\n \"previous\": null,\n \"results\": [\n {\n \"date_joined\": \"2021-01-05T21:06:53.506400Z\",\n \"email\": \"example@docker.com\",\n \"full_name\": \"Jon Snow\",\n \"id\": \"0ab70deb065a43fcacd55d48caa945d8\",\n \"type\": \"User\",\n \"username\": \"dockeruser\"\n }\n ]\n}", + "value": { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "date_joined": "2021-01-05T21:06:53.506400Z", + "email": "example@docker.com", + "full_name": "Jon Snow", + "id": "0ab70deb065a43fcacd55d48caa945d8", + "type": "User", + "username": "dockeruser" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get/responses/200/content/application~1json", + "required": null, + "schema": { + "examples": [ + { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "date_joined": "2021-01-05T21:06:53.506400Z", + "email": "example@docker.com", + "full_name": "Jon Snow", + "id": "0ab70deb065a43fcacd55d48caa945d8", + "type": "User", + "username": "dockeruser" + } + ] + } + ], + "properties": { + "count": { + "example": 1, + "type": "number" + }, + "next": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "previous": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "results": { + "items": { + "$ref": "#/components/schemas/group_member" + }, + "type": "array" + } + }, + "type": "object" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"member\": \"jonsnow\"\n}' \\\n 'https://hub.docker.com/v2/orgs/myorganization/groups/developers/members'", + "curlNotes": [], + "deprecated": null, + "description": "Add a member to a group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "postV2OrgsByOrgNameGroupsByGroupNameMembers", + "line": 2134, + "method": "POST", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the group (team) in the organization.", + "in": "path", + "name": "group_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/post/parameters/1", + "required": true, + "schema": { + "example": "developers", + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/groups/{group_name}/members", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/post", + "raw": { + "description": "Add a member to a group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "postV2OrgsByOrgNameGroupsByGroupNameMembers", + "parameters": [ + { + "$ref": "#/components/parameters/org_name" + }, + { + "$ref": "#/components/parameters/group_name" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/add_member_to_org_group" + }, + "responses": { + "200": { + "description": "OK" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "500": { + "$ref": "#/components/responses/internal_error" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Add a member to a group", + "tags": [ + "groups" + ] + }, + "references": [ + { + "ref": "#/components/parameters/group_name", + "url": null + }, + { + "ref": "#/components/parameters/org_name", + "url": null + }, + { + "ref": "#/components/requestBodies/add_member_to_org_group", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/internal_error", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + } + ], + "requestSchema": { + "examples": [ + { + "member": "jonsnow" + } + ], + "properties": { + "member": { + "example": "jonsnow", + "type": "string" + } + }, + "required": [ + "member" + ], + "type": "object" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Add a member to a group", + "tags": [ + "groups" + ], + "url": "/reference/api/hub/latest/operations/postV2OrgsByOrgNameGroupsByGroupNameMembers/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"member\": \"jonsnow\"\n}", + "value": { + "member": "jonsnow" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/post/requestBody/content/application~1json", + "required": true, + "schema": { + "examples": [ + { + "member": "jonsnow" + } + ], + "properties": { + "member": { + "example": "jonsnow", + "type": "string" + } + }, + "required": [ + "member" + ], + "type": "object" + }, + "status": "" + }, + { + "description": "OK", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/post/responses/200", + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/post/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/post/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + }, + { + "description": "Internal", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"internal error\"\n}", + "value": { + "errinfo": null, + "message": "internal error" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members/post/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://hub.docker.com/v2/orgs/myorganization/groups/developers/members/jonsnow'", + "curlNotes": [], + "deprecated": null, + "description": "Remove a user from a group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "deleteV2OrgsByOrgNameGroupsByGroupNameMembersByUsername", + "line": 2167, + "method": "DELETE", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members~1{username}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the group (team) in the organization.", + "in": "path", + "name": "group_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members~1{username}/parameters/1", + "required": true, + "schema": { + "example": "developers", + "type": "string" + } + }, + { + "description": "Username, identifier for the user (namespace, DockerID).", + "in": "path", + "name": "username", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members~1{username}/parameters/2", + "required": true, + "schema": { + "example": "jonsnow", + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/groups/{group_name}/members/{username}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members~1{username}/delete", + "raw": { + "description": "Remove a user from a group.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "deleteV2OrgsByOrgNameGroupsByGroupNameMembersByUsername", + "responses": { + "204": { + "description": "User removed successfully" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Remove a user from a group", + "tags": [ + "groups" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Remove a user from a group", + "tags": [ + "groups" + ], + "url": "/reference/api/hub/latest/operations/deleteV2OrgsByOrgNameGroupsByGroupNameMembersByUsername/", + "variants": [ + { + "description": "User removed successfully", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members~1{username}/delete/responses/204", + "status": "204" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members~1{username}/delete/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members~1{username}/delete/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1groups~1{group_name}~1members~1{username}/delete/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/myorganization/invites'", + "curlNotes": [], + "deprecated": null, + "description": "Return all pending invites for a given org, only team owners can call this endpoint\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "getV2OrgsByOrgNameInvites", + "line": 1793, + "method": "GET", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1invites/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/invites", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1invites/get", + "raw": { + "description": "Return all pending invites for a given org, only team owners can call this endpoint\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "getV2OrgsByOrgNameInvites", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "examples": [ + { + "data": [ + { + "created_at": "2021-10-28T18:30:19.520861Z", + "id": "e36eca69-4cc8-4f17-9845-ae8c2b832691", + "invitee": "invitee@docker.com", + "inviter_username": "moby", + "org": "docker", + "team": "owners" + } + ] + } + ], + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/invite" + }, + "type": "array" + } + }, + "type": "object" + } + } + }, + "description": "" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "List org invites", + "tags": [ + "invites" + ] + }, + "references": [ + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/invite", + "url": "/reference/api/hub/latest/schemas/invite/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List org invites", + "tags": [ + "invites" + ], + "url": "/reference/api/hub/latest/operations/getV2OrgsByOrgNameInvites/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"data\": [\n {\n \"created_at\": \"2021-10-28T18:30:19.520861Z\",\n \"id\": \"e36eca69-4cc8-4f17-9845-ae8c2b832691\",\n \"invitee\": \"invitee@docker.com\",\n \"inviter_username\": \"moby\",\n \"org\": \"docker\",\n \"team\": \"owners\"\n }\n ]\n}", + "value": { + "data": [ + { + "created_at": "2021-10-28T18:30:19.520861Z", + "id": "e36eca69-4cc8-4f17-9845-ae8c2b832691", + "invitee": "invitee@docker.com", + "inviter_username": "moby", + "org": "docker", + "team": "owners" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1invites/get/responses/200/content/application~1json", + "required": null, + "schema": { + "examples": [ + { + "data": [ + { + "created_at": "2021-10-28T18:30:19.520861Z", + "id": "e36eca69-4cc8-4f17-9845-ae8c2b832691", + "invitee": "invitee@docker.com", + "inviter_username": "moby", + "org": "docker", + "team": "owners" + } + ] + } + ], + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/invite" + }, + "type": "array" + } + }, + "type": "object" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1invites/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1invites/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1invites/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/myorganization/members?type=all\u0026role=owner'", + "curlNotes": [], + "deprecated": null, + "description": "Returns a list of members for an organization.\n\n_The following fields are only visible to orgs with insights enabled._\n\n- `last_logged_in_at`\n- `last_seen_at`\n- `last_desktop_version`\n\nTo make visible, please see [View Insights for organization users](https://docs.docker.com/accounts/organization/insights/#view-insights-for-organization-users).\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "getV2OrgsByOrgNameMembers", + "line": 1645, + "method": "GET", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Search term.", + "in": "query", + "name": "search", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/parameters/1", + "schema": { + "type": "integer" + } + }, + { + "description": "Page number (starts on 1).", + "in": "query", + "name": "page", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/parameters/2", + "schema": { + "type": "integer" + } + }, + { + "description": "Number of items (rows) per page.", + "in": "query", + "name": "page_size", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/parameters/3", + "schema": { + "type": "integer" + } + }, + { + "description": "Include invites in the response.", + "in": "query", + "name": "invites", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/parameters/4", + "schema": { + "type": "boolean" + } + }, + { + "description": "Filter members by membership type.", + "example": "all", + "in": "query", + "name": "type", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/parameters/5", + "schema": { + "enum": [ + "all", + "invitee", + "member" + ], + "type": "string" + } + }, + { + "description": "Filter members by their organization role.", + "example": "owner", + "in": "query", + "name": "role", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/parameters/6", + "schema": { + "enum": [ + "owner", + "editor", + "member" + ], + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/members", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/get", + "raw": { + "description": "Returns a list of members for an organization.\n\n_The following fields are only visible to orgs with insights enabled._\n\n- `last_logged_in_at`\n- `last_seen_at`\n- `last_desktop_version`\n\nTo make visible, please see [View Insights for organization users](https://docs.docker.com/accounts/organization/insights/#view-insights-for-organization-users).\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "getV2OrgsByOrgNameMembers", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/org_member_paginated" + } + } + }, + "description": "List of members" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "List org members", + "tags": [ + "orgs" + ] + }, + "references": [ + { + "ref": "#/components/responses/bad_request", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/org_member_paginated", + "url": "/reference/api/hub/latest/schemas/org_member_paginated/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List org members", + "tags": [ + "orgs" + ], + "url": "/reference/api/hub/latest/operations/getV2OrgsByOrgNameMembers/", + "variants": [ + { + "description": "List of members", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"count\": 1,\n \"next\": null,\n \"previous\": null,\n \"results\": [\n {\n \"date_joined\": \"2021-01-05T21:06:53.506400Z\",\n \"email\": \"example@docker.com\",\n \"full_name\": \"Jon Snow\",\n \"groups\": [\n \"owners\"\n ],\n \"id\": \"0ab70deb065a43fcacd55d48caa945d8\",\n \"is_guest\": false,\n \"role\": \"Owner\",\n \"type\": \"User\",\n \"username\": \"dockeruser\"\n }\n ]\n}", + "value": { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "date_joined": "2021-01-05T21:06:53.506400Z", + "email": "example@docker.com", + "full_name": "Jon Snow", + "groups": [ + "owners" + ], + "id": "0ab70deb065a43fcacd55d48caa945d8", + "is_guest": false, + "role": "Owner", + "type": "User", + "username": "dockeruser" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/org_member_paginated" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/get/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "text/csv", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: text/csv' \\\n 'https://hub.docker.com/v2/orgs/myorganization/members/export'", + "curlNotes": [], + "deprecated": null, + "description": "Export members of an organization as a CSV\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "getV2OrgsByOrgNameMembersExport", + "line": 1682, + "method": "GET", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1export/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/members/export", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1export/get", + "raw": { + "description": "Export members of an organization as a CSV\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "getV2OrgsByOrgNameMembersExport", + "responses": { + "200": { + "content": { + "text/csv": { + "example": "Name,Username,Email,Type,Role,Teams,Date Joined\nJon Snow,dockeruser,example@docker.com,User,Owner,owners,2021-01-05 21:06:53.5064 +0000 UTC\n", + "schema": { + "description": "CSV columns: Name, Username, Email, Type, Role, Teams, and Date Joined. The Role column contains the assigned role label. When administrative insights are available, the export also includes Last Logged-in Date, Docker Desktop Version, Last Seen Date, and Opted Out Analytics.", + "type": "string" + } + } + }, + "description": "Exported members", + "headers": { + "Content-Disposition": { + "example": "attachment;filename=\"{org_name}-members-{timestamp}.csv\"", + "schema": { + "type": "string" + } + } + } + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Export org members CSV", + "tags": [ + "orgs" + ] + }, + "references": [ + { + "ref": "#/components/responses/bad_request", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Export org members CSV", + "tags": [ + "orgs" + ], + "url": "/reference/api/hub/latest/operations/getV2OrgsByOrgNameMembersExport/", + "variants": [ + { + "description": "Exported members", + "direction": "Response", + "examples": [ + { + "language": "text", + "name": "Example", + "text": "Name,Username,Email,Type,Role,Teams,Date Joined\nJon Snow,dockeruser,example@docker.com,User,Owner,owners,2021-01-05 21:06:53.5064 +0000 UTC\n", + "value": "Name,Username,Email,Type,Role,Teams,Date Joined\nJon Snow,dockeruser,example@docker.com,User,Owner,owners,2021-01-05 21:06:53.5064 +0000 UTC\n" + } + ], + "headers": { + "Content-Disposition": { + "example": "attachment;filename=\"{org_name}-members-{timestamp}.csv\"", + "schema": { + "type": "string" + } + } + }, + "media": "text/csv", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1export/get/responses/200/content/text~1csv", + "required": null, + "schema": { + "description": "CSV columns: Name, Username, Email, Type, Role, Teams, and Date Joined. The Role column contains the assigned role label. When administrative insights are available, the export also includes Last Logged-in Date, Docker Desktop Version, Last Seen Date, and Opted Out Analytics.", + "type": "string" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1export/get/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1export/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1export/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1export/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PUT \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"role\": \"owner\"\n}' \\\n 'https://hub.docker.com/v2/orgs/myorganization/members/jonsnow'", + "curlNotes": [], + "deprecated": null, + "description": "Updates the role of a member in the organization.\n***Only users in the \"owners\" group of the organization can use this endpoint.***\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "putV2OrgsByOrgNameMembersByUsername", + "line": 1722, + "method": "PUT", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Username, identifier for the user (namespace, DockerID).", + "in": "path", + "name": "username", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/parameters/1", + "required": true, + "schema": { + "example": "jonsnow", + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/members/{username}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/put", + "raw": { + "description": "Updates the role of a member in the organization.\n***Only users in the \"owners\" group of the organization can use this endpoint.***\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "putV2OrgsByOrgNameMembersByUsername", + "requestBody": { + "content": { + "application/json": { + "schema": { + "examples": [ + { + "role": "owner" + } + ], + "properties": { + "role": { + "description": "Role of the member. Valid values are the core roles\n`owner`, `editor`, and `member`, or the name of an\nexisting [custom role](https://docs.docker.com/security/roles-and-permissions/custom-roles/manage/).\nUse the custom role's name identifier, not its label or UUID.\n", + "example": "owner", + "type": "string" + } + }, + "required": [ + "role" + ] + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/org_member" + } + } + }, + "description": "Member role updated" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Update org member (role)", + "tags": [ + "orgs" + ] + }, + "references": [ + { + "ref": "#/components/responses/bad_request", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/org_member", + "url": "/reference/api/hub/latest/schemas/org_member/" + } + ], + "requestSchema": { + "examples": [ + { + "role": "owner" + } + ], + "properties": { + "role": { + "description": "Role of the member. Valid values are the core roles\n`owner`, `editor`, and `member`, or the name of an\nexisting [custom role](https://docs.docker.com/security/roles-and-permissions/custom-roles/manage/).\nUse the custom role's name identifier, not its label or UUID.\n", + "example": "owner", + "type": "string" + } + }, + "required": [ + "role" + ] + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Update org member (role)", + "tags": [ + "orgs" + ], + "url": "/reference/api/hub/latest/operations/putV2OrgsByOrgNameMembersByUsername/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"role\": \"owner\"\n}", + "value": { + "role": "owner" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/put/requestBody/content/application~1json", + "required": true, + "schema": { + "examples": [ + { + "role": "owner" + } + ], + "properties": { + "role": { + "description": "Role of the member. Valid values are the core roles\n`owner`, `editor`, and `member`, or the name of an\nexisting [custom role](https://docs.docker.com/security/roles-and-permissions/custom-roles/manage/).\nUse the custom role's name identifier, not its label or UUID.\n", + "example": "owner", + "type": "string" + } + }, + "required": [ + "role" + ] + }, + "status": "" + }, + { + "description": "Member role updated", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"date_joined\": \"2021-01-05T21:06:53.506400Z\",\n \"email\": \"example@docker.com\",\n \"full_name\": \"Jon Snow\",\n \"groups\": [\n \"owners\"\n ],\n \"id\": \"0ab70deb065a43fcacd55d48caa945d8\",\n \"is_guest\": false,\n \"role\": \"Owner\",\n \"type\": \"User\",\n \"username\": \"dockeruser\"\n}", + "value": { + "date_joined": "2021-01-05T21:06:53.506400Z", + "email": "example@docker.com", + "full_name": "Jon Snow", + "groups": [ + "owners" + ], + "id": "0ab70deb065a43fcacd55d48caa945d8", + "is_guest": false, + "role": "Owner", + "type": "User", + "username": "dockeruser" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/put/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/org_member" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/put/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/put/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/put/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/put/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://hub.docker.com/v2/orgs/myorganization/members/jonsnow'", + "curlNotes": [], + "deprecated": null, + "description": "Removes the member from the org, ie. all groups in the org, unless they're the last owner\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "deleteV2OrgsByOrgNameMembersByUsername", + "line": 1767, + "method": "DELETE", + "parameters": [ + { + "description": "Name of the organization (namespace).", + "example": "myorganization", + "in": "path", + "name": "org_name", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Username, identifier for the user (namespace, DockerID).", + "in": "path", + "name": "username", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/parameters/1", + "required": true, + "schema": { + "example": "jonsnow", + "type": "string" + } + } + ], + "path": "/v2/orgs/{org_name}/members/{username}", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/delete", + "raw": { + "description": "Removes the member from the org, ie. all groups in the org, unless they're the last owner\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "deleteV2OrgsByOrgNameMembersByUsername", + "responses": { + "204": { + "description": "Member removed successfully" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/not_found" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Remove member from org", + "tags": [ + "orgs" + ] + }, + "references": [ + { + "ref": "#/components/responses/bad_request", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/not_found", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Remove member from org", + "tags": [ + "orgs" + ], + "url": "/reference/api/hub/latest/operations/deleteV2OrgsByOrgNameMembersByUsername/", + "variants": [ + { + "description": "Member removed successfully", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/delete/responses/204", + "status": "204" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/delete/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/delete/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/delete/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1orgs~1{org_name}~1members~1{username}/delete/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"group_id\": 12345,\n \"permission\": \"write\"\n}' \\\n 'https://hub.docker.com/v2/repositories/\u003cNAMESPACE\u003e/\u003cREPOSITORY\u003e/groups'", + "curlNotes": [], + "deprecated": null, + "description": "Assigns an organization group (team) to a repository with a specified permission level.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "id": "CreateRepositoryGroup", + "line": 1271, + "method": "POST", + "parameters": [ + { + "description": "Namespace of the repository, such as a user or organization name.", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1v2~1repositories~1{namespace}~1{repository}~1groups/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Name of the repository within the namespace.", + "in": "path", + "name": "repository", + "pointer": "/paths/~1v2~1repositories~1{namespace}~1{repository}~1groups/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/repositories/{namespace}/{repository}/groups", + "pointer": "/paths/~1v2~1repositories~1{namespace}~1{repository}~1groups/post", + "raw": { + "description": "Assigns an organization group (team) to a repository with a specified permission level.\n\nThis operation accepts bearer tokens issued from organization access tokens (OATs). The token must have the required resource access and scopes.\n", + "operationId": "CreateRepositoryGroup", + "requestBody": { + "content": { + "application/json": { + "example": { + "group_id": 12345, + "permission": "write" + }, + "schema": { + "$ref": "#/components/schemas/RepositoryGroupCreationRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "example": { + "group_id": 12345, + "group_name": "developers", + "permission": "write" + }, + "schema": { + "$ref": "#/components/schemas/RepositoryGroup" + } + } + }, + "description": "Repository group permission created successfully" + }, + "400": { + "content": { + "application/json": { + "examples": { + "error": { + "summary": "Example error response", + "value": { + "errinfo": null, + "message": "bad request" + } + } + }, + "schema": { + "$ref": "#/components/schemas/error" + } + } + }, + "description": "Bad Request - Invalid request parameters" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "summary": "Assign a group (Team) to a repository for access", + "tags": [ + "repositories" + ] + }, + "references": [ + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/forbidden", + "url": null + }, + { + "ref": "#/components/responses/unauthorized", + "url": null + }, + { + "ref": "#/components/schemas/RepositoryGroup", + "url": "/reference/api/hub/latest/schemas/RepositoryGroup/" + }, + { + "ref": "#/components/schemas/RepositoryGroupCreationRequest", + "url": "/reference/api/hub/latest/schemas/RepositoryGroupCreationRequest/" + }, + { + "ref": "#/components/schemas/error", + "url": "/reference/api/hub/latest/schemas/error/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/RepositoryGroupCreationRequest" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Assign a group (Team) to a repository for access", + "tags": [ + "repositories" + ], + "url": "/reference/api/hub/latest/operations/CreateRepositoryGroup/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Example", + "text": "{\n \"group_id\": 12345,\n \"permission\": \"write\"\n}", + "value": { + "group_id": 12345, + "permission": "write" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1repositories~1{namespace}~1{repository}~1groups/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/RepositoryGroupCreationRequest" + }, + "status": "" + }, + { + "description": "Repository group permission created successfully", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Example", + "text": "{\n \"group_id\": 12345,\n \"group_name\": \"developers\",\n \"permission\": \"write\"\n}", + "value": { + "group_id": 12345, + "group_name": "developers", + "permission": "write" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1repositories~1{namespace}~1{repository}~1groups/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/RepositoryGroup" + }, + "status": "200" + }, + { + "description": "Bad Request - Invalid request parameters", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"bad request\"\n}", + "value": { + "errinfo": null, + "message": "bad request" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1repositories~1{namespace}~1{repository}~1groups/post/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"unauthorized\"\n}", + "value": { + "errinfo": null, + "message": "unauthorized" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1repositories~1{namespace}~1{repository}~1groups/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"permission denied\"\n}", + "value": { + "errinfo": null, + "message": "permission denied" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1repositories~1{namespace}~1{repository}~1groups/post/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"errinfo\": null,\n \"message\": \"not found\"\n}", + "value": { + "errinfo": null, + "message": "not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1repositories~1{namespace}~1{repository}~1groups/post/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/error" + }, + "status": "404" + } + ] + }, + { + "acceptMedia": "application/scim+json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${SCIM_TOKEN}\" \\\n --header 'Accept: application/scim+json' \\\n 'https://hub.docker.com/v2/scim/2.0/ResourceTypes'", + "curlNotes": [], + "deprecated": null, + "description": "Returns all resource types supported for the SCIM configuration.\n", + "id": "getV2Scim20ResourceTypes", + "line": 2293, + "method": "GET", + "parameters": [], + "path": "/v2/scim/2.0/ResourceTypes", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes/get", + "raw": { + "description": "Returns all resource types supported for the SCIM configuration.\n", + "operationId": "getV2Scim20ResourceTypes", + "responses": { + "200": { + "$ref": "#/components/responses/scim_get_resource_types_resp" + }, + "401": { + "$ref": "#/components/responses/scim_unauthorized" + }, + "500": { + "$ref": "#/components/responses/scim_error" + } + }, + "security": [ + { + "scimToken": [] + } + ], + "summary": "List resource types", + "tags": [ + "scim" + ] + }, + "references": [ + { + "ref": "#/components/responses/scim_error", + "url": null + }, + { + "ref": "#/components/responses/scim_get_resource_types_resp", + "url": null + }, + { + "ref": "#/components/responses/scim_unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "scimToken": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List resource types", + "tags": [ + "scim" + ], + "url": "/reference/api/hub/latest/operations/getV2Scim20ResourceTypes/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"Resources\": [\n {\n \"description\": \"User\",\n \"endpoint\": \"/Users\",\n \"id\": \"User\",\n \"name\": \"User\",\n \"schema\": \"urn:ietf:params:scim:schemas:core:2.0:User\",\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:ResourceType\"\n ]\n }\n ],\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:ListResponse\"\n ],\n \"totalResults\": 1\n}", + "value": { + "Resources": [ + { + "description": "User", + "endpoint": "/Users", + "id": "User", + "name": "User", + "schema": "urn:ietf:params:scim:schemas:core:2.0:User", + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:ResourceType" + ] + } + ], + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:ListResponse" + ], + "totalResults": 1 + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes/get/responses/200/content/application~1scim+json", + "required": null, + "schema": { + "examples": [ + { + "Resources": [ + { + "description": "User", + "endpoint": "/Users", + "id": "User", + "name": "User", + "schema": "urn:ietf:params:scim:schemas:core:2.0:User", + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:ResourceType" + ] + } + ], + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:ListResponse" + ], + "totalResults": 1 + } + ], + "properties": { + "Resources": { + "items": { + "$ref": "#/components/schemas/scim_resource_type" + }, + "type": "array" + }, + "schemas": { + "items": { + "example": "urn:ietf:params:scim:api:messages:2.0:ListResponse", + "type": "string" + }, + "type": "array" + }, + "totalResults": { + "example": 1, + "type": "integer" + } + }, + "type": "object" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"401\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "401" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes/get/responses/401/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "401" + } + } + } + ] + }, + "status": "401" + }, + { + "description": "Internal Error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"500\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "500" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes/get/responses/500/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "500" + } + } + } + ] + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/scim+json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${SCIM_TOKEN}\" \\\n --header 'Accept: application/scim+json' \\\n 'https://hub.docker.com/v2/scim/2.0/ResourceTypes/User'", + "curlNotes": [], + "deprecated": null, + "description": "Returns a resource type by name.\n", + "id": "getV2Scim20ResourceTypesByName", + "line": 2311, + "method": "GET", + "parameters": [ + { + "description": "Name of the SCIM resource type.", + "example": "User", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes~1{name}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/scim/2.0/ResourceTypes/{name}", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes~1{name}/get", + "raw": { + "description": "Returns a resource type by name.\n", + "operationId": "getV2Scim20ResourceTypesByName", + "parameters": [ + { + "description": "Name of the SCIM resource type.", + "example": "User", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/scim_get_resource_type_resp" + }, + "401": { + "$ref": "#/components/responses/scim_unauthorized" + }, + "404": { + "$ref": "#/components/responses/scim_not_found" + }, + "500": { + "$ref": "#/components/responses/scim_error" + } + }, + "security": [ + { + "scimToken": [] + } + ], + "summary": "Get a resource type", + "tags": [ + "scim" + ] + }, + "references": [ + { + "ref": "#/components/responses/scim_error", + "url": null + }, + { + "ref": "#/components/responses/scim_get_resource_type_resp", + "url": null + }, + { + "ref": "#/components/responses/scim_not_found", + "url": null + }, + { + "ref": "#/components/responses/scim_unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "scimToken": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get a resource type", + "tags": [ + "scim" + ], + "url": "/reference/api/hub/latest/operations/getV2Scim20ResourceTypesByName/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"description\": \"User\",\n \"endpoint\": \"/Users\",\n \"id\": \"User\",\n \"name\": \"User\",\n \"schema\": \"urn:ietf:params:scim:schemas:core:2.0:User\",\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:ResourceType\"\n ]\n}", + "value": { + "description": "User", + "endpoint": "/Users", + "id": "User", + "name": "User", + "schema": "urn:ietf:params:scim:schemas:core:2.0:User", + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:ResourceType" + ] + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes~1{name}/get/responses/200/content/application~1scim+json", + "required": null, + "schema": { + "$ref": "#/components/schemas/scim_resource_type" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"401\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "401" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes~1{name}/get/responses/401/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "401" + } + } + } + ] + }, + "status": "401" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"404\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "404" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes~1{name}/get/responses/404/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "404" + } + } + } + ] + }, + "status": "404" + }, + { + "description": "Internal Error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"500\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "500" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ResourceTypes~1{name}/get/responses/500/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "500" + } + } + } + ] + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/scim+json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${SCIM_TOKEN}\" \\\n --header 'Accept: application/scim+json' \\\n 'https://hub.docker.com/v2/scim/2.0/Schemas'", + "curlNotes": [], + "deprecated": null, + "description": "Returns all schemas supported for the SCIM configuration.\n", + "id": "getV2Scim20Schemas", + "line": 2339, + "method": "GET", + "parameters": [], + "path": "/v2/scim/2.0/Schemas", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas/get", + "raw": { + "description": "Returns all schemas supported for the SCIM configuration.\n", + "operationId": "getV2Scim20Schemas", + "responses": { + "200": { + "$ref": "#/components/responses/scim_get_schemas_resp" + }, + "401": { + "$ref": "#/components/responses/scim_unauthorized" + }, + "500": { + "$ref": "#/components/responses/scim_error" + } + }, + "security": [ + { + "scimToken": [] + } + ], + "summary": "List schemas", + "tags": [ + "scim" + ] + }, + "references": [ + { + "ref": "#/components/responses/scim_error", + "url": null + }, + { + "ref": "#/components/responses/scim_get_schemas_resp", + "url": null + }, + { + "ref": "#/components/responses/scim_unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "scimToken": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List schemas", + "tags": [ + "scim" + ], + "url": "/reference/api/hub/latest/operations/getV2Scim20Schemas/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"Resources\": [\n {\n \"attributes\": [],\n \"description\": \"User Account\",\n \"id\": \"urn:ietf:params:scim:schemas:core:2.0:User\",\n \"name\": \"User\",\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:Schema\"\n ]\n }\n ],\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:ListResponse\"\n ],\n \"totalResults\": 1\n}", + "value": { + "Resources": [ + { + "attributes": [], + "description": "User Account", + "id": "urn:ietf:params:scim:schemas:core:2.0:User", + "name": "User", + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:Schema" + ] + } + ], + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:ListResponse" + ], + "totalResults": 1 + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas/get/responses/200/content/application~1scim+json", + "required": null, + "schema": { + "examples": [ + { + "Resources": [ + { + "attributes": [], + "description": "User Account", + "id": "urn:ietf:params:scim:schemas:core:2.0:User", + "name": "User", + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:Schema" + ] + } + ], + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:ListResponse" + ], + "totalResults": 1 + } + ], + "properties": { + "Resources": { + "items": { + "$ref": "#/components/schemas/scim_schema" + }, + "type": "array" + }, + "schemas": { + "items": { + "example": "urn:ietf:params:scim:api:messages:2.0:ListResponse", + "type": "string" + }, + "type": "array" + }, + "totalResults": { + "example": 1, + "type": "integer" + } + }, + "type": "object" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"401\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "401" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas/get/responses/401/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "401" + } + } + } + ] + }, + "status": "401" + }, + { + "description": "Internal Error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"500\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "500" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas/get/responses/500/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "500" + } + } + } + ] + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/scim+json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${SCIM_TOKEN}\" \\\n --header 'Accept: application/scim+json' \\\n 'https://hub.docker.com/v2/scim/2.0/Schemas/urn:ietf:params:scim:schemas:core:2.0:User'", + "curlNotes": [], + "deprecated": null, + "description": "Returns a schema by ID.\n", + "id": "getV2Scim20SchemasById", + "line": 2357, + "method": "GET", + "parameters": [ + { + "description": "URN identifying the SCIM schema.", + "example": "urn:ietf:params:scim:schemas:core:2.0:User", + "in": "path", + "name": "id", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas~1{id}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/scim/2.0/Schemas/{id}", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas~1{id}/get", + "raw": { + "description": "Returns a schema by ID.\n", + "operationId": "getV2Scim20SchemasById", + "parameters": [ + { + "description": "URN identifying the SCIM schema.", + "example": "urn:ietf:params:scim:schemas:core:2.0:User", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/scim_get_schema_resp" + }, + "401": { + "$ref": "#/components/responses/scim_unauthorized" + }, + "404": { + "$ref": "#/components/responses/scim_not_found" + }, + "500": { + "$ref": "#/components/responses/scim_error" + } + }, + "security": [ + { + "scimToken": [] + } + ], + "summary": "Get a schema", + "tags": [ + "scim" + ] + }, + "references": [ + { + "ref": "#/components/responses/scim_error", + "url": null + }, + { + "ref": "#/components/responses/scim_get_schema_resp", + "url": null + }, + { + "ref": "#/components/responses/scim_not_found", + "url": null + }, + { + "ref": "#/components/responses/scim_unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "scimToken": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get a schema", + "tags": [ + "scim" + ], + "url": "/reference/api/hub/latest/operations/getV2Scim20SchemasById/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"attributes\": [],\n \"description\": \"User Account\",\n \"id\": \"urn:ietf:params:scim:schemas:core:2.0:User\",\n \"name\": \"User\",\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:Schema\"\n ]\n}", + "value": { + "attributes": [], + "description": "User Account", + "id": "urn:ietf:params:scim:schemas:core:2.0:User", + "name": "User", + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:Schema" + ] + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas~1{id}/get/responses/200/content/application~1scim+json", + "required": null, + "schema": { + "$ref": "#/components/schemas/scim_schema" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"401\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "401" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas~1{id}/get/responses/401/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "401" + } + } + } + ] + }, + "status": "401" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"404\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "404" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas~1{id}/get/responses/404/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "404" + } + } + } + ] + }, + "status": "404" + }, + { + "description": "Internal Error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"500\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "500" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Schemas~1{id}/get/responses/500/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "500" + } + } + } + ] + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/scim+json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${SCIM_TOKEN}\" \\\n --header 'Accept: application/scim+json' \\\n 'https://hub.docker.com/v2/scim/2.0/ServiceProviderConfig'", + "curlNotes": [], + "deprecated": null, + "description": "Returns a service provider config for Docker's configuration.\n", + "id": "getV2Scim20ServiceProviderConfig", + "line": 2275, + "method": "GET", + "parameters": [], + "path": "/v2/scim/2.0/ServiceProviderConfig", + "pointer": "/paths/~1v2~1scim~12.0~1ServiceProviderConfig/get", + "raw": { + "description": "Returns a service provider config for Docker's configuration.\n", + "operationId": "getV2Scim20ServiceProviderConfig", + "responses": { + "200": { + "$ref": "#/components/responses/scim_get_service_provider_config_resp" + }, + "401": { + "$ref": "#/components/responses/scim_unauthorized" + }, + "500": { + "$ref": "#/components/responses/scim_error" + } + }, + "security": [ + { + "scimToken": [] + } + ], + "summary": "Get service provider config", + "tags": [ + "scim" + ] + }, + "references": [ + { + "ref": "#/components/responses/scim_error", + "url": null + }, + { + "ref": "#/components/responses/scim_get_service_provider_config_resp", + "url": null + }, + { + "ref": "#/components/responses/scim_unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "scimToken": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get service provider config", + "tags": [ + "scim" + ], + "url": "/reference/api/hub/latest/operations/getV2Scim20ServiceProviderConfig/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"authenticationSchemes\": [\n {\n \"name\": \"OAuth 2.0 Bearer Token\",\n \"specUri\": \"http://tools.ietf.org/html/rfc6750\",\n \"type\": \"oauthbearertoken\"\n }\n ],\n \"bulk\": {\n \"maxOperations\": 0,\n \"maxPayloadSize\": 0,\n \"supported\": false\n },\n \"changePassword\": {\n \"supported\": false\n },\n \"etag\": {\n \"supported\": false\n },\n \"filter\": {\n \"maxResults\": 200,\n \"supported\": true\n },\n \"patch\": {\n \"supported\": true\n },\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig\"\n ],\n \"sort\": {\n \"supported\": true\n }\n}", + "value": { + "authenticationSchemes": [ + { + "name": "OAuth 2.0 Bearer Token", + "specUri": "http://tools.ietf.org/html/rfc6750", + "type": "oauthbearertoken" + } + ], + "bulk": { + "maxOperations": 0, + "maxPayloadSize": 0, + "supported": false + }, + "changePassword": { + "supported": false + }, + "etag": { + "supported": false + }, + "filter": { + "maxResults": 200, + "supported": true + }, + "patch": { + "supported": true + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig" + ], + "sort": { + "supported": true + } + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ServiceProviderConfig/get/responses/200/content/application~1scim+json", + "required": null, + "schema": { + "$ref": "#/components/schemas/scim_service_provider_config" + }, + "status": "200" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"401\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "401" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ServiceProviderConfig/get/responses/401/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "401" + } + } + } + ] + }, + "status": "401" + }, + { + "description": "Internal Error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"500\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "500" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1ServiceProviderConfig/get/responses/500/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "500" + } + } + } + ] + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/scim+json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${SCIM_TOKEN}\" \\\n --header 'Accept: application/scim+json' \\\n 'https://hub.docker.com/v2/scim/2.0/Users?startIndex=1\u0026count=10\u0026filter=userName+eq+%22jon.snow%40docker.com%22\u0026attributes=userName%2CdisplayName\u0026sortBy=userName'", + "curlNotes": [], + "deprecated": null, + "description": "Returns paginated users for an organization. Use `startIndex` and `count` query parameters to receive paginated results.\n\n**Sorting:**\n\nSorting allows you to specify the order in which resources are returned by specifying a combination of `sortBy` and `sortOrder` query parameters.\n\nThe `sortBy` parameter specifies the attribute whose value will be used to order the returned responses. The `sortOrder` parameter defines the order in which the `sortBy` parameter is applied. Allowed values are \"ascending\" and \"descending\".\n\n**Filtering:**\n\nYou can request a subset of resources by specifying the `filter` query parameter containing a filter expression. Attribute names and attribute operators used in filters are case insensitive. The filter parameter must contain at least one valid expression. Each expression must contain an attribute name followed by an attribute operator and an optional value.\n\nSupported operators are listed below.\n\n- `eq` equal\n- `ne` not equal\n- `co` contains\n- `sw` starts with\n- `and` Logical \"and\"\n- `or` Logical \"or\"\n- `not` \"Not\" function\n- `()` Precedence grouping\n", + "id": "getV2Scim20Users", + "line": 2385, + "method": "GET", + "parameters": [ + { + "description": "One-based index of the first result to return.", + "example": 1, + "in": "query", + "name": "startIndex", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/parameters/0", + "schema": { + "minimum": 1, + "type": "integer" + } + }, + { + "description": "Maximum number of results to return.", + "example": 10, + "in": "query", + "name": "count", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/parameters/1", + "schema": { + "maximum": 200, + "minimum": 1, + "type": "integer" + } + }, + { + "description": "SCIM filter expression used to select users.", + "example": "userName eq \"jon.snow@docker.com\"", + "in": "query", + "name": "filter", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/parameters/2", + "schema": { + "type": "string" + } + }, + { + "description": "Comma delimited list of attributes to limit to in the response.", + "example": "userName,displayName", + "in": "query", + "name": "attributes", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/parameters/3", + "schema": { + "type": "string" + } + }, + { + "description": "Sort direction applied to the attribute specified by sortBy.", + "in": "query", + "name": "sortOrder", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/parameters/4", + "schema": { + "enum": [ + "ascending", + "descending" + ], + "type": "string" + } + }, + { + "description": "User attribute to sort by.", + "example": "userName", + "in": "query", + "name": "sortBy", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/parameters/5", + "schema": { + "type": "string" + } + } + ], + "path": "/v2/scim/2.0/Users", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get", + "raw": { + "description": "Returns paginated users for an organization. Use `startIndex` and `count` query parameters to receive paginated results.\n\n**Sorting:**\n\nSorting allows you to specify the order in which resources are returned by specifying a combination of `sortBy` and `sortOrder` query parameters.\n\nThe `sortBy` parameter specifies the attribute whose value will be used to order the returned responses. The `sortOrder` parameter defines the order in which the `sortBy` parameter is applied. Allowed values are \"ascending\" and \"descending\".\n\n**Filtering:**\n\nYou can request a subset of resources by specifying the `filter` query parameter containing a filter expression. Attribute names and attribute operators used in filters are case insensitive. The filter parameter must contain at least one valid expression. Each expression must contain an attribute name followed by an attribute operator and an optional value.\n\nSupported operators are listed below.\n\n- `eq` equal\n- `ne` not equal\n- `co` contains\n- `sw` starts with\n- `and` Logical \"and\"\n- `or` Logical \"or\"\n- `not` \"Not\" function\n- `()` Precedence grouping\n", + "operationId": "getV2Scim20Users", + "parameters": [ + { + "description": "One-based index of the first result to return.", + "example": 1, + "in": "query", + "name": "startIndex", + "schema": { + "minimum": 1, + "type": "integer" + } + }, + { + "description": "Maximum number of results to return.", + "example": 10, + "in": "query", + "name": "count", + "schema": { + "maximum": 200, + "minimum": 1, + "type": "integer" + } + }, + { + "description": "SCIM filter expression used to select users.", + "example": "userName eq \"jon.snow@docker.com\"", + "in": "query", + "name": "filter", + "schema": { + "type": "string" + } + }, + { + "$ref": "#/components/parameters/scim_attributes" + }, + { + "description": "Sort direction applied to the attribute specified by sortBy.", + "in": "query", + "name": "sortOrder", + "schema": { + "enum": [ + "ascending", + "descending" + ], + "type": "string" + } + }, + { + "description": "User attribute to sort by.", + "example": "userName", + "in": "query", + "name": "sortBy", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/scim_get_users_resp" + }, + "400": { + "$ref": "#/components/responses/scim_bad_request" + }, + "401": { + "$ref": "#/components/responses/scim_unauthorized" + }, + "403": { + "$ref": "#/components/responses/scim_forbidden" + }, + "404": { + "$ref": "#/components/responses/scim_not_found" + }, + "500": { + "$ref": "#/components/responses/scim_error" + } + }, + "security": [ + { + "scimToken": [] + } + ], + "summary": "List users", + "tags": [ + "scim" + ] + }, + "references": [ + { + "ref": "#/components/parameters/scim_attributes", + "url": null + }, + { + "ref": "#/components/responses/scim_bad_request", + "url": null + }, + { + "ref": "#/components/responses/scim_error", + "url": null + }, + { + "ref": "#/components/responses/scim_forbidden", + "url": null + }, + { + "ref": "#/components/responses/scim_get_users_resp", + "url": null + }, + { + "ref": "#/components/responses/scim_not_found", + "url": null + }, + { + "ref": "#/components/responses/scim_unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "scimToken": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "List users", + "tags": [ + "scim" + ], + "url": "/reference/api/hub/latest/operations/getV2Scim20Users/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"Resources\": [\n {\n \"active\": true,\n \"displayName\": \"jonsnow\",\n \"emails\": [\n {\n \"display\": \"jon.snow@docker.com\",\n \"primary\": true,\n \"value\": \"jon.snow@docker.com\"\n }\n ],\n \"groups\": [\n {\n \"display\": \"nightswatch\",\n \"value\": \"nightswatch\"\n }\n ],\n \"id\": \"d80f7c79-7730-49d8-9a41-7c42fb622d9c\",\n \"meta\": {\n \"created\": \"2022-05-20T00:54:18Z\",\n \"lastModified\": \"2022-05-20T00:54:18Z\",\n \"location\": \"https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c\",\n \"resourceType\": \"User\"\n },\n \"name\": {\n \"familyName\": \"Snow\",\n \"givenName\": \"Jon\"\n },\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"userName\": \"jon.snow@docker.com\"\n }\n ],\n \"itemsPerPage\": 1,\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:ListResponse\"\n ],\n \"startIndex\": 1,\n \"totalResults\": 1\n}", + "value": { + "Resources": [ + { + "active": true, + "displayName": "jonsnow", + "emails": [ + { + "display": "jon.snow@docker.com", + "primary": true, + "value": "jon.snow@docker.com" + } + ], + "groups": [ + { + "display": "nightswatch", + "value": "nightswatch" + } + ], + "id": "d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "meta": { + "created": "2022-05-20T00:54:18Z", + "lastModified": "2022-05-20T00:54:18Z", + "location": "https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "resourceType": "User" + }, + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + ], + "itemsPerPage": 1, + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:ListResponse" + ], + "startIndex": 1, + "totalResults": 1 + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/responses/200/content/application~1scim+json", + "required": null, + "schema": { + "examples": [ + { + "Resources": [ + { + "active": true, + "displayName": "jonsnow", + "emails": [ + { + "display": "jon.snow@docker.com", + "primary": true, + "value": "jon.snow@docker.com" + } + ], + "groups": [ + { + "display": "nightswatch", + "value": "nightswatch" + } + ], + "id": "d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "meta": { + "created": "2022-05-20T00:54:18Z", + "lastModified": "2022-05-20T00:54:18Z", + "location": "https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "resourceType": "User" + }, + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + ], + "itemsPerPage": 1, + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:ListResponse" + ], + "startIndex": 1, + "totalResults": 1 + } + ], + "properties": { + "Resources": { + "items": { + "$ref": "#/components/schemas/scim_user" + }, + "type": "array" + }, + "itemsPerPage": { + "example": 10, + "type": "integer" + }, + "schemas": { + "example": [ + "urn:ietf:params:scim:api:messages:2.0:ListResponse" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "startIndex": { + "example": 1, + "type": "integer" + }, + "totalResults": { + "example": 1, + "type": "integer" + } + }, + "type": "object" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"400\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "400" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/responses/400/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "scimType": { + "description": "Some types of errors will return this per the specification.", + "type": "string" + }, + "status": { + "example": "400" + } + } + } + ] + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"401\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "401" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/responses/401/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "401" + } + } + } + ] + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"403\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "403" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/responses/403/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "403" + } + } + } + ] + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"404\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "404" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/responses/404/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "404" + } + } + } + ] + }, + "status": "404" + }, + { + "description": "Internal Error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"500\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "500" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/get/responses/500/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "500" + } + } + } + ] + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/scim+json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${SCIM_TOKEN}\" \\\n --header 'Accept: application/scim+json' \\\n --header 'Content-Type: application/scim+json' \\\n --data-raw '{\n \"name\": {\n \"familyName\": \"Snow\",\n \"givenName\": \"Jon\"\n },\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"userName\": \"jon.snow@docker.com\"\n}' \\\n 'https://hub.docker.com/v2/scim/2.0/Users'", + "curlNotes": [], + "deprecated": null, + "description": "Creates a user. If the user already exists by email, they are assigned to the organization on the \"company\" team.\n", + "id": "postV2Scim20Users", + "line": 2465, + "method": "POST", + "parameters": [], + "path": "/v2/scim/2.0/Users", + "pointer": "/paths/~1v2~1scim~12.0~1Users/post", + "raw": { + "description": "Creates a user. If the user already exists by email, they are assigned to the organization on the \"company\" team.\n", + "operationId": "postV2Scim20Users", + "requestBody": { + "$ref": "#/components/requestBodies/scim_create_user_request" + }, + "responses": { + "201": { + "$ref": "#/components/responses/scim_create_user_resp" + }, + "400": { + "$ref": "#/components/responses/scim_bad_request" + }, + "401": { + "$ref": "#/components/responses/scim_unauthorized" + }, + "403": { + "$ref": "#/components/responses/scim_forbidden" + }, + "404": { + "$ref": "#/components/responses/scim_not_found" + }, + "409": { + "$ref": "#/components/responses/scim_conflict" + }, + "500": { + "$ref": "#/components/responses/scim_error" + } + }, + "security": [ + { + "scimToken": [] + } + ], + "summary": "Create user", + "tags": [ + "scim" + ] + }, + "references": [ + { + "ref": "#/components/requestBodies/scim_create_user_request", + "url": null + }, + { + "ref": "#/components/responses/scim_bad_request", + "url": null + }, + { + "ref": "#/components/responses/scim_conflict", + "url": null + }, + { + "ref": "#/components/responses/scim_create_user_resp", + "url": null + }, + { + "ref": "#/components/responses/scim_error", + "url": null + }, + { + "ref": "#/components/responses/scim_forbidden", + "url": null + }, + { + "ref": "#/components/responses/scim_not_found", + "url": null + }, + { + "ref": "#/components/responses/scim_unauthorized", + "url": null + } + ], + "requestSchema": { + "examples": [ + { + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + ], + "properties": { + "name": { + "$ref": "#/components/schemas/scim_user_name" + }, + "schemas": { + "$ref": "#/components/schemas/scim_user_schemas" + }, + "userName": { + "$ref": "#/components/schemas/scim_user_username" + } + }, + "required": [ + "schemas", + "userName" + ], + "type": "object" + }, + "security": [ + { + "scimToken": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Create user", + "tags": [ + "scim" + ], + "url": "/reference/api/hub/latest/operations/postV2Scim20Users/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"name\": {\n \"familyName\": \"Snow\",\n \"givenName\": \"Jon\"\n },\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"userName\": \"jon.snow@docker.com\"\n}", + "value": { + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/post/requestBody/content/application~1scim+json", + "required": true, + "schema": { + "examples": [ + { + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + ], + "properties": { + "name": { + "$ref": "#/components/schemas/scim_user_name" + }, + "schemas": { + "$ref": "#/components/schemas/scim_user_schemas" + }, + "userName": { + "$ref": "#/components/schemas/scim_user_username" + } + }, + "required": [ + "schemas", + "userName" + ], + "type": "object" + }, + "status": "" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"active\": true,\n \"displayName\": \"jonsnow\",\n \"emails\": [\n {\n \"display\": \"jon.snow@docker.com\",\n \"primary\": true,\n \"value\": \"jon.snow@docker.com\"\n }\n ],\n \"groups\": [\n {\n \"display\": \"nightswatch\",\n \"value\": \"nightswatch\"\n }\n ],\n \"id\": \"d80f7c79-7730-49d8-9a41-7c42fb622d9c\",\n \"meta\": {\n \"created\": \"2022-05-20T00:54:18Z\",\n \"lastModified\": \"2022-05-20T00:54:18Z\",\n \"location\": \"https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c\",\n \"resourceType\": \"User\"\n },\n \"name\": {\n \"familyName\": \"Snow\",\n \"givenName\": \"Jon\"\n },\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"userName\": \"jon.snow@docker.com\"\n}", + "value": { + "active": true, + "displayName": "jonsnow", + "emails": [ + { + "display": "jon.snow@docker.com", + "primary": true, + "value": "jon.snow@docker.com" + } + ], + "groups": [ + { + "display": "nightswatch", + "value": "nightswatch" + } + ], + "id": "d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "meta": { + "created": "2022-05-20T00:54:18Z", + "lastModified": "2022-05-20T00:54:18Z", + "location": "https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "resourceType": "User" + }, + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/post/responses/201/content/application~1scim+json", + "required": null, + "schema": { + "$ref": "#/components/schemas/scim_user" + }, + "status": "201" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"400\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "400" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/post/responses/400/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "scimType": { + "description": "Some types of errors will return this per the specification.", + "type": "string" + }, + "status": { + "example": "400" + } + } + } + ] + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"401\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "401" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/post/responses/401/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "401" + } + } + } + ] + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"403\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "403" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/post/responses/403/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "403" + } + } + } + ] + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"404\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "404" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/post/responses/404/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "404" + } + } + } + ] + }, + "status": "404" + }, + { + "description": "Conflict", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"409\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "409" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/post/responses/409/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "409" + } + } + } + ] + }, + "status": "409" + }, + { + "description": "Internal Error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"500\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "500" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users/post/responses/500/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "500" + } + } + } + ] + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/scim+json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${SCIM_TOKEN}\" \\\n --header 'Accept: application/scim+json' \\\n 'https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c'", + "curlNotes": [], + "deprecated": null, + "description": "Returns a user by ID.\n", + "id": "getV2Scim20UsersById", + "line": 2495, + "method": "GET", + "parameters": [ + { + "description": "The user ID.", + "example": "d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "in": "path", + "name": "id", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/scim/2.0/Users/{id}", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/get", + "raw": { + "description": "Returns a user by ID.\n", + "operationId": "getV2Scim20UsersById", + "responses": { + "200": { + "$ref": "#/components/responses/scim_get_user_resp" + }, + "400": { + "$ref": "#/components/responses/scim_bad_request" + }, + "401": { + "$ref": "#/components/responses/scim_unauthorized" + }, + "403": { + "$ref": "#/components/responses/scim_forbidden" + }, + "404": { + "$ref": "#/components/responses/scim_not_found" + }, + "500": { + "$ref": "#/components/responses/scim_error" + } + }, + "security": [ + { + "scimToken": [] + } + ], + "summary": "Get a user", + "tags": [ + "scim" + ] + }, + "references": [ + { + "ref": "#/components/responses/scim_bad_request", + "url": null + }, + { + "ref": "#/components/responses/scim_error", + "url": null + }, + { + "ref": "#/components/responses/scim_forbidden", + "url": null + }, + { + "ref": "#/components/responses/scim_get_user_resp", + "url": null + }, + { + "ref": "#/components/responses/scim_not_found", + "url": null + }, + { + "ref": "#/components/responses/scim_unauthorized", + "url": null + } + ], + "requestSchema": null, + "security": [ + { + "scimToken": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Get a user", + "tags": [ + "scim" + ], + "url": "/reference/api/hub/latest/operations/getV2Scim20UsersById/", + "variants": [ + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"active\": true,\n \"displayName\": \"jonsnow\",\n \"emails\": [\n {\n \"display\": \"jon.snow@docker.com\",\n \"primary\": true,\n \"value\": \"jon.snow@docker.com\"\n }\n ],\n \"groups\": [\n {\n \"display\": \"nightswatch\",\n \"value\": \"nightswatch\"\n }\n ],\n \"id\": \"d80f7c79-7730-49d8-9a41-7c42fb622d9c\",\n \"meta\": {\n \"created\": \"2022-05-20T00:54:18Z\",\n \"lastModified\": \"2022-05-20T00:54:18Z\",\n \"location\": \"https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c\",\n \"resourceType\": \"User\"\n },\n \"name\": {\n \"familyName\": \"Snow\",\n \"givenName\": \"Jon\"\n },\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"userName\": \"jon.snow@docker.com\"\n}", + "value": { + "active": true, + "displayName": "jonsnow", + "emails": [ + { + "display": "jon.snow@docker.com", + "primary": true, + "value": "jon.snow@docker.com" + } + ], + "groups": [ + { + "display": "nightswatch", + "value": "nightswatch" + } + ], + "id": "d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "meta": { + "created": "2022-05-20T00:54:18Z", + "lastModified": "2022-05-20T00:54:18Z", + "location": "https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "resourceType": "User" + }, + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/get/responses/200/content/application~1scim+json", + "required": null, + "schema": { + "$ref": "#/components/schemas/scim_user" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"400\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "400" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/get/responses/400/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "scimType": { + "description": "Some types of errors will return this per the specification.", + "type": "string" + }, + "status": { + "example": "400" + } + } + } + ] + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"401\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "401" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/get/responses/401/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "401" + } + } + } + ] + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"403\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "403" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/get/responses/403/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "403" + } + } + } + ] + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"404\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "404" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/get/responses/404/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "404" + } + } + } + ] + }, + "status": "404" + }, + { + "description": "Internal Error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"500\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "500" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/get/responses/500/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "500" + } + } + } + ] + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/scim+json", + "curl": "curl \\\n --request PUT \\\n --header \"Authorization: Bearer ${SCIM_TOKEN}\" \\\n --header 'Accept: application/scim+json' \\\n --header 'Content-Type: application/scim+json' \\\n --data-raw '{\n \"active\": true,\n \"name\": {\n \"familyName\": \"Snow\",\n \"givenName\": \"Jon\"\n },\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"userName\": \"jon.snow@docker.com\"\n}' \\\n 'https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c'", + "curlNotes": [], + "deprecated": null, + "description": "Updates a user. This route is used to change the user's name, activate, and deactivate the user.\n", + "id": "putV2Scim20UsersById", + "line": 2517, + "method": "PUT", + "parameters": [ + { + "description": "The user ID.", + "example": "d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "in": "path", + "name": "id", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/scim/2.0/Users/{id}", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/put", + "raw": { + "description": "Updates a user. This route is used to change the user's name, activate, and deactivate the user.\n", + "operationId": "putV2Scim20UsersById", + "requestBody": { + "$ref": "#/components/requestBodies/scim_update_user_request" + }, + "responses": { + "200": { + "$ref": "#/components/responses/scim_update_user_resp" + }, + "400": { + "$ref": "#/components/responses/scim_bad_request" + }, + "401": { + "$ref": "#/components/responses/scim_unauthorized" + }, + "403": { + "$ref": "#/components/responses/scim_forbidden" + }, + "404": { + "$ref": "#/components/responses/scim_not_found" + }, + "409": { + "$ref": "#/components/responses/scim_conflict" + }, + "500": { + "$ref": "#/components/responses/scim_error" + } + }, + "security": [ + { + "scimToken": [] + } + ], + "summary": "Update a user", + "tags": [ + "scim" + ] + }, + "references": [ + { + "ref": "#/components/requestBodies/scim_update_user_request", + "url": null + }, + { + "ref": "#/components/responses/scim_bad_request", + "url": null + }, + { + "ref": "#/components/responses/scim_conflict", + "url": null + }, + { + "ref": "#/components/responses/scim_error", + "url": null + }, + { + "ref": "#/components/responses/scim_forbidden", + "url": null + }, + { + "ref": "#/components/responses/scim_not_found", + "url": null + }, + { + "ref": "#/components/responses/scim_unauthorized", + "url": null + }, + { + "ref": "#/components/responses/scim_update_user_resp", + "url": null + } + ], + "requestSchema": { + "examples": [ + { + "active": true, + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + ], + "properties": { + "active": { + "default": false, + "description": "Whether the user is active. Defaults to false when omitted.", + "type": "boolean" + }, + "name": { + "$ref": "#/components/schemas/scim_user_name" + }, + "schemas": { + "$ref": "#/components/schemas/scim_user_schemas" + }, + "userName": { + "$ref": "#/components/schemas/scim_user_username" + } + }, + "required": [ + "schemas", + "userName" + ], + "type": "object" + }, + "security": [ + { + "scimToken": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Update a user", + "tags": [ + "scim" + ], + "url": "/reference/api/hub/latest/operations/putV2Scim20UsersById/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"active\": true,\n \"name\": {\n \"familyName\": \"Snow\",\n \"givenName\": \"Jon\"\n },\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"userName\": \"jon.snow@docker.com\"\n}", + "value": { + "active": true, + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/put/requestBody/content/application~1scim+json", + "required": true, + "schema": { + "examples": [ + { + "active": true, + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + ], + "properties": { + "active": { + "default": false, + "description": "Whether the user is active. Defaults to false when omitted.", + "type": "boolean" + }, + "name": { + "$ref": "#/components/schemas/scim_user_name" + }, + "schemas": { + "$ref": "#/components/schemas/scim_user_schemas" + }, + "userName": { + "$ref": "#/components/schemas/scim_user_username" + } + }, + "required": [ + "schemas", + "userName" + ], + "type": "object" + }, + "status": "" + }, + { + "description": "", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"active\": true,\n \"displayName\": \"jonsnow\",\n \"emails\": [\n {\n \"display\": \"jon.snow@docker.com\",\n \"primary\": true,\n \"value\": \"jon.snow@docker.com\"\n }\n ],\n \"groups\": [\n {\n \"display\": \"nightswatch\",\n \"value\": \"nightswatch\"\n }\n ],\n \"id\": \"d80f7c79-7730-49d8-9a41-7c42fb622d9c\",\n \"meta\": {\n \"created\": \"2022-05-20T00:54:18Z\",\n \"lastModified\": \"2022-05-20T00:54:18Z\",\n \"location\": \"https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c\",\n \"resourceType\": \"User\"\n },\n \"name\": {\n \"familyName\": \"Snow\",\n \"givenName\": \"Jon\"\n },\n \"schemas\": [\n \"urn:ietf:params:scim:schemas:core:2.0:User\"\n ],\n \"userName\": \"jon.snow@docker.com\"\n}", + "value": { + "active": true, + "displayName": "jonsnow", + "emails": [ + { + "display": "jon.snow@docker.com", + "primary": true, + "value": "jon.snow@docker.com" + } + ], + "groups": [ + { + "display": "nightswatch", + "value": "nightswatch" + } + ], + "id": "d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "meta": { + "created": "2022-05-20T00:54:18Z", + "lastModified": "2022-05-20T00:54:18Z", + "location": "https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "resourceType": "User" + }, + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/put/responses/200/content/application~1scim+json", + "required": null, + "schema": { + "$ref": "#/components/schemas/scim_user" + }, + "status": "200" + }, + { + "description": "Bad Request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"400\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "400" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/put/responses/400/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "scimType": { + "description": "Some types of errors will return this per the specification.", + "type": "string" + }, + "status": { + "example": "400" + } + } + } + ] + }, + "status": "400" + }, + { + "description": "Unauthorized", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"401\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "401" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/put/responses/401/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "401" + } + } + } + ] + }, + "status": "401" + }, + { + "description": "Forbidden", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"403\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "403" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/put/responses/403/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "403" + } + } + } + ] + }, + "status": "403" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"404\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "404" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/put/responses/404/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "404" + } + } + } + ] + }, + "status": "404" + }, + { + "description": "Conflict", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"409\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "409" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/put/responses/409/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "409" + } + } + } + ] + }, + "status": "409" + }, + { + "description": "Internal Error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "error", + "text": "{\n \"schemas\": [\n \"urn:ietf:params:scim:api:messages:2.0:Error\"\n ],\n \"status\": \"500\"\n}", + "value": { + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:Error" + ], + "status": "500" + } + } + ], + "headers": null, + "media": "application/scim+json", + "pointer": "/paths/~1v2~1scim~12.0~1Users~1{id}/put/responses/500/content/application~1scim+json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_error" + }, + { + "properties": { + "status": { + "example": "500" + } + } + } + ] + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"code\": \"123456\",\n \"login_2fa_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n}' \\\n 'https://hub.docker.com/v2/users/2fa-login'", + "curlNotes": [], + "deprecated": null, + "description": "When a user has two-factor authentication (2FA) enabled, this is the second call to perform after `/v2/users/login` call.\n\nCreates and returns a bearer token in JWT format that you can use to authenticate with Docker Hub APIs.\n\nThe returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.\n\nMost Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.\n", + "id": "PostUsers2FALogin", + "line": 216, + "method": "POST", + "parameters": [], + "path": "/v2/users/2fa-login", + "pointer": "/paths/~1v2~1users~12fa-login/post", + "raw": { + "description": "When a user has two-factor authentication (2FA) enabled, this is the second call to perform after `/v2/users/login` call.\n\nCreates and returns a bearer token in JWT format that you can use to authenticate with Docker Hub APIs.\n\nThe returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.\n\nMost Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.\n", + "operationId": "PostUsers2FALogin", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Users2FALoginRequest" + } + } + }, + "description": "Login details.", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsersLoginSuccessResponse" + } + } + }, + "description": "Authentication successful" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsers2FALoginErrorResponse" + } + } + }, + "description": "Authentication failed" + } + }, + "security": [], + "summary": "Second factor authentication", + "tags": [ + "authentication-api" + ] + }, + "references": [ + { + "ref": "#/components/schemas/PostUsers2FALoginErrorResponse", + "url": "/reference/api/hub/latest/schemas/PostUsers2FALoginErrorResponse/" + }, + { + "ref": "#/components/schemas/PostUsersLoginSuccessResponse", + "url": "/reference/api/hub/latest/schemas/PostUsersLoginSuccessResponse/" + }, + { + "ref": "#/components/schemas/Users2FALoginRequest", + "url": "/reference/api/hub/latest/schemas/Users2FALoginRequest/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/Users2FALoginRequest" + }, + "security": [], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Second factor authentication", + "tags": [ + "authentication-api" + ], + "url": "/reference/api/hub/latest/operations/PostUsers2FALogin/", + "variants": [ + { + "description": "Login details.", + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"123456\",\n \"login_2fa_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n}", + "value": { + "code": "123456", + "login_2fa_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~12fa-login/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/Users2FALoginRequest" + }, + "status": "" + }, + { + "description": "Authentication successful", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n}", + "value": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~12fa-login/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PostUsersLoginSuccessResponse" + }, + "status": "200" + }, + { + "description": "Authentication failed", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"detail\": \"Incorrect authentication credentials\"\n}", + "value": { + "detail": "Incorrect authentication credentials" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~12fa-login/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PostUsers2FALoginErrorResponse" + }, + "status": "401" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"password\": \"p@ssw0rd\",\n \"username\": \"myusername\"\n}' \\\n 'https://hub.docker.com/v2/users/login'", + "curlNotes": [], + "deprecated": true, + "description": "Creates and returns a bearer token in JWT format that you can use to authenticate with Docker Hub APIs.\n\nThe returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.\n\n_**As of September 16, 2024, this route requires a personal access token (PAT) instead of a password if your organization has SSO enforced.**_\n\n\n Deprecated: Use [Create access token](#tag/authentication-api/operation/AuthCreateAccessToken) instead.\n\n", + "id": "PostUsersLogin", + "line": 178, + "method": "POST", + "parameters": [], + "path": "/v2/users/login", + "pointer": "/paths/~1v2~1users~1login/post", + "raw": { + "deprecated": true, + "description": "Creates and returns a bearer token in JWT format that you can use to authenticate with Docker Hub APIs.\n\nThe returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.\n\n_**As of September 16, 2024, this route requires a personal access token (PAT) instead of a password if your organization has SSO enforced.**_\n\n\n Deprecated: Use [Create access token](#tag/authentication-api/operation/AuthCreateAccessToken) instead.\n\n", + "operationId": "PostUsersLogin", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UsersLoginRequest" + } + } + }, + "description": "Login details.", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsersLoginSuccessResponse" + } + } + }, + "description": "Authentication successful" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsersLoginErrorResponse" + } + } + }, + "description": "Authentication failed or second factor required" + } + }, + "security": [], + "summary": "Create an authentication token", + "tags": [ + "authentication-api" + ] + }, + "references": [ + { + "ref": "#/components/schemas/PostUsersLoginErrorResponse", + "url": "/reference/api/hub/latest/schemas/PostUsersLoginErrorResponse/" + }, + { + "ref": "#/components/schemas/PostUsersLoginSuccessResponse", + "url": "/reference/api/hub/latest/schemas/PostUsersLoginSuccessResponse/" + }, + { + "ref": "#/components/schemas/UsersLoginRequest", + "url": "/reference/api/hub/latest/schemas/UsersLoginRequest/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/UsersLoginRequest" + }, + "security": [], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "summary": "Create an authentication token", + "tags": [ + "authentication-api" + ], + "url": "/reference/api/hub/latest/operations/PostUsersLogin/", + "variants": [ + { + "description": "Login details.", + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"password\": \"p@ssw0rd\",\n \"username\": \"myusername\"\n}", + "value": { + "password": "p@ssw0rd", + "username": "myusername" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~1login/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/UsersLoginRequest" + }, + "status": "" + }, + { + "description": "Authentication successful", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n}", + "value": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~1login/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PostUsersLoginSuccessResponse" + }, + "status": "200" + }, + { + "description": "Authentication failed or second factor required", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"detail\": \"Incorrect authentication credentials\"\n}", + "value": { + "detail": "Incorrect authentication credentials" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~1login/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PostUsersLoginErrorResponse" + }, + "status": "401" + } + ] + } + ], + "owner": "docker/docs", + "product": "hub", + "schemaCount": 209, + "schemaURLs": { + "#/components/schemas/AuditLog": "/reference/api/hub/latest/schemas/AuditLog/", + "#/components/schemas/AuditLogAction": "/reference/api/hub/latest/schemas/AuditLogAction/", + "#/components/schemas/AuditLogActions": "/reference/api/hub/latest/schemas/AuditLogActions/", + "#/components/schemas/AuthCreateTokenResponse": "/reference/api/hub/latest/schemas/AuthCreateTokenResponse/", + "#/components/schemas/GetAuditActionsResponse": "/reference/api/hub/latest/schemas/GetAuditActionsResponse/", + "#/components/schemas/GetAuditLogsResponse": "/reference/api/hub/latest/schemas/GetAuditLogsResponse/", + "#/components/schemas/PostUsers2FALoginErrorResponse": "/reference/api/hub/latest/schemas/PostUsers2FALoginErrorResponse/", + "#/components/schemas/PostUsersLoginErrorResponse": "/reference/api/hub/latest/schemas/PostUsersLoginErrorResponse/", + "#/components/schemas/PostUsersLoginSuccessResponse": "/reference/api/hub/latest/schemas/PostUsersLoginSuccessResponse/", + "#/components/schemas/RepositoryGroup": "/reference/api/hub/latest/schemas/RepositoryGroup/", + "#/components/schemas/RepositoryGroupCreationRequest": "/reference/api/hub/latest/schemas/RepositoryGroupCreationRequest/", + "#/components/schemas/Users2FALoginRequest": "/reference/api/hub/latest/schemas/Users2FALoginRequest/", + "#/components/schemas/UsersLoginRequest": "/reference/api/hub/latest/schemas/UsersLoginRequest/", + "#/components/schemas/accessToken": "/reference/api/hub/latest/schemas/accessToken/", + "#/components/schemas/bulk_invite": "/reference/api/hub/latest/schemas/bulk_invite/", + "#/components/schemas/category": "/reference/api/hub/latest/schemas/category/", + "#/components/schemas/createAccessTokenRequest": "/reference/api/hub/latest/schemas/createAccessTokenRequest/", + "#/components/schemas/createAccessTokensResponse": "/reference/api/hub/latest/schemas/createAccessTokensResponse/", + "#/components/schemas/createOrgAccessTokenRequest": "/reference/api/hub/latest/schemas/createOrgAccessTokenRequest/", + "#/components/schemas/createOrgAccessTokenResponse": "/reference/api/hub/latest/schemas/createOrgAccessTokenResponse/", + "#/components/schemas/email_address": "/reference/api/hub/latest/schemas/email_address/", + "#/components/schemas/email_with_username": "/reference/api/hub/latest/schemas/email_with_username/", + "#/components/schemas/error": "/reference/api/hub/latest/schemas/error/", + "#/components/schemas/getAccessTokensResponse": "/reference/api/hub/latest/schemas/getAccessTokensResponse/", + "#/components/schemas/getOrgAccessTokenResponse": "/reference/api/hub/latest/schemas/getOrgAccessTokenResponse/", + "#/components/schemas/getOrgAccessTokensResponse": "/reference/api/hub/latest/schemas/getOrgAccessTokensResponse/", + "#/components/schemas/group_member": "/reference/api/hub/latest/schemas/group_member/", + "#/components/schemas/image": "/reference/api/hub/latest/schemas/image/", + "#/components/schemas/immutable_tags_settings": "/reference/api/hub/latest/schemas/immutable_tags_settings/", + "#/components/schemas/immutable_tags_verify_request": "/reference/api/hub/latest/schemas/immutable_tags_verify_request/", + "#/components/schemas/immutable_tags_verify_response": "/reference/api/hub/latest/schemas/immutable_tags_verify_response/", + "#/components/schemas/invite": "/reference/api/hub/latest/schemas/invite/", + "#/components/schemas/layer": "/reference/api/hub/latest/schemas/layer/", + "#/components/schemas/legacy_email_address": "/reference/api/hub/latest/schemas/legacy_email_address/", + "#/components/schemas/list_repositories_response": "/reference/api/hub/latest/schemas/list_repositories_response/", + "#/components/schemas/orgAccessToken": "/reference/api/hub/latest/schemas/orgAccessToken/", + "#/components/schemas/orgAccessTokenResource": "/reference/api/hub/latest/schemas/orgAccessTokenResource/", + "#/components/schemas/orgSettings": "/reference/api/hub/latest/schemas/orgSettings/", + "#/components/schemas/org_group": "/reference/api/hub/latest/schemas/org_group/", + "#/components/schemas/org_member": "/reference/api/hub/latest/schemas/org_member/", + "#/components/schemas/org_member_paginated": "/reference/api/hub/latest/schemas/org_member_paginated/", + "#/components/schemas/page": "/reference/api/hub/latest/schemas/page/", + "#/components/schemas/paginated_tags": "/reference/api/hub/latest/schemas/paginated_tags/", + "#/components/schemas/patchAccessTokenRequest": "/reference/api/hub/latest/schemas/patchAccessTokenRequest/", + "#/components/schemas/patchAccessTokenResponse": "/reference/api/hub/latest/schemas/patchAccessTokenResponse/", + "#/components/schemas/repo_creation_request": "/reference/api/hub/latest/schemas/repo_creation_request/", + "#/components/schemas/repo_permissions": "/reference/api/hub/latest/schemas/repo_permissions/", + "#/components/schemas/repository_info": "/reference/api/hub/latest/schemas/repository_info/", + "#/components/schemas/repository_list_entry": "/reference/api/hub/latest/schemas/repository_list_entry/", + "#/components/schemas/restricted_images": "/reference/api/hub/latest/schemas/restricted_images/", + "#/components/schemas/scim_email": "/reference/api/hub/latest/schemas/scim_email/", + "#/components/schemas/scim_error": "/reference/api/hub/latest/schemas/scim_error/", + "#/components/schemas/scim_group": "/reference/api/hub/latest/schemas/scim_group/", + "#/components/schemas/scim_resource_type": "/reference/api/hub/latest/schemas/scim_resource_type/", + "#/components/schemas/scim_schema": "/reference/api/hub/latest/schemas/scim_schema/", + "#/components/schemas/scim_schema_attribute": "/reference/api/hub/latest/schemas/scim_schema_attribute/", + "#/components/schemas/scim_schema_parent_attribute": "/reference/api/hub/latest/schemas/scim_schema_parent_attribute/", + "#/components/schemas/scim_service_provider_config": "/reference/api/hub/latest/schemas/scim_service_provider_config/", + "#/components/schemas/scim_user": "/reference/api/hub/latest/schemas/scim_user/", + "#/components/schemas/scim_user_display_name": "/reference/api/hub/latest/schemas/scim_user_display_name/", + "#/components/schemas/scim_user_id": "/reference/api/hub/latest/schemas/scim_user_id/", + "#/components/schemas/scim_user_name": "/reference/api/hub/latest/schemas/scim_user_name/", + "#/components/schemas/scim_user_schemas": "/reference/api/hub/latest/schemas/scim_user_schemas/", + "#/components/schemas/scim_user_username": "/reference/api/hub/latest/schemas/scim_user_username/", + "#/components/schemas/tag": "/reference/api/hub/latest/schemas/tag/", + "#/components/schemas/updateOrgAccessTokenRequest": "/reference/api/hub/latest/schemas/updateOrgAccessTokenRequest/", + "#/components/schemas/updateOrgAccessTokenResponse": "/reference/api/hub/latest/schemas/updateOrgAccessTokenResponse/", + "#/components/schemas/update_repository_immutable_tags_request": "/reference/api/hub/latest/schemas/update_repository_immutable_tags_request/", + "#/components/schemas/user": "/reference/api/hub/latest/schemas/user/" + }, + "schemas": [ + { + "name": "AuditLog", + "pointer": "/components/schemas/AuditLog", + "schema": { + "description": "Audit log event.", + "properties": { + "account": { + "type": "string" + }, + "action": { + "type": "string" + }, + "action_description": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "data": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/AuditLog/" + }, + { + "name": "AuditLogAction", + "pointer": "/components/schemas/AuditLogAction", + "schema": { + "description": "Audit Log action", + "properties": { + "description": { + "description": "Description of audit log action.", + "type": "string" + }, + "label": { + "description": "Label for audit log action.", + "type": "string" + }, + "name": { + "description": "Name of audit log action.", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/AuditLogAction/" + }, + { + "name": "AuditLogActions", + "pointer": "/components/schemas/AuditLogActions", + "schema": { + "properties": { + "actions": { + "description": "List of audit log actions.", + "items": { + "$ref": "#/components/schemas/AuditLogAction" + }, + "type": "array" + }, + "label": { + "description": "Grouping label for a particular set of audit log actions.", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/AuditLogActions/" + }, + { + "name": "AuthCreateTokenResponse", + "pointer": "/components/schemas/AuthCreateTokenResponse", + "schema": { + "description": "successful access token response", + "examples": [ + { + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + ], + "properties": { + "access_token": { + "description": "The created access token. This expires in 10 minutes.", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/AuthCreateTokenResponse/" + }, + { + "name": "GetAuditActionsResponse", + "pointer": "/components/schemas/GetAuditActionsResponse", + "schema": { + "description": "GetAuditActions response.", + "properties": { + "actions": { + "additionalProperties": { + "$ref": "#/components/schemas/AuditLogActions" + }, + "description": "Map of audit log actions.", + "type": "object" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/GetAuditActionsResponse/" + }, + { + "name": "GetAuditLogsResponse", + "pointer": "/components/schemas/GetAuditLogsResponse", + "schema": { + "description": "GetAuditLogs response.", + "properties": { + "logs": { + "description": "List of audit log events.", + "items": { + "$ref": "#/components/schemas/AuditLog" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/GetAuditLogsResponse/" + }, + { + "name": "PostUsers2FALoginErrorResponse", + "pointer": "/components/schemas/PostUsers2FALoginErrorResponse", + "schema": { + "description": "failed second factor login response.", + "examples": [ + { + "detail": "Incorrect authentication credentials" + } + ], + "properties": { + "detail": { + "description": "Description of the error.", + "example": "Incorrect authentication credentials", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/PostUsers2FALoginErrorResponse/" + }, + { + "name": "PostUsersLoginErrorResponse", + "pointer": "/components/schemas/PostUsersLoginErrorResponse", + "schema": { + "description": "failed user login response or second factor required", + "examples": [ + { + "detail": "Incorrect authentication credentials" + } + ], + "properties": { + "detail": { + "description": "Description of the error.", + "example": "Incorrect authentication credentials", + "type": "string" + }, + "login_2fa_token": { + "description": "Short time lived token to be used on `/v2/users/2fa-login` to complete the authentication. This field is present only if 2FA is enabled.\n", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "detail" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/PostUsersLoginErrorResponse/" + }, + { + "name": "PostUsersLoginSuccessResponse", + "pointer": "/components/schemas/PostUsersLoginSuccessResponse", + "schema": { + "description": "successful user login response", + "examples": [ + { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + ], + "properties": { + "token": { + "description": "Created authentication token.\nThis token can be used in the HTTP Authorization header as a JWT to authenticate with the Docker Hub APIs.\n", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/PostUsersLoginSuccessResponse/" + }, + { + "name": "RepositoryGroup", + "pointer": "/components/schemas/RepositoryGroup", + "schema": { + "properties": { + "group_id": { + "description": "The ID of the group", + "example": 12345, + "format": "int64", + "type": "integer" + }, + "group_name": { + "description": "The name of the group", + "example": "developers", + "type": "string" + }, + "permission": { + "description": "The permission level granted to the group", + "enum": [ + "read", + "write", + "admin" + ], + "example": "write", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/RepositoryGroup/" + }, + { + "name": "RepositoryGroupCreationRequest", + "pointer": "/components/schemas/RepositoryGroupCreationRequest", + "schema": { + "properties": { + "group_id": { + "description": "The ID of the organization group to grant access to", + "example": 12345, + "format": "int64", + "type": "integer" + }, + "permission": { + "description": "The permission level to grant to the group:\n- read: Can view and pull from the repository\n- write: Can view, pull, and push to the repository\n- admin: Can view, pull, push, and manage repository settings\n", + "enum": [ + "read", + "write", + "admin" + ], + "example": "write", + "type": "string" + } + }, + "required": [ + "group_id", + "permission" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/RepositoryGroupCreationRequest/" + }, + { + "name": "Users2FALoginRequest", + "pointer": "/components/schemas/Users2FALoginRequest", + "schema": { + "description": "Second factor user login details", + "examples": [ + { + "code": "123456", + "login_2fa_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + ], + "properties": { + "code": { + "description": "The Time-based One-Time Password of the Docker Hub account to authenticate with.\n", + "example": "123456", + "type": "string" + }, + "login_2fa_token": { + "description": "The intermediate 2FA token returned from `/v2/users/login` API.", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "type": "string" + } + }, + "required": [ + "login_2fa_token", + "code" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/Users2FALoginRequest/" + }, + { + "name": "UsersLoginRequest", + "pointer": "/components/schemas/UsersLoginRequest", + "schema": { + "description": "User login details", + "examples": [ + { + "password": "p@ssw0rd", + "username": "myusername" + } + ], + "properties": { + "password": { + "description": "The password or personal access token (PAT) of the Docker Hub account to authenticate with.\n", + "example": "p@ssw0rd", + "type": "string" + }, + "username": { + "description": "The username of the Docker Hub account to authenticate with.", + "example": "myusername", + "type": "string" + } + }, + "required": [ + "username", + "password" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/UsersLoginRequest/" + }, + { + "name": "accessToken", + "pointer": "/components/schemas/accessToken", + "schema": { + "properties": { + "client_id": { + "example": "HUB", + "type": "string" + }, + "created_at": { + "example": "2021-07-20T12:00:00.000000Z", + "type": "string" + }, + "creator_ip": { + "example": "127.0.0.1", + "type": "string" + }, + "creator_ua": { + "example": "some user agent", + "type": "string" + }, + "expires_at": { + "example": "2021-10-28T18:30:19.520861Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "generated_by": { + "example": "manual", + "type": "string" + }, + "is_active": { + "example": true, + "type": "boolean" + }, + "last_used": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "scopes": { + "example": [ + "repo:read" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "token": { + "description": "Token value returned on creation. Later responses redact the value as ***.", + "example": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "type": "string" + }, + "token_label": { + "example": "My read only token", + "type": "string" + }, + "uuid": { + "example": "b30bbf97-506c-4ecd-aabc-842f3cb484fb", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/accessToken/" + }, + { + "name": "bulk_invite", + "pointer": "/components/schemas/bulk_invite", + "schema": { + "example": { + "invitees": [ + { + "invite": { + "created_at": "2021-10-28T18:30:19.520861Z", + "id": "e36eca69-4cc8-4f17-9845-ae8c2b832691", + "invitee": "invitee@docker.com", + "inviter_username": "moby", + "org": "docker", + "team": "owners" + }, + "invitee": "invitee@docker.com", + "status": "invited" + }, + { + "invitee": "invitee2@docker.com", + "status": "existing_org_member" + }, + { + "invitee": "invitee3@docker.com", + "status": "invalid_email_or_docker_id" + } + ] + }, + "properties": { + "invitees": { + "description": "A list of invitees", + "items": { + "properties": { + "invite": { + "$ref": "#/components/schemas/invite", + "description": "Invite data if successfully invited" + }, + "invitee": { + "description": "invitee email or Docker ID", + "type": "string" + }, + "status": { + "description": "status of the invite or validation error", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/bulk_invite/" + }, + { + "name": "category", + "pointer": "/components/schemas/category", + "schema": { + "description": "Repository category for classification and discovery", + "properties": { + "name": { + "description": "Human-readable name of the category", + "example": "Databases", + "minLength": 1, + "type": "string" + }, + "slug": { + "description": "URL-friendly identifier for the category", + "example": "databases", + "minLength": 1, + "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$", + "type": "string" + } + }, + "required": [ + "name", + "slug" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/category/" + }, + { + "name": "createAccessTokenRequest", + "pointer": "/components/schemas/createAccessTokenRequest", + "schema": { + "examples": [ + { + "scopes": [ + "repo:read" + ], + "token_label": "My read only token" + } + ], + "properties": { + "expires_at": { + "description": "Optional expiration date for the token.\nIf omitted, the token will remain valid indefinitely.\n", + "example": "2021-10-28T18:30:19.520861Z", + "format": "date-time", + "type": "string" + }, + "scopes": { + "description": "Valid scopes: \"repo:admin\", \"repo:write\", \"repo:read\", \"repo:public_read\"\n", + "example": [ + "repo:read" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "token_label": { + "description": "Friendly name for you to identify the token.", + "example": "My read only token", + "maxLength": 100, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "token_label", + "scopes" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/createAccessTokenRequest/" + }, + { + "name": "createAccessTokensResponse", + "pointer": "/components/schemas/createAccessTokensResponse", + "schema": { + "$ref": "#/components/schemas/accessToken", + "examples": [ + { + "client_id": "HUB", + "created_at": "2021-07-20T12:00:00.000000Z", + "creator_ip": "127.0.0.1", + "creator_ua": "some user agent", + "expires_at": "2021-10-28T18:30:19.520861Z", + "generated_by": "manual", + "is_active": true, + "last_used": null, + "scopes": [ + "repo:read" + ], + "token": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "token_label": "My read only token", + "uuid": "b30bbf97-506c-4ecd-aabc-842f3cb484fb" + } + ] + }, + "url": "/reference/api/hub/latest/schemas/createAccessTokensResponse/" + }, + { + "name": "createOrgAccessTokenRequest", + "pointer": "/components/schemas/createOrgAccessTokenRequest", + "schema": { + "examples": [ + { + "description": "Token for CI/CD pipeline", + "label": "My organization token", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ] + } + ], + "properties": { + "description": { + "description": "Description of the access token", + "example": "Token for CI/CD pipeline", + "type": "string" + }, + "expires_at": { + "description": "Expiration date for the token", + "example": "2023-05-20T00:54:18Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "label": { + "description": "Label for the access token", + "example": "My organization token", + "type": "string" + }, + "resources": { + "description": "Resources this token has access to", + "items": { + "$ref": "#/components/schemas/orgAccessTokenResource" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "label", + "resources" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/createOrgAccessTokenRequest/" + }, + { + "name": "createOrgAccessTokenResponse", + "pointer": "/components/schemas/createOrgAccessTokenResponse", + "schema": { + "allOf": [ + { + "properties": { + "created_at": { + "example": "2022-05-20T00:54:18Z", + "format": "date-time", + "type": "string" + }, + "expires_at": { + "example": "2023-05-20T00:54:18Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "id": { + "example": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "type": "string" + }, + "is_active": { + "example": true, + "type": "boolean" + }, + "label": { + "example": "My organization token", + "type": "string" + }, + "last_used_at": { + "example": "2022-06-15T12:30:45Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "properties": { + "resources": { + "items": { + "$ref": "#/components/schemas/orgAccessTokenResource" + }, + "type": "array" + }, + "token": { + "description": "The actual token value that can be used for authentication", + "example": "dckr_oat_7awgM4jG5SQvxcvmNzhKj8PQjxo", + "type": "string" + } + }, + "type": "object" + } + ], + "examples": [ + { + "created_at": "2022-05-20T00:54:18Z", + "expires_at": "2023-05-20T00:54:18Z", + "id": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "is_active": true, + "label": "My organization token", + "last_used_at": "2022-06-15T12:30:45Z", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ], + "token": "dckr_oat_7awgM4jG5SQvxcvmNzhKj8PQjxo" + } + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/createOrgAccessTokenResponse/" + }, + { + "name": "email_address", + "pointer": "/components/schemas/email_address", + "schema": { + "properties": { + "email": { + "example": "dockeruser@docker.com", + "type": "string" + }, + "id": { + "type": "number" + }, + "primary": { + "type": "boolean" + }, + "user_id": { + "type": "number" + }, + "verified": { + "type": "boolean" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/email_address/" + }, + { + "name": "email_with_username", + "pointer": "/components/schemas/email_with_username", + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/email_address" + }, + { + "properties": { + "username": { + "example": "dockeruser", + "type": "string" + } + }, + "type": "object" + } + ] + }, + "url": "/reference/api/hub/latest/schemas/email_with_username/" + }, + { + "name": "error", + "pointer": "/components/schemas/error", + "schema": { + "description": "Error details vary by endpoint. The message describes the failure; errinfo can contain additional context.", + "properties": { + "detail": { + "type": "string" + }, + "errinfo": { + "additionalProperties": true, + "description": "Additional error context, when available.", + "type": [ + "object", + "null" + ] + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/error/" + }, + { + "name": "getAccessTokensResponse", + "pointer": "/components/schemas/getAccessTokensResponse", + "schema": { + "examples": [ + { + "active_count": 1, + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "client_id": "HUB", + "created_at": "2021-07-20T12:00:00.000000Z", + "creator_ip": "127.0.0.1", + "creator_ua": "some user agent", + "expires_at": "2021-10-28T18:30:19.520861Z", + "generated_by": "manual", + "is_active": true, + "last_used": null, + "scopes": [ + "repo:read" + ], + "token": "***", + "token_label": "My read only token", + "uuid": "b30bbf97-506c-4ecd-aabc-842f3cb484fb" + } + ] + } + ], + "properties": { + "active_count": { + "example": 1, + "type": "number" + }, + "count": { + "example": 1, + "type": "number" + }, + "next": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "previous": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "results": { + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/accessToken" + }, + { + "properties": { + "token": { + "example": "***", + "type": "string" + } + }, + "type": "object" + } + ] + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/getAccessTokensResponse/" + }, + { + "name": "getOrgAccessTokenResponse", + "pointer": "/components/schemas/getOrgAccessTokenResponse", + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/orgAccessToken" + }, + { + "properties": { + "resources": { + "description": "Resources this token has access to", + "items": { + "$ref": "#/components/schemas/orgAccessTokenResource" + }, + "type": "array" + } + }, + "type": "object" + } + ], + "examples": [ + { + "created_at": "2022-05-20T00:54:18Z", + "created_by": "johndoe", + "expires_at": "2023-05-20T00:54:18Z", + "id": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "is_active": true, + "label": "My organization token", + "last_used_at": "2022-06-15T12:30:45Z", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ] + } + ] + }, + "url": "/reference/api/hub/latest/schemas/getOrgAccessTokenResponse/" + }, + { + "name": "getOrgAccessTokensResponse", + "pointer": "/components/schemas/getOrgAccessTokensResponse", + "schema": { + "examples": [ + { + "next": null, + "previous": null, + "results": [ + { + "created_at": "2022-05-20T00:54:18Z", + "created_by": "johndoe", + "expires_at": "2023-05-20T00:54:18Z", + "id": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "is_active": true, + "label": "My organization token", + "last_used_at": "2022-06-15T12:30:45Z" + } + ], + "total": 1 + } + ], + "properties": { + "next": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "previous": { + "example": null, + "type": [ + "string", + "null" + ] + }, + "results": { + "items": { + "$ref": "#/components/schemas/orgAccessToken" + }, + "type": "array" + }, + "total": { + "example": 10, + "type": "number" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/getOrgAccessTokensResponse/" + }, + { + "name": "group_member", + "pointer": "/components/schemas/group_member", + "schema": { + "properties": { + "company": { + "example": "Docker Inc", + "type": "string" + }, + "date_joined": { + "example": "2021-01-05T21:06:53.506400Z", + "format": "date-time", + "type": "string" + }, + "email": { + "example": "dockeruser@docker.com", + "type": "string" + }, + "full_name": { + "example": "John Snow", + "type": "string" + }, + "gravatar_email": { + "type": "string" + }, + "gravatar_url": { + "type": "string" + }, + "id": { + "description": "The UUID trimmed", + "example": "0ab70deb065a43fcacd55d48caa945d8", + "type": "string" + }, + "location": { + "type": "string" + }, + "profile_url": { + "type": "string" + }, + "type": { + "enum": [ + "User", + "Org" + ], + "example": "User", + "type": "string" + }, + "username": { + "example": "dockeruser", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/group_member/" + }, + { + "name": "image", + "pointer": "/components/schemas/image", + "schema": { + "properties": { + "architecture": { + "description": "CPU architecture", + "type": "string" + }, + "digest": { + "description": "image digest", + "type": [ + "string", + "null" + ] + }, + "features": { + "description": "CPU features", + "type": [ + "string", + "null" + ] + }, + "last_pulled": { + "description": "datetime of last pull", + "example": "2021-01-05T21:06:53.506400Z", + "type": [ + "string", + "null" + ] + }, + "last_pushed": { + "description": "datetime of last push", + "example": "2021-01-05T21:06:53.506400Z", + "type": [ + "string", + "null" + ] + }, + "layers": { + "items": { + "$ref": "#/components/schemas/layer" + }, + "type": "array" + }, + "os": { + "description": "operating system", + "type": "string" + }, + "os_features": { + "description": "OS features", + "type": [ + "string", + "null" + ] + }, + "os_version": { + "description": "OS version", + "type": [ + "string", + "null" + ] + }, + "size": { + "description": "size of the image", + "type": "integer" + }, + "status": { + "description": "Status of the image", + "enum": [ + "active", + "inactive" + ], + "type": "string" + }, + "variant": { + "description": "CPU variant", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/image/" + }, + { + "name": "immutable_tags_settings", + "pointer": "/components/schemas/immutable_tags_settings", + "schema": { + "properties": { + "enabled": { + "description": "Whether immutable tags are enabled", + "type": "boolean" + }, + "rules": { + "description": "List of immutable tag rules", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "enabled", + "rules" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/immutable_tags_settings/" + }, + { + "name": "immutable_tags_verify_request", + "pointer": "/components/schemas/immutable_tags_verify_request", + "schema": { + "examples": [ + { + "regex": "v.*" + } + ], + "properties": { + "regex": { + "description": "Regular expression using Go regular expression syntax. Commas are not permitted.", + "example": "v.*", + "pattern": "^[^,]*$", + "type": "string" + } + }, + "required": [ + "regex" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/immutable_tags_verify_request/" + }, + { + "name": "immutable_tags_verify_response", + "pointer": "/components/schemas/immutable_tags_verify_response", + "schema": { + "examples": [ + { + "tags": [ + "v1.0.0", + "v2.1.3", + "latest" + ] + } + ], + "properties": { + "tags": { + "description": "List of tags that match the provided regex pattern", + "example": [ + "v1.0.0", + "v2.1.3", + "latest" + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "tags" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/immutable_tags_verify_response/" + }, + { + "name": "invite", + "pointer": "/components/schemas/invite", + "schema": { + "properties": { + "created_at": { + "example": "2021-10-28T18:30:19.520861Z", + "type": "string" + }, + "id": { + "description": "uuid representing the invite id", + "example": "e36eca69-4cc8-4f17-9845-ae8c2b832691", + "type": "string" + }, + "invitee": { + "description": "can either be a dockerID for registered users or an email for non-registered users", + "example": "invitee@docker.com", + "type": "string" + }, + "inviter_username": { + "example": "moby", + "type": "string" + }, + "org": { + "description": "name of the org to join", + "example": "docker", + "type": "string" + }, + "team": { + "description": "name of the team (user group) to join", + "example": "owners", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/invite/" + }, + { + "name": "layer", + "pointer": "/components/schemas/layer", + "schema": { + "properties": { + "digest": { + "description": "image layer digest", + "type": [ + "string", + "null" + ] + }, + "instruction": { + "description": "Dockerfile instruction", + "type": "string" + }, + "size": { + "description": "size of the layer", + "type": "integer" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/layer/" + }, + { + "name": "legacy_email_address", + "pointer": "/components/schemas/legacy_email_address", + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/email_address" + }, + { + "properties": { + "user": { + "example": "dockeruser", + "type": "string" + } + }, + "type": "object" + } + ] + }, + "url": "/reference/api/hub/latest/schemas/legacy_email_address/" + }, + { + "name": "list_repositories_response", + "pointer": "/components/schemas/list_repositories_response", + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/page" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/repository_list_entry" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "url": "/reference/api/hub/latest/schemas/list_repositories_response/" + }, + { + "name": "orgAccessToken", + "pointer": "/components/schemas/orgAccessToken", + "schema": { + "properties": { + "created_at": { + "example": "2022-05-20T00:54:18Z", + "format": "date-time", + "type": "string" + }, + "created_by": { + "example": "johndoe", + "type": "string" + }, + "expires_at": { + "example": "2023-05-20T00:54:18Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "id": { + "example": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "type": "string" + }, + "is_active": { + "example": true, + "type": "boolean" + }, + "label": { + "example": "My organization token", + "type": "string" + }, + "last_used_at": { + "example": "2022-06-15T12:30:45Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/orgAccessToken/" + }, + { + "name": "orgAccessTokenResource", + "pointer": "/components/schemas/orgAccessTokenResource", + "schema": { + "properties": { + "path": { + "description": "The path of the resource. The format of this will change depending on the type of resource.\n\nFor TYPE_REPO resources:\n- Must be an existing repository name (e.g., \"myorg/myrepo\")\n- Can use glob patterns (e.g., \"myorg/*\" for all repositories in the organization)\n- Use \"*/*/public\" to reference all public repositories\n", + "example": "myorg/myrepo", + "type": "string" + }, + "scopes": { + "description": "The scopes this token has access to", + "items": { + "example": "scope-image-pull", + "type": "string" + }, + "type": "array" + }, + "type": { + "description": "The type of resource", + "enum": [ + "TYPE_REPO", + "TYPE_ORG" + ], + "example": "TYPE_REPO", + "type": "string" + } + }, + "required": [ + "type", + "path", + "scopes" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/orgAccessTokenResource/" + }, + { + "name": "orgSettings", + "pointer": "/components/schemas/orgSettings", + "schema": { + "examples": [ + { + "restricted_images": { + "allow_official_images": true, + "allow_verified_publishers": true, + "enabled": true + } + } + ], + "properties": { + "restricted_images": { + "$ref": "#/components/schemas/restricted_images" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/orgSettings/" + }, + { + "name": "org_group", + "pointer": "/components/schemas/org_group", + "schema": { + "examples": [ + { + "description": "Development team", + "id": 10, + "member_count": 1, + "name": "developers", + "role": "member", + "uuid": "e36eca69-4cc8-4f17-9845-ae8c2b832691" + } + ], + "properties": { + "description": { + "description": "Description of the group", + "example": "Groups description", + "type": "string" + }, + "id": { + "description": "Group ID", + "example": 10, + "type": "number" + }, + "member_count": { + "description": "Member count of the group", + "example": 10, + "type": "number" + }, + "name": { + "description": "Name of the group", + "example": "mygroup", + "type": "string" + }, + "role": { + "description": "Role assigned to the team. A core role (`owner`, `editor`, or `member`)\nor the name of a custom role (not the label or UUID).\n", + "type": [ + "string", + "null" + ] + }, + "uuid": { + "description": "UUID for the group", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/org_group/" + }, + { + "name": "org_member", + "pointer": "/components/schemas/org_member", + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/user" + } + ], + "examples": [ + { + "date_joined": "2021-01-05T21:06:53.506400Z", + "email": "example@docker.com", + "full_name": "Jon Snow", + "groups": [ + "owners" + ], + "id": "0ab70deb065a43fcacd55d48caa945d8", + "is_guest": false, + "role": "Owner", + "type": "User", + "username": "dockeruser" + } + ], + "properties": { + "email": { + "description": "User's email address", + "example": "example@docker.com", + "type": "string" + }, + "groups": { + "description": "Groups (Teams) that the user is member of", + "example": [ + "developers", + "owners" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "is_guest": { + "description": "If the organization has verified domains, members that have email addresses outside of those domains will be flagged as guests.", + "example": false, + "type": "boolean" + }, + "last_desktop_version": { + "description": "Last desktop version the user used. To access this field, you must have insights visible for your organization. See\n[Insights](https://docs.docker.com/accounts/organization/insights/#view-insights-for-organization-users).\n", + "example": "4.29.0", + "type": "string" + }, + "last_logged_in_at": { + "description": "Last time the user logged in. To access this field, you must have insights visible for your organization. See\n[Insights](https://docs.docker.com/accounts/organization/insights/#view-insights-for-organization-users).\n", + "example": "2021-01-05T21:06:53.506400Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "last_seen_at": { + "description": "Last time the user was seen. To access this field, you must have insights visible for your organization. See\n[Insights](https://docs.docker.com/accounts/organization/insights/#view-insights-for-organization-users).\n", + "example": "2021-01-05T21:06:53.506400Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "primary_email": { + "deprecated": true, + "description": "The user's email primary address.", + "example": "example@docker.com", + "type": "string" + }, + "role": { + "description": "The member's role in the organization (`Owner`, `Editor`,\n`Member`, or `Invitee` for pending invites).\n", + "enum": [ + "Owner", + "Editor", + "Member", + "Invitee" + ], + "example": "Owner", + "type": "string" + } + } + }, + "url": "/reference/api/hub/latest/schemas/org_member/" + }, + { + "name": "org_member_paginated", + "pointer": "/components/schemas/org_member_paginated", + "schema": { + "examples": [ + { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "date_joined": "2021-01-05T21:06:53.506400Z", + "email": "example@docker.com", + "full_name": "Jon Snow", + "groups": [ + "owners" + ], + "id": "0ab70deb065a43fcacd55d48caa945d8", + "is_guest": false, + "role": "Owner", + "type": "User", + "username": "dockeruser" + } + ] + } + ], + "properties": { + "count": { + "description": "The total number of items that match with the search.", + "example": 120, + "type": "number" + }, + "next": { + "description": "The URL or link for the next page of items.", + "example": null, + "type": [ + "string", + "null" + ] + }, + "previous": { + "description": "The URL or link for the previous page of items.", + "example": null, + "type": [ + "string", + "null" + ] + }, + "results": { + "description": "List of accounts.", + "items": { + "$ref": "#/components/schemas/org_member" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/org_member_paginated/" + }, + { + "name": "page", + "pointer": "/components/schemas/page", + "schema": { + "properties": { + "count": { + "description": "total number of results available across all pages", + "type": "integer" + }, + "next": { + "description": "link to next page of results if any", + "type": [ + "string", + "null" + ] + }, + "previous": { + "description": "link to previous page of results if any", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/page/" + }, + { + "name": "paginated_tags", + "pointer": "/components/schemas/paginated_tags", + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/page" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/tag" + }, + "type": "array" + } + }, + "type": "object" + } + ], + "examples": [ + { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "creator": 1234, + "full_size": 123456, + "id": 12345, + "images": [ + { + "architecture": "amd64", + "features": null, + "last_pulled": null, + "last_pushed": "2021-01-05T21:06:53.506400Z", + "os": "linux", + "os_features": null, + "os_version": null, + "size": 123456, + "status": "active", + "variant": null + } + ], + "last_updated": "2021-01-05T21:06:53.506400Z", + "last_updater": 1234, + "last_updater_username": "dockeruser", + "name": "latest", + "repository": 5678, + "tag_last_pulled": null, + "tag_last_pushed": "2021-01-05T21:06:53.506400Z", + "tag_status": "active", + "v2": true + } + ] + } + ] + }, + "url": "/reference/api/hub/latest/schemas/paginated_tags/" + }, + { + "name": "patchAccessTokenRequest", + "pointer": "/components/schemas/patchAccessTokenRequest", + "schema": { + "examples": [ + { + "is_active": false, + "token_label": "My read only token" + } + ], + "properties": { + "is_active": { + "example": false, + "type": "boolean" + }, + "token_label": { + "example": "My read only token", + "maxLength": 100, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/patchAccessTokenRequest/" + }, + { + "name": "patchAccessTokenResponse", + "pointer": "/components/schemas/patchAccessTokenResponse", + "schema": { + "$ref": "#/components/schemas/accessToken", + "examples": [ + { + "client_id": "HUB", + "created_at": "2021-07-20T12:00:00.000000Z", + "creator_ip": "127.0.0.1", + "creator_ua": "some user agent", + "expires_at": "2021-10-28T18:30:19.520861Z", + "generated_by": "manual", + "is_active": true, + "last_used": null, + "scopes": [ + "repo:read" + ], + "token": "***", + "token_label": "My read only token", + "uuid": "b30bbf97-506c-4ecd-aabc-842f3cb484fb" + } + ] + }, + "url": "/reference/api/hub/latest/schemas/patchAccessTokenResponse/" + }, + { + "name": "repo_creation_request", + "pointer": "/components/schemas/repo_creation_request", + "schema": { + "properties": { + "description": { + "description": "Short description of the repository", + "example": "A sample application repository", + "maxLength": 100, + "type": "string" + }, + "full_description": { + "description": "Detailed description of the repository", + "example": "This is a comprehensive description of my application repository that contains additional details about the project, its purpose, usage instructions, and other relevant information.", + "maxLength": 25000, + "type": "string" + }, + "is_private": { + "default": false, + "description": "Whether the repository should be private", + "example": false, + "type": "boolean" + }, + "name": { + "description": "The name of the repository. Must be 2-255 characters long and may only include \nalphanumeric characters, periods (.), underscores (_), or hyphens (-). \nLetters must be lowercase.\n", + "example": "my-app", + "maxLength": 255, + "minLength": 2, + "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$", + "type": "string" + }, + "namespace": { + "description": "The namespace where the repository will be created", + "example": "myorganization", + "type": "string" + }, + "registry": { + "description": "The registry where the repository will be hosted", + "example": "docker.io", + "type": "string" + } + }, + "required": [ + "name", + "namespace" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/repo_creation_request/" + }, + { + "name": "repo_permissions", + "pointer": "/components/schemas/repo_permissions", + "schema": { + "properties": { + "admin": { + "description": "Admin permission", + "type": "boolean" + }, + "read": { + "description": "Read permission", + "type": "boolean" + }, + "write": { + "description": "Write permission", + "type": "boolean" + } + }, + "required": [ + "read", + "write", + "admin" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/repo_permissions/" + }, + { + "name": "repository_info", + "pointer": "/components/schemas/repository_info", + "schema": { + "examples": [ + { + "categories": [], + "collaborator_count": 0, + "content_types": [], + "date_registered": "2025-01-20T10:30:00Z", + "description": "A sample application repository", + "full_description": "This is a comprehensive description of my application repository that contains additional details about the project.", + "has_starred": false, + "hub_user": "myorganization", + "immutable_tags_settings": { + "enabled": false, + "rules": [] + }, + "is_automated": false, + "is_private": false, + "last_updated": "2025-01-20T10:30:00Z", + "media_types": [], + "name": "my-app", + "namespace": "myorganization", + "permissions": { + "admin": true, + "read": true, + "write": true + }, + "pull_count": 0, + "repository_type": "image", + "source": null, + "star_count": 0, + "status": 1, + "status_description": "Active", + "storage_size": null, + "user": "myorganization" + } + ], + "properties": { + "affiliation": { + "description": "Repository affiliation", + "type": [ + "string", + "null" + ] + }, + "categories": { + "description": "Repository categories", + "items": { + "$ref": "#/components/schemas/category" + }, + "type": "array" + }, + "collaborator_count": { + "description": "Number of collaborators", + "format": "int64", + "type": "integer" + }, + "content_types": { + "description": "Supported content types", + "items": { + "type": "string" + }, + "type": "array" + }, + "date_registered": { + "description": "ISO 8601 timestamp of when repository was created", + "example": "2021-01-05T21:06:53.506400Z", + "format": "date-time", + "type": "string" + }, + "description": { + "description": "Short description of the repository", + "type": "string" + }, + "full_description": { + "description": "Full description of the repository", + "type": [ + "string", + "null" + ] + }, + "has_starred": { + "description": "Whether the current user has starred this repository", + "type": "boolean" + }, + "hub_user": { + "description": "Hub user information", + "type": [ + "string", + "null" + ] + }, + "immutable_tags_settings": { + "$ref": "#/components/schemas/immutable_tags_settings" + }, + "is_automated": { + "description": "Whether the repository has automated builds", + "type": "boolean" + }, + "is_private": { + "description": "Whether the repository is private", + "type": "boolean" + }, + "last_modified": { + "description": "ISO 8601 timestamp of when repository was last modified", + "example": "2021-01-05T21:06:53.506400Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "last_updated": { + "description": "ISO 8601 timestamp of when repository was last updated", + "example": "2021-01-05T21:06:53.506400Z", + "format": "date-time", + "type": "string" + }, + "media_types": { + "description": "Supported media types", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": "array" + }, + "name": { + "description": "Repository name", + "type": "string" + }, + "namespace": { + "description": "Repository namespace", + "type": "string" + }, + "permissions": { + "$ref": "#/components/schemas/repo_permissions" + }, + "pull_count": { + "description": "Number of pulls", + "format": "int64", + "type": "integer" + }, + "repository_type": { + "description": "Type of the repository", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Source of the repository, where it was created from", + "type": [ + "string", + "null" + ] + }, + "star_count": { + "description": "Number of stars", + "format": "int64", + "type": "integer" + }, + "status": { + "description": "Repository status code", + "type": "integer" + }, + "status_description": { + "description": "Description of the repository status", + "type": "string" + }, + "storage_size": { + "description": "Storage size in bytes", + "format": "int64", + "type": [ + "integer", + "null" + ] + }, + "user": { + "description": "Username of the repository owner", + "type": "string" + } + }, + "required": [ + "user", + "name", + "namespace", + "status", + "status_description", + "description", + "is_private", + "is_automated", + "star_count", + "pull_count", + "last_updated", + "date_registered", + "collaborator_count", + "has_starred", + "permissions", + "media_types", + "content_types", + "categories", + "immutable_tags_settings" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/repository_info/" + }, + { + "name": "repository_list_entry", + "pointer": "/components/schemas/repository_list_entry", + "schema": { + "properties": { + "affiliation": { + "description": "User's affiliation with the repository (empty string if no affiliation)", + "example": "", + "type": "string" + }, + "categories": { + "description": "Categories associated with this repository", + "example": [], + "items": { + "$ref": "#/components/schemas/category" + }, + "type": "array" + }, + "content_types": { + "description": "Content types supported by this repository", + "example": [ + "plugin" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "date_registered": { + "description": "ISO 8601 timestamp of when the repository was created", + "example": "2013-06-19T19:07:54Z", + "format": "date-time", + "type": "string" + }, + "description": { + "description": "Repository description", + "example": "Hello World! (an example of minimal Dockerization)", + "type": [ + "string", + "null" + ] + }, + "is_private": { + "description": "Whether the repository is private", + "example": false, + "type": "boolean" + }, + "last_modified": { + "description": "ISO 8601 timestamp of when the repository was last modified", + "example": "2023-12-01T10:30:00Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "last_updated": { + "description": "ISO 8601 timestamp of when the repository was last updated", + "example": "2023-12-01T10:30:00Z", + "format": "date-time", + "type": [ + "string", + "null" + ] + }, + "media_types": { + "description": "Media types supported by this repository", + "example": [ + "application/vnd.docker.plugin.v1+json" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "description": "Name of the repository", + "example": "hello-world", + "type": "string" + }, + "namespace": { + "description": "Namespace (organization or username) that owns the repository", + "example": "docker", + "type": "string" + }, + "pull_count": { + "description": "Total number of pulls for this repository", + "example": 50000000, + "minimum": 0, + "type": "integer" + }, + "repository_type": { + "description": "Type of repository", + "enum": [ + "image", + "plugin", + null + ], + "example": "image", + "type": [ + "string", + "null" + ] + }, + "star_count": { + "description": "Number of users who starred this repository", + "example": 1234, + "minimum": 0, + "type": "integer" + }, + "status": { + "description": "Repository status code", + "example": 1, + "type": "integer" + }, + "status_description": { + "description": "Human-readable repository status", + "enum": [ + "active", + "inactive" + ], + "example": "active", + "type": "string" + }, + "storage_size": { + "description": "Storage size in bytes used by this repository", + "example": 232719127, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/repository_list_entry/" + }, + { + "name": "restricted_images", + "pointer": "/components/schemas/restricted_images", + "schema": { + "properties": { + "allow_official_images": { + "description": "Allow usage of official images if \"enabled\" is `true`.", + "example": true, + "type": "boolean" + }, + "allow_verified_publishers": { + "description": "Allow usage of verified publisher images if \"enabled\" is `true`.", + "example": true, + "type": "boolean" + }, + "enabled": { + "description": "Whether or not to restrict image usage for users in the organization.", + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/restricted_images/" + }, + { + "name": "scim_email", + "pointer": "/components/schemas/scim_email", + "schema": { + "properties": { + "display": { + "example": "jon.snow@docker.com", + "type": "string" + }, + "primary": { + "example": true, + "type": "boolean" + }, + "value": { + "example": "jon.snow@docker.com", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/scim_email/" + }, + { + "name": "scim_error", + "pointer": "/components/schemas/scim_error", + "schema": { + "properties": { + "detail": { + "description": "Details about why the request failed.", + "type": "string" + }, + "schemas": { + "items": { + "default": "urn:ietf:params:scim:api:messages:2.0:Error", + "type": "string" + }, + "type": "array" + }, + "status": { + "description": "The status code for the response in string format.", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/scim_error/" + }, + { + "name": "scim_group", + "pointer": "/components/schemas/scim_group", + "schema": { + "properties": { + "display": { + "example": "nightswatch", + "type": "string" + }, + "value": { + "example": "nightswatch", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/scim_group/" + }, + { + "name": "scim_resource_type", + "pointer": "/components/schemas/scim_resource_type", + "schema": { + "examples": [ + { + "description": "User", + "endpoint": "/Users", + "id": "User", + "name": "User", + "schema": "urn:ietf:params:scim:schemas:core:2.0:User", + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:ResourceType" + ] + } + ], + "properties": { + "description": { + "example": "User", + "type": "string" + }, + "endpoint": { + "example": "/Users", + "type": "string" + }, + "id": { + "example": "User", + "type": "string" + }, + "name": { + "example": "User", + "type": "string" + }, + "schema": { + "example": "urn:ietf:params:scim:schemas:core:2.0:User", + "type": "string" + }, + "schemas": { + "example": [ + "urn:ietf:params:scim:schemas:core:2.0:ResourceType" + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/scim_resource_type/" + }, + { + "name": "scim_schema", + "pointer": "/components/schemas/scim_schema", + "schema": { + "examples": [ + { + "attributes": [], + "description": "User Account", + "id": "urn:ietf:params:scim:schemas:core:2.0:User", + "name": "User", + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:Schema" + ] + } + ], + "properties": { + "attributes": { + "example": [], + "items": { + "$ref": "#/components/schemas/scim_schema_parent_attribute" + }, + "type": "array" + }, + "description": { + "example": "User Account", + "type": "string" + }, + "id": { + "example": "urn:ietf:params:scim:schemas:core:2.0:User", + "type": "string" + }, + "name": { + "example": "User", + "type": "string" + }, + "schemas": { + "example": [ + "urn:ietf:params:scim:schemas:core:2.0:Schema" + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/scim_schema/" + }, + { + "name": "scim_schema_attribute", + "pointer": "/components/schemas/scim_schema_attribute", + "schema": { + "properties": { + "caseExact": { + "example": false, + "type": "boolean" + }, + "description": { + "example": "Unique identifier for the User, typically used by the user to directly authenticate to the service provider. Each User MUST include a non-empty userName value. This identifier MUST be unique across the service provider's entire set of Users.", + "type": "string" + }, + "multiValued": { + "example": false, + "type": "boolean" + }, + "mutability": { + "example": "readWrite", + "type": "string" + }, + "name": { + "example": "userName", + "type": "string" + }, + "required": { + "example": true, + "type": "boolean" + }, + "returned": { + "example": "default", + "type": "string" + }, + "type": { + "enum": [ + "string", + "boolean", + "complex" + ], + "example": "string", + "type": "string" + }, + "uniqueness": { + "example": "server", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/scim_schema_attribute/" + }, + { + "name": "scim_schema_parent_attribute", + "pointer": "/components/schemas/scim_schema_parent_attribute", + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/scim_schema_attribute" + }, + { + "properties": { + "subAttributes": { + "items": { + "$ref": "#/components/schemas/scim_schema_attribute" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "url": "/reference/api/hub/latest/schemas/scim_schema_parent_attribute/" + }, + { + "name": "scim_service_provider_config", + "pointer": "/components/schemas/scim_service_provider_config", + "schema": { + "examples": [ + { + "authenticationSchemes": [ + { + "name": "OAuth 2.0 Bearer Token", + "specUri": "http://tools.ietf.org/html/rfc6750", + "type": "oauthbearertoken" + } + ], + "bulk": { + "maxOperations": 0, + "maxPayloadSize": 0, + "supported": false + }, + "changePassword": { + "supported": false + }, + "etag": { + "supported": false + }, + "filter": { + "maxResults": 200, + "supported": true + }, + "patch": { + "supported": true + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig" + ], + "sort": { + "supported": true + } + } + ], + "properties": { + "authenticationSchemes": { + "items": { + "properties": { + "description": { + "example": "The OAuth 2.0 Bearer Token Authentication scheme. OAuth enables clients to access protected resources by obtaining an access token, which is defined in RFC 6750 as \"a string representing an access authorization issued to the client\", rather than using the resource owner's credentials directly.", + "type": "string" + }, + "name": { + "example": "OAuth 2.0 Bearer Token", + "type": "string" + }, + "specUri": { + "example": "http://tools.ietf.org/html/rfc6750", + "type": "string" + }, + "type": { + "example": "oauthbearertoken", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "bulk": { + "properties": { + "maxOperations": { + "type": "integer" + }, + "maxPayloadSize": { + "type": "integer" + }, + "supported": { + "example": false, + "type": "boolean" + } + }, + "type": "object" + }, + "changePassword": { + "properties": { + "supported": { + "example": false, + "type": "boolean" + } + }, + "type": "object" + }, + "documentationUri": { + "example": "", + "type": "string" + }, + "etag": { + "properties": { + "supported": { + "example": false, + "type": "boolean" + } + }, + "type": "object" + }, + "filter": { + "properties": { + "maxResults": { + "example": 200, + "type": "integer" + }, + "supported": { + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "patch": { + "properties": { + "supported": { + "example": true, + "type": "boolean" + } + }, + "type": "object" + }, + "schemas": { + "example": [ + "urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "sort": { + "properties": { + "supported": { + "example": true, + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/scim_service_provider_config/" + }, + { + "name": "scim_user", + "pointer": "/components/schemas/scim_user", + "schema": { + "examples": [ + { + "active": true, + "displayName": "jonsnow", + "emails": [ + { + "display": "jon.snow@docker.com", + "primary": true, + "value": "jon.snow@docker.com" + } + ], + "groups": [ + { + "display": "nightswatch", + "value": "nightswatch" + } + ], + "id": "d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "meta": { + "created": "2022-05-20T00:54:18Z", + "lastModified": "2022-05-20T00:54:18Z", + "location": "https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "resourceType": "User" + }, + "name": { + "familyName": "Snow", + "givenName": "Jon" + }, + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "jon.snow@docker.com" + } + ], + "properties": { + "active": { + "example": true, + "type": "boolean" + }, + "displayName": { + "$ref": "#/components/schemas/scim_user_display_name" + }, + "emails": { + "items": { + "$ref": "#/components/schemas/scim_email" + }, + "type": "array" + }, + "groups": { + "items": { + "$ref": "#/components/schemas/scim_group" + }, + "type": "array" + }, + "id": { + "$ref": "#/components/schemas/scim_user_id" + }, + "meta": { + "properties": { + "created": { + "description": "The creation date for the user as a RFC3339 formatted string.", + "example": "2022-05-20T00:54:18Z", + "format": "date-time", + "type": "string" + }, + "lastModified": { + "description": "The date the user was last modified as a RFC3339 formatted string.", + "example": "2022-05-20T00:54:18Z", + "format": "date-time", + "type": "string" + }, + "location": { + "example": "https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "type": "string" + }, + "resourceType": { + "example": "User", + "type": "string" + } + }, + "type": "object" + }, + "name": { + "$ref": "#/components/schemas/scim_user_name" + }, + "schemas": { + "$ref": "#/components/schemas/scim_user_schemas" + }, + "userName": { + "$ref": "#/components/schemas/scim_user_username" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/scim_user/" + }, + { + "name": "scim_user_display_name", + "pointer": "/components/schemas/scim_user_display_name", + "schema": { + "description": "The username in Docker. Also known as the \"Docker ID\".", + "example": "jonsnow", + "type": "string" + }, + "url": "/reference/api/hub/latest/schemas/scim_user_display_name/" + }, + { + "name": "scim_user_id", + "pointer": "/components/schemas/scim_user_id", + "schema": { + "description": "The unique identifier for the user. A v4 UUID.", + "example": "d80f7c79-7730-49d8-9a41-7c42fb622d9c", + "type": "string" + }, + "url": "/reference/api/hub/latest/schemas/scim_user_id/" + }, + { + "name": "scim_user_name", + "pointer": "/components/schemas/scim_user_name", + "schema": { + "properties": { + "familyName": { + "example": "Snow", + "type": "string" + }, + "givenName": { + "example": "Jon", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/scim_user_name/" + }, + { + "name": "scim_user_schemas", + "pointer": "/components/schemas/scim_user_schemas", + "schema": { + "items": { + "example": "urn:ietf:params:scim:schemas:core:2.0:User", + "minItems": 1, + "type": "string" + }, + "type": "array" + }, + "url": "/reference/api/hub/latest/schemas/scim_user_schemas/" + }, + { + "name": "scim_user_username", + "pointer": "/components/schemas/scim_user_username", + "schema": { + "description": "The user's email address. This must be reachable via email.", + "example": "jon.snow@docker.com", + "type": "string" + }, + "url": "/reference/api/hub/latest/schemas/scim_user_username/" + }, + { + "name": "tag", + "pointer": "/components/schemas/tag", + "schema": { + "examples": [ + { + "creator": 1234, + "full_size": 123456, + "id": 12345, + "images": [ + { + "architecture": "amd64", + "features": null, + "last_pulled": null, + "last_pushed": "2021-01-05T21:06:53.506400Z", + "os": "linux", + "os_features": null, + "os_version": null, + "size": 123456, + "status": "active", + "variant": null + } + ], + "last_updated": "2021-01-05T21:06:53.506400Z", + "last_updater": 1234, + "last_updater_username": "dockeruser", + "name": "latest", + "repository": 5678, + "tag_last_pulled": null, + "tag_last_pushed": "2021-01-05T21:06:53.506400Z", + "tag_status": "active", + "v2": true + } + ], + "properties": { + "creator": { + "description": "ID of the user that pushed the tag", + "type": "integer" + }, + "full_size": { + "description": "compressed size (sum of all layers) of the tagged image", + "type": "integer" + }, + "id": { + "description": "tag ID", + "type": "integer" + }, + "images": { + "items": { + "$ref": "#/components/schemas/image" + }, + "type": [ + "array", + "null" + ] + }, + "last_updated": { + "description": "datetime of last update", + "example": "2021-01-05T21:06:53.506400Z", + "type": [ + "string", + "null" + ] + }, + "last_updater": { + "description": "ID of the last user that updated the tag", + "type": "integer" + }, + "last_updater_username": { + "description": "Hub username of the user that updated the tag", + "type": "string" + }, + "name": { + "description": "name of the tag", + "type": "string" + }, + "repository": { + "description": "repository ID", + "type": "integer" + }, + "tag_last_pulled": { + "description": "datetime of last pull", + "example": "2021-01-05T21:06:53.506400Z", + "type": [ + "string", + "null" + ] + }, + "tag_last_pushed": { + "description": "datetime of last push", + "example": "2021-01-05T21:06:53.506400Z", + "type": [ + "string", + "null" + ] + }, + "tag_status": { + "description": "whether a tag has been pushed to or pulled in the past month", + "enum": [ + "active", + "inactive" + ], + "type": "string" + }, + "v2": { + "description": "Whether the tag uses the Registry V2 format.", + "type": "boolean" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/tag/" + }, + { + "name": "updateOrgAccessTokenRequest", + "pointer": "/components/schemas/updateOrgAccessTokenRequest", + "schema": { + "examples": [ + { + "description": "Token for CI/CD pipeline", + "is_active": true, + "label": "My organization token", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ] + } + ], + "properties": { + "description": { + "description": "Description of the access token", + "example": "Token for CI/CD pipeline", + "type": "string" + }, + "is_active": { + "description": "Whether the token is active", + "example": true, + "type": "boolean" + }, + "label": { + "description": "Label for the access token", + "example": "My organization token", + "type": "string" + }, + "resources": { + "description": "Resources this token has access to", + "items": { + "$ref": "#/components/schemas/orgAccessTokenResource" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/updateOrgAccessTokenRequest/" + }, + { + "name": "updateOrgAccessTokenResponse", + "pointer": "/components/schemas/updateOrgAccessTokenResponse", + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/orgAccessToken" + }, + { + "properties": { + "resources": { + "description": "Resources this token has access to", + "items": { + "$ref": "#/components/schemas/orgAccessTokenResource" + }, + "type": "array" + } + }, + "type": "object" + } + ], + "examples": [ + { + "created_at": "2022-05-20T00:54:18Z", + "created_by": "johndoe", + "expires_at": "2023-05-20T00:54:18Z", + "id": "a7a5ef25-8889-43a0-8cc7-f2a94268e861", + "is_active": true, + "label": "My organization token", + "last_used_at": "2022-06-15T12:30:45Z", + "resources": [ + { + "path": "myorg/myrepo", + "scopes": [ + "scope-image-pull" + ], + "type": "TYPE_REPO" + } + ] + } + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/updateOrgAccessTokenResponse/" + }, + { + "name": "update_repository_immutable_tags_request", + "pointer": "/components/schemas/update_repository_immutable_tags_request", + "schema": { + "examples": [ + { + "immutable_tags": true, + "immutable_tags_rules": [ + "v.*", + ".*-RELEASE" + ] + } + ], + "properties": { + "immutable_tags": { + "description": "Whether immutable tags are enabled", + "type": "boolean" + }, + "immutable_tags_rules": { + "description": "List of immutable tag rules", + "example": [ + "v.*", + ".*-RELEASE" + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "immutable_tags", + "immutable_tags_rules" + ], + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/update_repository_immutable_tags_request/" + }, + { + "name": "user", + "pointer": "/components/schemas/user", + "schema": { + "properties": { + "company": { + "example": "Docker Inc", + "type": "string" + }, + "date_joined": { + "example": "2021-01-05T21:06:53.506400Z", + "type": "string" + }, + "full_name": { + "example": "Jon Snow", + "type": "string" + }, + "gravatar_email": { + "type": "string" + }, + "gravatar_url": { + "type": "string" + }, + "id": { + "description": "The UUID trimmed", + "example": "0ab70deb065a43fcacd55d48caa945d8", + "type": "string" + }, + "location": { + "type": "string" + }, + "profile_url": { + "type": "string" + }, + "type": { + "enum": [ + "User", + "Org" + ], + "example": "User", + "type": "string" + }, + "username": { + "example": "dockeruser", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/hub/latest/schemas/user/" + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "scheme": "bearer", + "type": "http" + }, + "bearerSCIMAuth": { + "scheme": "bearer", + "type": "http" + }, + "scimToken": { + "description": "Use the SCIM provisioning token configured for the organization.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker HUB API", + "url": "https://hub.docker.com", + "x-audience": "public" + } + ], + "source": "content/reference/api/hub/latest.yaml", + "sourceURL": "/reference/api/hub/latest.yaml", + "tags": [ + { + "description": "See the [Changelog](https://docs.docker.com/reference/api/hub/changelog) for a summary of changes across Docker Hub API versions.\n", + "kind": "info", + "name": "changelog", + "summary": "Changelog" + }, + { + "description": "The following resources are available to interact with the documented API:\n- [Docker Hub CLI tool](https://github.com/docker/hub-tool#readme) (currently experimental)\n", + "kind": "info", + "name": "resources", + "summary": "Resources" + }, + { + "description": "The Docker Hub API is limited on the amount of requests you can perform per minute against it.\n\nIf you haven't hit the limit, each request to the API will return the following headers in the response.\n\n- `X-RateLimit-Limit` - The limit of requests per minute.\n- `X-RateLimit-Remaining` - The remaining amount of calls within the limit period.\n- `X-RateLimit-Reset` - The unix timestamp of when the remaining resets.\n\nIf you have hit the limit, you will receive a response status of `429` and the `Retry-After` header in the response.\n\nThe [`Retry-After` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After) specifies the number of seconds to wait until you can call the API again.\n\n**Note**: These rate limits are separate from anti-abuse and Docker Hub download, or pull rate limiting.\nTo learn more about Docker Hub pull rate limiting, see [Usage and limits](https://docs.docker.com/docker-hub/usage/).\n", + "kind": "info", + "name": "rate-limiting", + "summary": "Rate Limiting" + }, + { + "description": "Most Docker Hub API endpoints require you to authenticate using your Docker credentials before using them.\n\nAdditionally, similar to the Docker Hub UI features, API endpoint responses may vary depending on your subscription (Personal, Pro, or Team) and your account's permissions.\n\nTo learn more about the features available in each subscription and to upgrade your existing subscription, see [Docker Pricing](https://www.docker.com/pricing?ref=Docs\u0026refAction=DocsApiHub).\n\n# Types\n\nThe Docker Hub API supports the following authentication types.\n\nYou must use each authentication type with the [Create access token](#tag/authentication-api/operation/AuthCreateAccessToken) route to obtain a bearer token.\n\n## Password\nUsing a username and password is the most powerful, yet least secure way \nto authenticate with Docker as a user. It allows access to resources \nfor the user without scopes. \n\n_In general, it is recommended to use a personal access token (PAT) instead._\n\n_**The password authentication type is not available if your organization has SSO enforced.**_\n\n## Personal Access Token (PAT)\nUsing a username and PAT is the most secure way to authenticate with \nDocker as a user. PATs are scoped to specific resources and scopes.\n\nCurrently, a PAT is a more secure password due to limited functionality. \nIn the future, we may add fine-grained access like organization \naccess tokens for enhanced usage and security.\n\n## Organization Access Token (OAT)\nOrganization access tokens are scoped to specific resources and scopes \nin an organization. They are managed by organization owners. \n\nThese tokens are meant for automation and are not meant to be used by \nusers.\n\nOperations that support bearer tokens issued from OATs state this in their descriptions.\n\n", + "kind": "info", + "name": "authentication", + "summary": "Authentication" + }, + { + "description": "The authentication endpoints allow you to authenticate with Docker Hub APIs.\n\nFor more information, see [Authentication](#tag/authentication).\n", + "kind": "nav", + "name": "authentication-api", + "summary": "Authentication" + }, + { + "description": "The Personal Access Token endpoints lets you manage personal access tokens. For more information, see [Access Tokens](https://docs.docker.com/security/access-tokens/personal-access-tokens/).\n\nYou can use a personal access token instead of a password in the [Docker CLI](https://docs.docker.com/reference/cli/docker/) or in the [Create an authentication token](#operation/PostUsersLogin) route to obtain a bearer token.\n\n### Scopes\n\nFor each scope grouping (in this case \"repo\"), you only need to define 1 scope as any lower scopes are assumed.\nFor example: If you define `repo:write`, the API assumes the scope of both `repo:read` *and* `repo:public_read` as well.\nIf you were to define both `repo:write` *and* `repo:read`, then `repo:read` is assumed by `repo:write` and ignored.\n\n***Treat your personal access token like your password and keep it secret. You cannot retrieve your token after it is generated.***\n", + "kind": "nav", + "name": "access-tokens", + "summary": "Personal Access Tokens" + }, + { + "description": "The Audit Logs API endpoints allow you to query audit log events across a namespace.\n\nFor more information, see [Audit Logs](https://docs.docker.com/admin/activity-logs/).\n", + "kind": "nav", + "name": "audit-logs", + "summary": "Audit Logs" + }, + { + "description": "The Org Settings API endpoints allow you to manage your organization's settings.\n", + "kind": "nav", + "name": "org-settings", + "summary": "Org Settings" + }, + { + "description": "The repository endpoints allow you to access your repository's tags.\n", + "kind": "nav", + "name": "repositories", + "summary": "Repositories" + }, + { + "description": "The organization endpoints allow you to interact with and manage your organizations.\n\nFor more information, see [Organization administration overview](https://docs.docker.com/admin/organization/).\n", + "kind": "nav", + "name": "orgs", + "summary": "Organizations", + "x-audience": "public" + }, + { + "description": "The groups endpoints allow you to manage your organization's teams and their members.\n\nFor more information, see [Create and manage a team](https://docs.docker.com/admin/organization/manage/manage-a-team/).\n", + "kind": "nav", + "name": "groups", + "summary": "Groups (Teams)", + "x-audience": "public" + }, + { + "description": "The invites endpoints allow you to manage invites for users to join your Docker organization.\n\nFor more information, see [Invite members](https://docs.docker.com/accounts/organization/manage/members/#invite-members).\n", + "kind": "nav", + "name": "invites", + "summary": "Invites", + "x-audience": "public" + }, + { + "description": "SCIM is a provisioning system that lets you manage users within your identity provider (IdP).\n\nFor more information, see [System for Cross-domain Identity management](https://docs.docker.com/security/for-admins/provisioning/scim/).\n", + "kind": "nav", + "name": "scim", + "summary": "SCIM", + "x-audience": "public" + }, + { + "description": "The organization access token endpoints allow you to manage organization access tokens (OATs). See [Organization access tokens](https://docs.docker.com/security/for-admins/access-tokens/) for more information.\n\nOATs only authenticate requests to the modern namespace-scoped routes under `/v2/namespaces/{namespace}/repositories/`. Legacy repository paths are OAT unsupported, regardless of the token's scopes, and reject every OAT with `403 token issued from organization access token is not allowed`:\n\n- `GET /v2/repositories/{namespace}/{repository}` — use [Get repository](#tag/repositories/operation/GetRepository) instead.\n- `GET /v2/repositories/{namespace}` — use [List repositories](#tag/repositories/operation/listNamespaceRepositories) instead.\n- `GET /v2/users/{username}/repositories` — use [List repositories](#tag/repositories/operation/listNamespaceRepositories) instead.\n", + "kind": "nav", + "name": "org-access-tokens", + "summary": "Organization Access Tokens", + "x-audience": "public" + } + ], + "title": "Docker Hub", + "url": "/reference/api/hub/latest/", + "version": "2-beta" + }, + { + "connection": "hosted", + "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.\n \n#### Summary data\n\nIn 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). \n\nThere are two levels of summary data:\n\n- Repository-level, a summary of every namespace and repository\n- Tag- or digest-level, a summary of every namespace, repository, and reference\n (tag or digest)\n\nThe summary data formats contain the following data points:\n\n- Unique IP address count\n- Pulls by tag count\n- Pulls by digest count\n- Version check count\n\n#### Raw data\n\nIn 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.\n\n- Type (industry)\n- Host (cloud provider)\n- Country (geolocation)\n- Timestamp\n- Namespace\n- Repository\n- Reference (digest is always included, tag is provided when available)\n- HTTP request method\n- Action, one of the following:\n - Pull by tag\n - Pull by digest\n - Version check\n- User-Agent\n", + "diagnostics": [], + "digest": "46e011a53a41887ab2771250758f9f35c0e59c378b09d1c799f3f2348689eb00", + "exampleCount": 30, + "experimental": false, + "guides": [], + "id": "dvp", + "manual": "/manuals/docker-hub/repos/manage/trusted-content/insights-analytics.md", + "operations": [ + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/'", + "curlNotes": [], + "deprecated": null, + "description": "Gets a list of your namespaces and repos which have data available.", + "id": "getNamespaces", + "line": 171, + "method": "GET", + "parameters": [], + "path": "/", + "pointer": "/paths/~1/get", + "raw": { + "description": "Gets a list of your namespaces and repos which have data available.", + "operationId": "getNamespaces", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NamespaceData" + } + } + }, + "description": "Success" + } + }, + "summary": "Get namespaces and repos", + "tags": [ + "discovery" + ] + }, + "references": [ + { + "ref": "#/components/schemas/NamespaceData", + "url": "/reference/api/dvp/latest/schemas/NamespaceData/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get namespaces and repos", + "tags": [ + "discovery" + ], + "url": "/reference/api/dvp/latest/operations/getNamespaces/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"namespaces\": [\n \"myorganization\"\n ]\n}", + "value": { + "namespaces": [ + "myorganization" + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/NamespaceData" + }, + "status": "200" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/namespaces'", + "curlNotes": [], + "deprecated": null, + "description": "Get metadata associated with the namespaces the user has access to, including extra repos associated with the namespaces.", + "id": "getUserNamespaces", + "line": 185, + "method": "GET", + "parameters": [], + "path": "/namespaces", + "pointer": "/paths/~1namespaces/get", + "raw": { + "description": "Get metadata associated with the namespaces the user has access to, including extra repos associated with the namespaces.", + "operationId": "getUserNamespaces", + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "publishers": { + "summary": "Namespace metadata", + "value": [ + { + "datasets": [ + { + "name": "pulls", + "timespans": [ + "months", + "weeks" + ], + "views": [ + "raw", + "summary", + "repo-summary", + "namespace-summary", + "geo-repo-summary" + ] + } + ], + "extensionPublisher": false, + "extraRepos": null, + "namespace": "org1", + "publisherType": "DVP" + } + ] + } + }, + "schema": { + "items": { + "$ref": "#/components/schemas/NamespaceMetadata" + }, + "type": "array" + } + } + }, + "description": "Success" + }, + "401": { + "description": "Authentication failed or second factor required" + } + }, + "summary": "Get user's namespaces", + "tags": [ + "discovery" + ] + }, + "references": [ + { + "ref": "#/components/schemas/NamespaceMetadata", + "url": "/reference/api/dvp/latest/schemas/NamespaceMetadata/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get user's namespaces", + "tags": [ + "discovery" + ], + "url": "/reference/api/dvp/latest/operations/getUserNamespaces/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "publishers", + "text": "[\n {\n \"datasets\": [\n {\n \"name\": \"pulls\",\n \"timespans\": [\n \"months\",\n \"weeks\"\n ],\n \"views\": [\n \"raw\",\n \"summary\",\n \"repo-summary\",\n \"namespace-summary\",\n \"geo-repo-summary\"\n ]\n }\n ],\n \"extensionPublisher\": false,\n \"extraRepos\": null,\n \"namespace\": \"org1\",\n \"publisherType\": \"DVP\"\n }\n]", + "value": [ + { + "datasets": [ + { + "name": "pulls", + "timespans": [ + "months", + "weeks" + ], + "views": [ + "raw", + "summary", + "repo-summary", + "namespace-summary", + "geo-repo-summary" + ] + } + ], + "extensionPublisher": false, + "extraRepos": null, + "namespace": "org1", + "publisherType": "DVP" + } + ] + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1namespaces/get/responses/200/content/application~1json", + "required": null, + "schema": { + "items": { + "$ref": "#/components/schemas/NamespaceMetadata" + }, + "type": "array" + }, + "status": "200" + }, + { + "description": "Authentication failed or second factor required", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1namespaces/get/responses/401", + "status": "401" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/namespaces/\u003cNAMESPACE\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Gets metadata associated with specified namespace, including extra repos associated with the namespace.", + "id": "getNamespace", + "line": 222, + "method": "GET", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1namespaces~1{namespace}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/namespaces/{namespace}", + "pointer": "/paths/~1namespaces~1{namespace}/get", + "raw": { + "description": "Gets metadata associated with specified namespace, including extra repos associated with the namespace.", + "operationId": "getNamespace", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NamespaceMetadata" + } + } + }, + "description": "Success" + } + }, + "summary": "Get namespace", + "tags": [ + "discovery" + ] + }, + "references": [ + { + "ref": "#/components/schemas/NamespaceMetadata", + "url": "/reference/api/dvp/latest/schemas/NamespaceMetadata/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get namespace", + "tags": [ + "discovery" + ], + "url": "/reference/api/dvp/latest/operations/getNamespace/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"datasets\": [\n {\n \"name\": \"pulls\",\n \"timespans\": [\n \"months\",\n \"weeks\"\n ],\n \"views\": [\n \"raw\",\n \"summary\",\n \"repo-summary\",\n \"namespace-summary\",\n \"geo-repo-summary\"\n ]\n }\n ],\n \"extensionPublisher\": false,\n \"extraRepos\": null,\n \"namespace\": \"org1\",\n \"publisherType\": \"DVP\"\n}", + "value": { + "datasets": [ + { + "name": "pulls", + "timespans": [ + "months", + "weeks" + ], + "views": [ + "raw", + "summary", + "repo-summary", + "namespace-summary", + "geo-repo-summary" + ] + } + ], + "extensionPublisher": false, + "extraRepos": null, + "namespace": "org1", + "publisherType": "DVP" + } + }, + { + "language": "json", + "name": "Schema example", + "text": "{\n \"datasets\": [\n {\n \"name\": \"pulls\",\n \"timespans\": [\n \"months\",\n \"weeks\"\n ],\n \"views\": [\n \"repo-summary\",\n \"namespace-summary\"\n ]\n },\n {\n \"name\": \"extensions\",\n \"timespans\": [\n \"months\",\n \"weeks\"\n ],\n \"views\": [\n \"ext-summary\"\n ]\n }\n ],\n \"extensionPublisher\": true,\n \"extraRepos\": null,\n \"namespace\": \"org4\",\n \"publisherType\": \"DVP\"\n}", + "value": { + "datasets": [ + { + "name": "pulls", + "timespans": [ + "months", + "weeks" + ], + "views": [ + "repo-summary", + "namespace-summary" + ] + }, + { + "name": "extensions", + "timespans": [ + "months", + "weeks" + ], + "views": [ + "ext-summary" + ] + } + ], + "extensionPublisher": true, + "extraRepos": null, + "namespace": "org4", + "publisherType": "DVP" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1namespaces~1{namespace}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/NamespaceMetadata" + }, + "status": "200" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/namespaces/\u003cNAMESPACE\u003e/pulls'", + "curlNotes": [], + "deprecated": null, + "description": "Gets pulls for the given namespace.", + "id": "getNamespacePulls", + "line": 243, + "method": "GET", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Timespan type for fetching data", + "in": "query", + "name": "timespan", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls/get/parameters/1", + "required": false, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Relative period of the period to fetch data", + "in": "query", + "name": "period", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls/get/parameters/2", + "required": false, + "schema": { + "$ref": "#/components/schemas/PeriodType" + } + }, + { + "description": "Field to group the data by", + "in": "query", + "name": "group", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls/get/parameters/3", + "required": false, + "schema": { + "$ref": "#/components/schemas/GroupType" + } + } + ], + "path": "/namespaces/{namespace}/pulls", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls/get", + "raw": { + "description": "Gets pulls for the given namespace.", + "operationId": "getNamespacePulls", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Timespan type for fetching data", + "in": "query", + "name": "timespan", + "required": false, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Relative period of the period to fetch data", + "in": "query", + "name": "period", + "required": false, + "schema": { + "$ref": "#/components/schemas/PeriodType" + } + }, + { + "description": "Field to group the data by", + "in": "query", + "name": "group", + "required": false, + "schema": { + "$ref": "#/components/schemas/GroupType" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PullData" + } + } + }, + "description": "Success" + }, + "404": { + "description": "Not found - namespace doesn't exist or user does not have permission to access it" + } + }, + "summary": "Get pull data", + "tags": [ + "namespaces" + ] + }, + "references": [ + { + "ref": "#/components/schemas/GroupType", + "url": "/reference/api/dvp/latest/schemas/GroupType/" + }, + { + "ref": "#/components/schemas/PeriodType", + "url": "/reference/api/dvp/latest/schemas/PeriodType/" + }, + { + "ref": "#/components/schemas/PullData", + "url": "/reference/api/dvp/latest/schemas/PullData/" + }, + { + "ref": "#/components/schemas/TimespanType", + "url": "/reference/api/dvp/latest/schemas/TimespanType/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get pull data", + "tags": [ + "namespaces" + ], + "url": "/reference/api/dvp/latest/operations/getNamespacePulls/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"pulls\": [\n {\n \"end\": \"2022-08-07T00:00:00Z\",\n \"ipCount\": 10,\n \"pullCount\": 11,\n \"repo\": \"neo4j-admin\",\n \"start\": \"2022-08-01T00:00:00Z\"\n },\n {\n \"end\": \"2022-08-14T00:00:00Z\",\n \"ipCount\": 10,\n \"pullCount\": 11,\n \"repo\": \"neo4j-admin\",\n \"start\": \"2022-08-08T00:00:00Z\"\n }\n ]\n}", + "value": { + "pulls": [ + { + "end": "2022-08-07T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-01T00:00:00Z" + }, + { + "end": "2022-08-14T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-08T00:00:00Z" + } + ] + } + }, + { + "language": "json", + "name": "Schema example", + "text": "{\n \"pulls\": null\n}", + "value": { + "pulls": null + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PullData" + }, + "status": "200" + }, + { + "description": "Not found - namespace doesn't exist or user does not have permission to access it", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls/get/responses/404", + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/namespaces/\u003cNAMESPACE\u003e/pulls/exports/years'", + "curlNotes": [], + "deprecated": null, + "description": "Gets a list of years that have data for the given namespace.", + "id": "getNamespaceYears", + "line": 331, + "method": "GET", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/namespaces/{namespace}/pulls/exports/years", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years/get", + "raw": { + "description": "Gets a list of years that have data for the given namespace.", + "operationId": "getNamespaceYears", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/YearData" + } + } + }, + "description": "Success" + } + }, + "summary": "Get years with data", + "tags": [ + "namespaces" + ] + }, + "references": [ + { + "ref": "#/components/schemas/YearData", + "url": "/reference/api/dvp/latest/schemas/YearData/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get years with data", + "tags": [ + "namespaces" + ], + "url": "/reference/api/dvp/latest/operations/getNamespaceYears/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"years\": [\n {\n \"year\": 2025\n }\n ]\n}", + "value": { + "years": [ + { + "year": 2025 + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/YearData" + }, + "status": "200" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/namespaces/\u003cNAMESPACE\u003e/pulls/exports/years/\u003cYEAR\u003e/\u003cTIMESPANTYPE\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Gets a list of timespans of the given type that have data for the given namespace and year.", + "id": "getNamespaceTimespans", + "line": 352, + "method": "GET", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Year to fetch data for", + "in": "path", + "name": "year", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}/get/parameters/1", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Type of timespan to fetch data for", + "in": "path", + "name": "timespantype", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}/get/parameters/2", + "required": true, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + } + ], + "path": "/namespaces/{namespace}/pulls/exports/years/{year}/{timespantype}", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}/get", + "raw": { + "description": "Gets a list of timespans of the given type that have data for the given namespace and year.", + "operationId": "getNamespaceTimespans", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Year to fetch data for", + "in": "path", + "name": "year", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Type of timespan to fetch data for", + "in": "path", + "name": "timespantype", + "required": true, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimespanData" + } + } + }, + "description": "Success" + } + }, + "summary": "Get timespans with data", + "tags": [ + "namespaces" + ] + }, + "references": [ + { + "ref": "#/components/schemas/TimespanData", + "url": "/reference/api/dvp/latest/schemas/TimespanData/" + }, + { + "ref": "#/components/schemas/TimespanType", + "url": "/reference/api/dvp/latest/schemas/TimespanType/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get timespans with data", + "tags": [ + "namespaces" + ], + "url": "/reference/api/dvp/latest/operations/getNamespaceTimespans/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"months\": [\n {\n \"month\": 5\n },\n {\n \"month\": 7\n }\n ]\n}", + "value": { + "months": [ + { + "month": 5 + }, + { + "month": 7 + } + ] + } + }, + { + "language": "json", + "name": "Schema example", + "text": "{\n \"weeks\": [\n {\n \"week\": 31\n },\n {\n \"week\": 32\n }\n ]\n}", + "value": { + "weeks": [ + { + "week": 31 + }, + { + "week": 32 + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/TimespanData" + }, + "status": "200" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/namespaces/\u003cNAMESPACE\u003e/pulls/exports/years/\u003cYEAR\u003e/\u003cTIMESPANTYPE\u003e/\u003cTIMESPAN\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Gets info about data for the given namespace and timespan.", + "id": "getNamespaceTimespanMetadata", + "line": 385, + "method": "GET", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Year to fetch data for", + "in": "path", + "name": "year", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}/get/parameters/1", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Type of timespan to fetch data for", + "in": "path", + "name": "timespantype", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}/get/parameters/2", + "required": true, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Timespan to fetch data for", + "in": "path", + "name": "timespan", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}/get/parameters/3", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "path": "/namespaces/{namespace}/pulls/exports/years/{year}/{timespantype}/{timespan}", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}/get", + "raw": { + "description": "Gets info about data for the given namespace and timespan.", + "operationId": "getNamespaceTimespanMetadata", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Year to fetch data for", + "in": "path", + "name": "year", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Type of timespan to fetch data for", + "in": "path", + "name": "timespantype", + "required": true, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Timespan to fetch data for", + "in": "path", + "name": "timespan", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimespanModel" + } + } + }, + "description": "Success" + }, + "404": { + "description": "Not Found" + } + }, + "summary": "Get namespace metadata for timespan", + "tags": [ + "namespaces" + ] + }, + "references": [ + { + "ref": "#/components/schemas/TimespanModel", + "url": "/reference/api/dvp/latest/schemas/TimespanModel/" + }, + { + "ref": "#/components/schemas/TimespanType", + "url": "/reference/api/dvp/latest/schemas/TimespanType/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get namespace metadata for timespan", + "tags": [ + "namespaces" + ], + "url": "/reference/api/dvp/latest/operations/getNamespaceTimespanMetadata/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"month\": 7\n}", + "value": { + "month": 7 + } + }, + { + "language": "json", + "name": "Schema example", + "text": "{\n \"week\": 31\n}", + "value": { + "week": 31 + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/TimespanModel" + }, + "status": "200" + }, + { + "description": "Not Found", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}/get/responses/404", + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/namespaces/\u003cNAMESPACE\u003e/pulls/exports/years/\u003cYEAR\u003e/\u003cTIMESPANTYPE\u003e/\u003cTIMESPAN\u003e/\u003cDATAVIEW\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Gets a list of URLs that can be used to download the pull data for the given namespace and timespan.", + "id": "getNamespaceDataByTimespan", + "line": 426, + "method": "GET", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}~1{dataview}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Year to fetch data for", + "in": "path", + "name": "year", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}~1{dataview}/get/parameters/1", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Type of timespan to fetch data for", + "in": "path", + "name": "timespantype", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}~1{dataview}/get/parameters/2", + "required": true, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Timespan to fetch data for", + "in": "path", + "name": "timespan", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}~1{dataview}/get/parameters/3", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Type of data to fetch", + "in": "path", + "name": "dataview", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}~1{dataview}/get/parameters/4", + "required": true, + "schema": { + "$ref": "#/components/schemas/DataviewType" + } + } + ], + "path": "/namespaces/{namespace}/pulls/exports/years/{year}/{timespantype}/{timespan}/{dataview}", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}~1{dataview}/get", + "raw": { + "description": "Gets a list of URLs that can be used to download the pull data for the given namespace and timespan.", + "operationId": "getNamespaceDataByTimespan", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Year to fetch data for", + "in": "path", + "name": "year", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Type of timespan to fetch data for", + "in": "path", + "name": "timespantype", + "required": true, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Timespan to fetch data for", + "in": "path", + "name": "timespan", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Type of data to fetch", + "in": "path", + "name": "dataview", + "required": true, + "schema": { + "$ref": "#/components/schemas/DataviewType" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "download": { + "description": "Use the signed URL returned by the API. The URL and file size in this example are illustrative.", + "summary": "Illustrative download location", + "value": { + "data": [ + { + "size": 1024, + "url": "https://example.invalid/exports/pulls.csv.gz?X-Amz-Expires=21600\u0026X-Amz-Signature=EXAMPLE" + } + ] + } + } + }, + "schema": { + "$ref": "#/components/schemas/ResponseData" + } + } + }, + "description": "Success" + } + }, + "summary": "Get namespace data for timespan", + "tags": [ + "namespaces" + ] + }, + "references": [ + { + "ref": "#/components/schemas/DataviewType", + "url": "/reference/api/dvp/latest/schemas/DataviewType/" + }, + { + "ref": "#/components/schemas/ResponseData", + "url": "/reference/api/dvp/latest/schemas/ResponseData/" + }, + { + "ref": "#/components/schemas/TimespanType", + "url": "/reference/api/dvp/latest/schemas/TimespanType/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get namespace data for timespan", + "tags": [ + "namespaces" + ], + "url": "/reference/api/dvp/latest/operations/getNamespaceDataByTimespan/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "download", + "text": "{\n \"data\": [\n {\n \"size\": 1024,\n \"url\": \"https://example.invalid/exports/pulls.csv.gz?X-Amz-Expires=21600\\u0026X-Amz-Signature=EXAMPLE\"\n }\n ]\n}", + "value": { + "data": [ + { + "size": 1024, + "url": "https://example.invalid/exports/pulls.csv.gz?X-Amz-Expires=21600\u0026X-Amz-Signature=EXAMPLE" + } + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1namespaces~1{namespace}~1pulls~1exports~1years~1{year}~1{timespantype}~1{timespan}~1{dataview}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ResponseData" + }, + "status": "200" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/namespaces/\u003cNAMESPACE\u003e/repos/\u003cREPO\u003e/pulls'", + "curlNotes": [], + "deprecated": null, + "description": "Gets pulls for the given repo.", + "id": "getRepoPulls", + "line": 284, + "method": "GET", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "pointer": "/paths/~1namespaces~1{namespace}~1repos~1{repo}~1pulls/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Repository to fetch data for", + "in": "path", + "name": "repo", + "pointer": "/paths/~1namespaces~1{namespace}~1repos~1{repo}~1pulls/get/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Timespan type for fetching data", + "in": "query", + "name": "timespan", + "pointer": "/paths/~1namespaces~1{namespace}~1repos~1{repo}~1pulls/get/parameters/2", + "required": false, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Relative period of the period to fetch data", + "in": "query", + "name": "period", + "pointer": "/paths/~1namespaces~1{namespace}~1repos~1{repo}~1pulls/get/parameters/3", + "required": false, + "schema": { + "$ref": "#/components/schemas/PeriodType" + } + }, + { + "description": "Field to group the data by", + "in": "query", + "name": "group", + "pointer": "/paths/~1namespaces~1{namespace}~1repos~1{repo}~1pulls/get/parameters/4", + "required": false, + "schema": { + "$ref": "#/components/schemas/GroupType" + } + } + ], + "path": "/namespaces/{namespace}/repos/{repo}/pulls", + "pointer": "/paths/~1namespaces~1{namespace}~1repos~1{repo}~1pulls/get", + "raw": { + "description": "Gets pulls for the given repo.", + "operationId": "getRepoPulls", + "parameters": [ + { + "description": "Namespace to fetch data for", + "in": "path", + "name": "namespace", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Repository to fetch data for", + "in": "path", + "name": "repo", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Timespan type for fetching data", + "in": "query", + "name": "timespan", + "required": false, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Relative period of the period to fetch data", + "in": "query", + "name": "period", + "required": false, + "schema": { + "$ref": "#/components/schemas/PeriodType" + } + }, + { + "description": "Field to group the data by", + "in": "query", + "name": "group", + "required": false, + "schema": { + "$ref": "#/components/schemas/GroupType" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PullData" + } + } + }, + "description": "Success" + }, + "404": { + "description": "Not found - repo doesn't exist or user does not have permission to access it" + } + }, + "summary": "Get pull data", + "tags": [ + "namespaces" + ] + }, + "references": [ + { + "ref": "#/components/schemas/GroupType", + "url": "/reference/api/dvp/latest/schemas/GroupType/" + }, + { + "ref": "#/components/schemas/PeriodType", + "url": "/reference/api/dvp/latest/schemas/PeriodType/" + }, + { + "ref": "#/components/schemas/PullData", + "url": "/reference/api/dvp/latest/schemas/PullData/" + }, + { + "ref": "#/components/schemas/TimespanType", + "url": "/reference/api/dvp/latest/schemas/TimespanType/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get pull data", + "tags": [ + "namespaces" + ], + "url": "/reference/api/dvp/latest/operations/getRepoPulls/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"pulls\": [\n {\n \"end\": \"2022-08-07T00:00:00Z\",\n \"ipCount\": 10,\n \"pullCount\": 11,\n \"repo\": \"neo4j-admin\",\n \"start\": \"2022-08-01T00:00:00Z\"\n },\n {\n \"end\": \"2022-08-14T00:00:00Z\",\n \"ipCount\": 10,\n \"pullCount\": 11,\n \"repo\": \"neo4j-admin\",\n \"start\": \"2022-08-08T00:00:00Z\"\n }\n ]\n}", + "value": { + "pulls": [ + { + "end": "2022-08-07T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-01T00:00:00Z" + }, + { + "end": "2022-08-14T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-08T00:00:00Z" + } + ] + } + }, + { + "language": "json", + "name": "Schema example", + "text": "{\n \"pulls\": null\n}", + "value": { + "pulls": null + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1namespaces~1{namespace}~1repos~1{repo}~1pulls/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PullData" + }, + "status": "200" + }, + { + "description": "Not found - repo doesn't exist or user does not have permission to access it", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1namespaces~1{namespace}~1repos~1{repo}~1pulls/get/responses/404", + "status": "404" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/api/publisher/analytics/v1/repos/pulls?repos=%3CREPOS%3E'", + "curlNotes": [], + "deprecated": null, + "description": "Gets pull for the given repos.", + "id": "getManyReposPulls", + "line": 479, + "method": "GET", + "parameters": [ + { + "description": "Repositories to fetch data for (maximum of 50 repositories per request).", + "in": "query", + "name": "repos", + "pointer": "/paths/~1repos~1pulls/get/parameters/0", + "required": true, + "schema": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + { + "description": "Timespan type for fetching data", + "in": "query", + "name": "timespan", + "pointer": "/paths/~1repos~1pulls/get/parameters/1", + "required": false, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Relative period of the period to fetch data", + "in": "query", + "name": "period", + "pointer": "/paths/~1repos~1pulls/get/parameters/2", + "required": false, + "schema": { + "$ref": "#/components/schemas/PeriodType" + } + }, + { + "description": "Field to group the data by", + "in": "query", + "name": "group", + "pointer": "/paths/~1repos~1pulls/get/parameters/3", + "required": false, + "schema": { + "$ref": "#/components/schemas/GroupType" + } + } + ], + "path": "/repos/pulls", + "pointer": "/paths/~1repos~1pulls/get", + "raw": { + "description": "Gets pull for the given repos.", + "operationId": "getManyReposPulls", + "parameters": [ + { + "description": "Repositories to fetch data for (maximum of 50 repositories per request).", + "in": "query", + "name": "repos", + "required": true, + "schema": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + { + "description": "Timespan type for fetching data", + "in": "query", + "name": "timespan", + "required": false, + "schema": { + "$ref": "#/components/schemas/TimespanType" + } + }, + { + "description": "Relative period of the period to fetch data", + "in": "query", + "name": "period", + "required": false, + "schema": { + "$ref": "#/components/schemas/PeriodType" + } + }, + { + "description": "Field to group the data by", + "in": "query", + "name": "group", + "required": false, + "schema": { + "$ref": "#/components/schemas/GroupType" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReposPullData" + } + } + }, + "description": "Success" + } + }, + "summary": "Get pull data for multiple repos", + "tags": [ + "namespaces" + ] + }, + "references": [ + { + "ref": "#/components/schemas/GroupType", + "url": "/reference/api/dvp/latest/schemas/GroupType/" + }, + { + "ref": "#/components/schemas/PeriodType", + "url": "/reference/api/dvp/latest/schemas/PeriodType/" + }, + { + "ref": "#/components/schemas/ReposPullData", + "url": "/reference/api/dvp/latest/schemas/ReposPullData/" + }, + { + "ref": "#/components/schemas/TimespanType", + "url": "/reference/api/dvp/latest/schemas/TimespanType/" + } + ], + "requestSchema": null, + "security": [ + { + "HubAuth": [] + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "summary": "Get pull data for multiple repos", + "tags": [ + "namespaces" + ], + "url": "/reference/api/dvp/latest/operations/getManyReposPulls/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"repos\": {\n \"org2/neo4j\": {\n \"pulls\": [\n {\n \"end\": \"2022-08-07T00:00:00Z\",\n \"ipCount\": 41490,\n \"pullCount\": 272407,\n \"repo\": \"neo4j\",\n \"start\": \"2022-08-01T00:00:00Z\"\n },\n {\n \"end\": \"2022-08-14T00:00:00Z\",\n \"ipCount\": 41490,\n \"pullCount\": 272407,\n \"repo\": \"neo4j\",\n \"start\": \"2022-08-08T00:00:00Z\"\n }\n ]\n },\n \"org2/neo4j-admin\": {\n \"pulls\": [\n {\n \"end\": \"2022-08-07T00:00:00Z\",\n \"ipCount\": 10,\n \"pullCount\": 11,\n \"repo\": \"neo4j-admin\",\n \"start\": \"2022-08-01T00:00:00Z\"\n },\n {\n \"end\": \"2022-08-14T00:00:00Z\",\n \"ipCount\": 10,\n \"pullCount\": 11,\n \"repo\": \"neo4j-admin\",\n \"start\": \"2022-08-08T00:00:00Z\"\n }\n ]\n }\n }\n}", + "value": { + "repos": { + "org2/neo4j": { + "pulls": [ + { + "end": "2022-08-07T00:00:00Z", + "ipCount": 41490, + "pullCount": 272407, + "repo": "neo4j", + "start": "2022-08-01T00:00:00Z" + }, + { + "end": "2022-08-14T00:00:00Z", + "ipCount": 41490, + "pullCount": 272407, + "repo": "neo4j", + "start": "2022-08-08T00:00:00Z" + } + ] + }, + "org2/neo4j-admin": { + "pulls": [ + { + "end": "2022-08-07T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-01T00:00:00Z" + }, + { + "end": "2022-08-14T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-08T00:00:00Z" + } + ] + } + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1repos~1pulls/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ReposPullData" + }, + "status": "200" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"code\": \"123456\",\n \"login_2fa_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n}' \\\n 'https://hub.docker.com/v2/users/2fa-login'", + "curlNotes": [], + "deprecated": null, + "description": "When a user has 2FA enabled, this is the second call to perform after\n`/v2/users/login` call.\n\nCreates and returns a bearer token in JWT format that you can use to authenticate with Docker Hub APIs.\n\nThe returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.\n\nMost Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.\n", + "id": "PostUsers2FALogin", + "line": 135, + "method": "POST", + "parameters": [], + "path": "/v2/users/2fa-login", + "pointer": "/paths/~1v2~1users~12fa-login/post", + "raw": { + "description": "When a user has 2FA enabled, this is the second call to perform after\n`/v2/users/login` call.\n\nCreates and returns a bearer token in JWT format that you can use to authenticate with Docker Hub APIs.\n\nThe returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.\n\nMost Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.\n", + "operationId": "PostUsers2FALogin", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Users2FALoginRequest" + } + } + }, + "description": "Login details.", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsersLoginSuccessResponse" + } + } + }, + "description": "Authentication successful" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsers2FALoginErrorResponse" + } + } + }, + "description": "Authentication failed or second factor required" + } + }, + "security": [], + "summary": "Second factor authentication", + "tags": [ + "authentication" + ] + }, + "references": [ + { + "ref": "#/components/schemas/PostUsers2FALoginErrorResponse", + "url": "/reference/api/dvp/latest/schemas/PostUsers2FALoginErrorResponse/" + }, + { + "ref": "#/components/schemas/PostUsersLoginSuccessResponse", + "url": "/reference/api/dvp/latest/schemas/PostUsersLoginSuccessResponse/" + }, + { + "ref": "#/components/schemas/Users2FALoginRequest", + "url": "/reference/api/dvp/latest/schemas/Users2FALoginRequest/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/Users2FALoginRequest" + }, + "security": [], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com" + } + ], + "summary": "Second factor authentication", + "tags": [ + "authentication" + ], + "url": "/reference/api/dvp/latest/operations/PostUsers2FALogin/", + "variants": [ + { + "description": "Login details.", + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"123456\",\n \"login_2fa_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n}", + "value": { + "code": "123456", + "login_2fa_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~12fa-login/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/Users2FALoginRequest" + }, + "status": "" + }, + { + "description": "Authentication successful", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n}", + "value": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~12fa-login/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PostUsersLoginSuccessResponse" + }, + "status": "200" + }, + { + "description": "Authentication failed or second factor required", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"detail\": \"Incorrect authentication credentials\"\n}", + "value": { + "detail": "Incorrect authentication credentials" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~12fa-login/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PostUsers2FALoginErrorResponse" + }, + "status": "401" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"password\": \"hunter2\",\n \"username\": \"myusername\"\n}' \\\n 'https://hub.docker.com/v2/users/login'", + "curlNotes": [], + "deprecated": null, + "description": "Creates and returns a bearer token in JWT format that you can use to\nauthenticate with Docker Hub APIs.\n\nThe returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.\n\nMost Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.\n", + "id": "PostUsersLogin", + "line": 99, + "method": "POST", + "parameters": [], + "path": "/v2/users/login", + "pointer": "/paths/~1v2~1users~1login/post", + "raw": { + "description": "Creates and returns a bearer token in JWT format that you can use to\nauthenticate with Docker Hub APIs.\n\nThe returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.\n\nMost Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.\n", + "operationId": "PostUsersLogin", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UsersLoginRequest" + } + } + }, + "description": "Login details.", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsersLoginSuccessResponse" + } + } + }, + "description": "Authentication successful" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsersLoginErrorResponse" + } + } + }, + "description": "Authentication failed or second factor required" + } + }, + "security": [], + "summary": "Create an authentication token", + "tags": [ + "authentication" + ] + }, + "references": [ + { + "ref": "#/components/schemas/PostUsersLoginErrorResponse", + "url": "/reference/api/dvp/latest/schemas/PostUsersLoginErrorResponse/" + }, + { + "ref": "#/components/schemas/PostUsersLoginSuccessResponse", + "url": "/reference/api/dvp/latest/schemas/PostUsersLoginSuccessResponse/" + }, + { + "ref": "#/components/schemas/UsersLoginRequest", + "url": "/reference/api/dvp/latest/schemas/UsersLoginRequest/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/UsersLoginRequest" + }, + "security": [], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com" + } + ], + "summary": "Create an authentication token", + "tags": [ + "authentication" + ], + "url": "/reference/api/dvp/latest/operations/PostUsersLogin/", + "variants": [ + { + "description": "Login details.", + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"password\": \"hunter2\",\n \"username\": \"myusername\"\n}", + "value": { + "password": "hunter2", + "username": "myusername" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~1login/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/UsersLoginRequest" + }, + "status": "" + }, + { + "description": "Authentication successful", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n}", + "value": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~1login/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PostUsersLoginSuccessResponse" + }, + "status": "200" + }, + { + "description": "Authentication failed or second factor required", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"detail\": \"Incorrect authentication credentials\"\n}", + "value": { + "detail": "Incorrect authentication credentials" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v2~1users~1login/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/PostUsersLoginErrorResponse" + }, + "status": "401" + } + ] + } + ], + "owner": "docker/docs", + "product": "dvp", + "schemaCount": 69, + "schemaURLs": { + "#/components/schemas/DatasetModel": "/reference/api/dvp/latest/schemas/DatasetModel/", + "#/components/schemas/DatasetType": "/reference/api/dvp/latest/schemas/DatasetType/", + "#/components/schemas/DataviewType": "/reference/api/dvp/latest/schemas/DataviewType/", + "#/components/schemas/GroupType": "/reference/api/dvp/latest/schemas/GroupType/", + "#/components/schemas/MonthData": "/reference/api/dvp/latest/schemas/MonthData/", + "#/components/schemas/MonthModel": "/reference/api/dvp/latest/schemas/MonthModel/", + "#/components/schemas/NamespaceData": "/reference/api/dvp/latest/schemas/NamespaceData/", + "#/components/schemas/NamespaceMetadata": "/reference/api/dvp/latest/schemas/NamespaceMetadata/", + "#/components/schemas/PeriodType": "/reference/api/dvp/latest/schemas/PeriodType/", + "#/components/schemas/PostUsers2FALoginErrorResponse": "/reference/api/dvp/latest/schemas/PostUsers2FALoginErrorResponse/", + "#/components/schemas/PostUsersLoginErrorResponse": "/reference/api/dvp/latest/schemas/PostUsersLoginErrorResponse/", + "#/components/schemas/PostUsersLoginSuccessResponse": "/reference/api/dvp/latest/schemas/PostUsersLoginSuccessResponse/", + "#/components/schemas/PullData": "/reference/api/dvp/latest/schemas/PullData/", + "#/components/schemas/PullModel": "/reference/api/dvp/latest/schemas/PullModel/", + "#/components/schemas/ReposPullData": "/reference/api/dvp/latest/schemas/ReposPullData/", + "#/components/schemas/ResponseData": "/reference/api/dvp/latest/schemas/ResponseData/", + "#/components/schemas/ResponseDataFile": "/reference/api/dvp/latest/schemas/ResponseDataFile/", + "#/components/schemas/TimespanData": "/reference/api/dvp/latest/schemas/TimespanData/", + "#/components/schemas/TimespanModel": "/reference/api/dvp/latest/schemas/TimespanModel/", + "#/components/schemas/TimespanType": "/reference/api/dvp/latest/schemas/TimespanType/", + "#/components/schemas/Users2FALoginRequest": "/reference/api/dvp/latest/schemas/Users2FALoginRequest/", + "#/components/schemas/UsersLoginRequest": "/reference/api/dvp/latest/schemas/UsersLoginRequest/", + "#/components/schemas/WeekData": "/reference/api/dvp/latest/schemas/WeekData/", + "#/components/schemas/WeekModel": "/reference/api/dvp/latest/schemas/WeekModel/", + "#/components/schemas/YearData": "/reference/api/dvp/latest/schemas/YearData/", + "#/components/schemas/YearModel": "/reference/api/dvp/latest/schemas/YearModel/" + }, + "schemas": [ + { + "name": "DatasetModel", + "pointer": "/components/schemas/DatasetModel", + "schema": { + "description": "Datasets and views available to the publisher, based on its entitlements.", + "properties": { + "name": { + "$ref": "#/components/schemas/DatasetType" + }, + "timespans": { + "items": { + "$ref": "#/components/schemas/TimespanType" + }, + "type": "array" + }, + "views": { + "items": { + "$ref": "#/components/schemas/DataviewType" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/DatasetModel/" + }, + { + "name": "DatasetType", + "pointer": "/components/schemas/DatasetType", + "schema": { + "enum": [ + "pulls", + "extensions" + ], + "type": "string" + }, + "url": "/reference/api/dvp/latest/schemas/DatasetType/" + }, + { + "name": "DataviewType", + "pointer": "/components/schemas/DataviewType", + "schema": { + "enum": [ + "raw", + "summary", + "repo-summary", + "namespace-summary", + "geo-repo-summary", + "ext-summary", + "ext-premium-summary", + "ext-premium-geo" + ], + "type": "string" + }, + "url": "/reference/api/dvp/latest/schemas/DataviewType/" + }, + { + "name": "GroupType", + "pointer": "/components/schemas/GroupType", + "schema": { + "enum": [ + "repo", + "namespace" + ], + "type": "string" + }, + "url": "/reference/api/dvp/latest/schemas/GroupType/" + }, + { + "name": "MonthData", + "pointer": "/components/schemas/MonthData", + "schema": { + "examples": [ + { + "months": [ + { + "month": 5 + }, + { + "month": 7 + } + ] + } + ], + "properties": { + "months": { + "items": { + "$ref": "#/components/schemas/MonthModel" + }, + "type": "array" + } + }, + "required": [ + "months" + ], + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/MonthData/" + }, + { + "name": "MonthModel", + "pointer": "/components/schemas/MonthModel", + "schema": { + "examples": [ + { + "month": 7 + } + ], + "properties": { + "month": { + "type": "integer" + } + }, + "required": [ + "month" + ], + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/MonthModel/" + }, + { + "name": "NamespaceData", + "pointer": "/components/schemas/NamespaceData", + "schema": { + "examples": [ + { + "namespaces": [ + "myorganization" + ] + } + ], + "properties": { + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/NamespaceData/" + }, + { + "name": "NamespaceMetadata", + "pointer": "/components/schemas/NamespaceMetadata", + "schema": { + "examples": [ + { + "datasets": [ + { + "name": "pulls", + "timespans": [ + "months", + "weeks" + ], + "views": [ + "raw", + "summary", + "repo-summary", + "namespace-summary", + "geo-repo-summary" + ] + } + ], + "extensionPublisher": false, + "extraRepos": null, + "namespace": "org1", + "publisherType": "DVP" + }, + { + "datasets": [ + { + "name": "pulls", + "timespans": [ + "months", + "weeks" + ], + "views": [ + "repo-summary", + "namespace-summary" + ] + }, + { + "name": "extensions", + "timespans": [ + "months", + "weeks" + ], + "views": [ + "ext-summary" + ] + } + ], + "extensionPublisher": true, + "extraRepos": null, + "namespace": "org4", + "publisherType": "DVP" + } + ], + "properties": { + "datasets": { + "items": { + "$ref": "#/components/schemas/DatasetModel" + }, + "type": "array" + }, + "extensionPublisher": { + "description": "Whether the namespace is an extension publisher.", + "type": "boolean" + }, + "extraRepos": { + "description": "Additional repositories associated with the namespace. Null when none are configured.", + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "namespace": { + "type": "string" + }, + "publisherType": { + "description": "Publisher program associated with the namespace.", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/NamespaceMetadata/" + }, + { + "name": "PeriodType", + "pointer": "/components/schemas/PeriodType", + "schema": { + "enum": [ + "last-2-months", + "last-3-months", + "last-6-months", + "last-12-months" + ], + "type": "string" + }, + "url": "/reference/api/dvp/latest/schemas/PeriodType/" + }, + { + "name": "PostUsers2FALoginErrorResponse", + "pointer": "/components/schemas/PostUsers2FALoginErrorResponse", + "schema": { + "description": "failed second factor login response.", + "examples": [ + { + "detail": "Incorrect authentication credentials" + } + ], + "properties": { + "detail": { + "description": "Description of the error.", + "example": "Incorrect authentication credentials", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/PostUsers2FALoginErrorResponse/" + }, + { + "name": "PostUsersLoginErrorResponse", + "pointer": "/components/schemas/PostUsersLoginErrorResponse", + "schema": { + "description": "failed user login response or second factor required", + "examples": [ + { + "detail": "Incorrect authentication credentials" + } + ], + "properties": { + "detail": { + "description": "Description of the error.", + "example": "Incorrect authentication credentials", + "type": "string" + }, + "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.", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "detail" + ], + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/PostUsersLoginErrorResponse/" + }, + { + "name": "PostUsersLoginSuccessResponse", + "pointer": "/components/schemas/PostUsersLoginSuccessResponse", + "schema": { + "description": "successful user login response", + "examples": [ + { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + ], + "properties": { + "token": { + "description": "Created authentication token.\n\nThis token can be used in the HTTP Authorization header as a JWT to authenticate with the Docker Hub APIs.\n", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/PostUsersLoginSuccessResponse/" + }, + { + "name": "PullData", + "pointer": "/components/schemas/PullData", + "schema": { + "examples": [ + { + "pulls": [ + { + "end": "2022-08-07T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-01T00:00:00Z" + }, + { + "end": "2022-08-14T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-08T00:00:00Z" + } + ] + }, + { + "pulls": null + } + ], + "properties": { + "pulls": { + "description": "Pull statistics for the selected interval. Null when no records are returned.", + "items": { + "$ref": "#/components/schemas/PullModel" + }, + "type": [ + "array", + "null" + ] + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/PullData/" + }, + { + "name": "PullModel", + "pointer": "/components/schemas/PullModel", + "schema": { + "properties": { + "country": { + "description": "Country. Present for results grouped by geography and repository.", + "type": "string" + }, + "end": { + "description": "End of the reporting interval in RFC 3339 format.", + "format": "date-time", + "type": "string" + }, + "ipCount": { + "type": "integer" + }, + "namespace": { + "description": "Namespace name. Present for results grouped by namespace.", + "type": "string" + }, + "pullCount": { + "type": "integer" + }, + "repo": { + "description": "Repository name. Present for results grouped by repository.", + "type": "string" + }, + "start": { + "description": "Start of the reporting interval in RFC 3339 format.", + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/PullModel/" + }, + { + "name": "ReposPullData", + "pointer": "/components/schemas/ReposPullData", + "schema": { + "examples": [ + { + "repos": { + "org2/neo4j": { + "pulls": [ + { + "end": "2022-08-07T00:00:00Z", + "ipCount": 41490, + "pullCount": 272407, + "repo": "neo4j", + "start": "2022-08-01T00:00:00Z" + }, + { + "end": "2022-08-14T00:00:00Z", + "ipCount": 41490, + "pullCount": 272407, + "repo": "neo4j", + "start": "2022-08-08T00:00:00Z" + } + ] + }, + "org2/neo4j-admin": { + "pulls": [ + { + "end": "2022-08-07T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-01T00:00:00Z" + }, + { + "end": "2022-08-14T00:00:00Z", + "ipCount": 10, + "pullCount": 11, + "repo": "neo4j-admin", + "start": "2022-08-08T00:00:00Z" + } + ] + } + } + } + ], + "properties": { + "repos": { + "additionalProperties": { + "$ref": "#/components/schemas/PullData" + }, + "type": "object" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/ReposPullData/" + }, + { + "name": "ResponseData", + "pointer": "/components/schemas/ResponseData", + "schema": { + "description": "Download locations for the selected export. Large exports can span multiple files.", + "properties": { + "data": { + "description": "Download URLs and file sizes for the export.", + "items": { + "$ref": "#/components/schemas/ResponseDataFile" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/ResponseData/" + }, + { + "name": "ResponseDataFile", + "pointer": "/components/schemas/ResponseDataFile", + "schema": { + "properties": { + "size": { + "description": "Size of the file in bytes.", + "format": "int64", + "type": "integer" + }, + "url": { + "description": "Signed download URL. URLs expire six hours after generation.", + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/ResponseDataFile/" + }, + { + "name": "TimespanData", + "pointer": "/components/schemas/TimespanData", + "schema": { + "examples": [ + { + "months": [ + { + "month": 5 + }, + { + "month": 7 + } + ] + }, + { + "weeks": [ + { + "week": 31 + }, + { + "week": 32 + } + ] + } + ], + "oneOf": [ + { + "$ref": "#/components/schemas/MonthData" + }, + { + "$ref": "#/components/schemas/WeekData" + } + ] + }, + "url": "/reference/api/dvp/latest/schemas/TimespanData/" + }, + { + "name": "TimespanModel", + "pointer": "/components/schemas/TimespanModel", + "schema": { + "examples": [ + { + "month": 7 + }, + { + "week": 31 + } + ], + "oneOf": [ + { + "$ref": "#/components/schemas/MonthModel" + }, + { + "$ref": "#/components/schemas/WeekModel" + } + ] + }, + "url": "/reference/api/dvp/latest/schemas/TimespanModel/" + }, + { + "name": "TimespanType", + "pointer": "/components/schemas/TimespanType", + "schema": { + "enum": [ + "months", + "weeks" + ], + "type": "string" + }, + "url": "/reference/api/dvp/latest/schemas/TimespanType/" + }, + { + "name": "Users2FALoginRequest", + "pointer": "/components/schemas/Users2FALoginRequest", + "schema": { + "description": "Second factor user login details", + "examples": [ + { + "code": "123456", + "login_2fa_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + ], + "properties": { + "code": { + "description": "The Time-based One-Time Password of the Docker Hub account to authenticate with.", + "example": "123456", + "type": "string" + }, + "login_2fa_token": { + "description": "The intermediate 2FA token returned from `/v2/users/login` API.", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "type": "string" + } + }, + "required": [ + "login_2fa_token", + "code" + ], + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/Users2FALoginRequest/" + }, + { + "name": "UsersLoginRequest", + "pointer": "/components/schemas/UsersLoginRequest", + "schema": { + "description": "User login details", + "examples": [ + { + "password": "hunter2", + "username": "myusername" + } + ], + "properties": { + "password": { + "description": "The password or personal access token (PAT) of the Docker Hub account to authenticate with.", + "example": "hunter2", + "type": "string" + }, + "username": { + "description": "The username of the Docker Hub account to authenticate with.", + "example": "myusername", + "type": "string" + } + }, + "required": [ + "username", + "password" + ], + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/UsersLoginRequest/" + }, + { + "name": "WeekData", + "pointer": "/components/schemas/WeekData", + "schema": { + "examples": [ + { + "weeks": [ + { + "week": 31 + }, + { + "week": 32 + } + ] + } + ], + "properties": { + "weeks": { + "items": { + "$ref": "#/components/schemas/WeekModel" + }, + "type": "array" + } + }, + "required": [ + "weeks" + ], + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/WeekData/" + }, + { + "name": "WeekModel", + "pointer": "/components/schemas/WeekModel", + "schema": { + "examples": [ + { + "week": 31 + } + ], + "properties": { + "week": { + "type": "integer" + } + }, + "required": [ + "week" + ], + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/WeekModel/" + }, + { + "name": "YearData", + "pointer": "/components/schemas/YearData", + "schema": { + "examples": [ + { + "years": [ + { + "year": 2025 + } + ] + } + ], + "properties": { + "years": { + "items": { + "$ref": "#/components/schemas/YearModel" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/YearData/" + }, + { + "name": "YearModel", + "pointer": "/components/schemas/YearModel", + "schema": { + "properties": { + "year": { + "type": "integer" + } + }, + "type": "object" + }, + "url": "/reference/api/dvp/latest/schemas/YearModel/" + } + ], + "securitySchemes": { + "HubAuth": { + "bearerFormat": "JWT", + "description": "JWT Bearer Authentication is required to access the Docker DVP Data API. \n \nThis authentication documentation is duplicated from the [Hub API Authentication docs](https://docs.docker.com/reference/api/hub/latest/#authentication)\n", + "scheme": "bearer", + "type": "http", + "x-displayName": "Docker Hub Authentication" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/api/publisher/analytics/v1" + } + ], + "source": "content/reference/api/dvp/latest.yaml", + "sourceURL": "/reference/api/dvp/latest.yaml", + "tags": [ + { + "description": "Authentication Endpoints reference.", + "kind": "nav", + "name": "authentication", + "summary": "Authentication Endpoints" + }, + { + "description": "Namespace data reference.", + "kind": "nav", + "name": "namespaces", + "summary": "Namespace data" + }, + { + "description": "Discovery reference.", + "kind": "nav", + "name": "discovery", + "summary": "Discovery" + }, + { + "description": "[ResponseDataFile](#schema-ResponseDataFile)\n", + "kind": "info", + "name": "responseDataFile", + "summary": "ResponseDataFile" + }, + { + "description": "[YearModel](#schema-YearModel)\n", + "kind": "info", + "name": "yearModel", + "summary": "Year Data Model" + }, + { + "description": "[MonthModel](#schema-MonthModel)\n", + "kind": "info", + "name": "monthModel", + "summary": "Month Data Model" + }, + { + "description": "[WeekModel](#schema-WeekModel)\n", + "kind": "info", + "name": "weekModel", + "summary": "Week Data Model" + } + ], + "title": "Publisher analytics", + "url": "/reference/api/dvp/latest/", + "version": "1.0.0" + }, + { + "connection": "hosted", + "description": "Docker Hub is an OCI-compliant registry, which means it adheres to the open\nstandards defined by the Open Container Initiative (OCI) for distributing\ncontainer images. This ensures compatibility with a wide range of tools and\nplatforms in the container ecosystem.\n\nThis reference documents the Docker Hub-supported subset of the Registry HTTP API V2.\nIt focuses on pulling, pushing, and deleting images. It does not cover the full OCI Distribution Specification.\n\nFor the complete OCI specification, see [OCI Distribution Specification](https://github.com/opencontainers/distribution-spec).\n", + "diagnostics": [], + "digest": "6676db9e3e34f6529e34a9a5574d4dfa1a20e534e42c2d5810a5fcf8b3dd7453", + "exampleCount": 79, + "experimental": false, + "guides": [ + "/reference/api/registry/auth.md" + ], + "id": "registry", + "manual": "/manuals/docker-hub/repos/", + "operations": [ + { + "acceptMedia": "", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/blobs/uploads/?mount=sha256%3Aabc123def456...\u0026from=library%2Fbusybox'", + "curlNotes": [], + "deprecated": null, + "description": "Initiate an upload session for a blob (layer or config) in a repository.\n\nThis is the first step in uploading a blob. It returns a `Location` URL where the blob can be uploaded using `PATCH` (chunked) or `PUT` (monolithic).\n\nInstead of uploading a blob, a client may attempt to mount a blob from another repository (if it has read access) by including the `mount` and `from` query parameters.\n\nIf successful, the registry responds with `201 Created` and the blob is reused without re-upload.\n\nIf the mount fails, the upload proceeds as usual and returns a `202 Accepted`.\n\nYou must authenticate with `push` access to the target repository.\n", + "id": "InitiateBlobUpload", + "line": 648, + "method": "POST", + "parameters": [ + { + "description": "Name of the target repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the blob to mount from another repository", + "example": "sha256:abc123def456...", + "in": "query", + "name": "mount", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post/parameters/1", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Source repository to mount the blob from", + "example": "library/busybox", + "in": "query", + "name": "from", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post/parameters/2", + "required": false, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/blobs/uploads/", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post", + "raw": { + "description": "Initiate an upload session for a blob (layer or config) in a repository.\n\nThis is the first step in uploading a blob. It returns a `Location` URL where the blob can be uploaded using `PATCH` (chunked) or `PUT` (monolithic).\n\nInstead of uploading a blob, a client may attempt to mount a blob from another repository (if it has read access) by including the `mount` and `from` query parameters.\n\nIf successful, the registry responds with `201 Created` and the blob is reused without re-upload.\n\nIf the mount fails, the upload proceeds as usual and returns a `202 Accepted`.\n\nYou must authenticate with `push` access to the target repository.\n", + "operationId": "InitiateBlobUpload", + "parameters": [ + { + "description": "Name of the target repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the blob to mount from another repository", + "example": "sha256:abc123def456...", + "in": "query", + "name": "mount", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Source repository to mount the blob from", + "example": "library/busybox", + "in": "query", + "name": "from", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "Blob successfully mounted from another repository.", + "headers": { + "Content-Length": { + "description": "Always zero", + "example": 0, + "schema": { + "type": "integer" + } + }, + "Docker-Content-Digest": { + "description": "Canonical digest of the mounted blob", + "example": "sha256:abc123...", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "URL where the mounted blob is accessible", + "example": "/v2/library/ubuntu/blobs/sha256:abc123...", + "schema": { + "type": "string" + } + } + } + }, + "202": { + "description": "Upload initiated successfully (fallback if mount fails).", + "headers": { + "Content-Length": { + "description": "Always zero", + "example": 0, + "schema": { + "type": "integer" + } + }, + "Docker-Upload-UUID": { + "description": "Server-generated UUID for the upload session", + "example": "abc123", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "Upload location URL for `PATCH` or `PUT` requests", + "example": "/v2/library/ubuntu/blobs/uploads/abc123", + "schema": { + "type": "string" + } + }, + "Range": { + "description": "Current upload byte range (typically `0-0` at init)", + "example": "0-0", + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Authentication required." + }, + "403": { + "description": "Access denied." + }, + "404": { + "description": "Repository not found." + }, + "429": { + "description": "Too many requests." + } + }, + "summary": "Initiate blob upload or attempt cross-repository blob mount", + "tags": [ + "Blobs" + ], + "x-codeSamples": [ + { + "label": "cURL (Initiate Standard Upload)", + "lang": "Bash", + "source": "# Initiate a standard blob upload session\ncurl -i -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/\n" + }, + { + "label": "cURL (Cross-Repository Blob Mount)", + "lang": "Bash", + "source": "# Attempt a cross-repository blob mount\ncurl -i -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n \"https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/?mount=sha256:abc123def456...\u0026from=library/busybox\"\n" + } + ] + }, + "references": [], + "requestSchema": null, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Initiate blob upload or attempt cross-repository blob mount", + "tags": [ + "Blobs" + ], + "url": "/reference/api/registry/latest/operations/InitiateBlobUpload/", + "variants": [ + { + "description": "Blob successfully mounted from another repository.", + "direction": "Response", + "examples": [], + "headers": { + "Content-Length": { + "description": "Always zero", + "example": 0, + "schema": { + "type": "integer" + } + }, + "Docker-Content-Digest": { + "description": "Canonical digest of the mounted blob", + "example": "sha256:abc123...", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "URL where the mounted blob is accessible", + "example": "/v2/library/ubuntu/blobs/sha256:abc123...", + "schema": { + "type": "string" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post/responses/201", + "status": "201" + }, + { + "description": "Upload initiated successfully (fallback if mount fails).", + "direction": "Response", + "examples": [], + "headers": { + "Content-Length": { + "description": "Always zero", + "example": 0, + "schema": { + "type": "integer" + } + }, + "Docker-Upload-UUID": { + "description": "Server-generated UUID for the upload session", + "example": "abc123", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "Upload location URL for `PATCH` or `PUT` requests", + "example": "/v2/library/ubuntu/blobs/uploads/abc123", + "schema": { + "type": "string" + } + }, + "Range": { + "description": "Current upload byte range (typically `0-0` at init)", + "example": "0-0", + "schema": { + "type": "string" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post/responses/202", + "status": "202" + }, + { + "description": "Authentication required.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post/responses/401", + "status": "401" + }, + { + "description": "Access denied.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post/responses/403", + "status": "403" + }, + { + "description": "Repository not found.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post/responses/404", + "status": "404" + }, + { + "description": "Too many requests.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1/post/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/blobs/uploads/abc123'", + "curlNotes": [], + "deprecated": null, + "description": "Retrieve the current status of an in-progress blob upload.\n\nThis is useful for:\n- Resuming an interrupted upload\n- Determining how many bytes have been accepted so far\n- Retrying from the correct offset in chunked uploads\n\nThe response includes the `Range` header indicating the byte range received so far, and a `Docker-Upload-UUID` for identifying the session.\n", + "id": "GetBlobUploadStatus", + "line": 898, + "method": "GET", + "parameters": [ + { + "description": "Repository Name", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Upload session UUID", + "example": "abc123", + "in": "path", + "name": "uuid", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/get/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/blobs/uploads/{uuid}", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/get", + "raw": { + "description": "Retrieve the current status of an in-progress blob upload.\n\nThis is useful for:\n- Resuming an interrupted upload\n- Determining how many bytes have been accepted so far\n- Retrying from the correct offset in chunked uploads\n\nThe response includes the `Range` header indicating the byte range received so far, and a `Docker-Upload-UUID` for identifying the session.\n", + "operationId": "GetBlobUploadStatus", + "parameters": [ + { + "description": "Repository Name", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Upload session UUID", + "example": "abc123", + "in": "path", + "name": "uuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Upload in progress. No body is returned.", + "headers": { + "Docker-Upload-UUID": { + "description": "UUID of the upload session", + "example": "abc123", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "URL to continue or complete the upload", + "example": "/v2/library/ubuntu/blobs/uploads/abc123", + "schema": { + "type": "string" + } + }, + "Range": { + "description": "Current byte range uploaded (inclusive)", + "example": "0-16383", + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Access denied" + }, + "404": { + "description": "Upload session not found" + }, + "429": { + "description": "Too many requests" + } + }, + "summary": "Get blob upload status", + "tags": [ + "Blobs" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# GET upload status\ncurl --include --request GET \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/abc123\n" + } + ] + }, + "references": [], + "requestSchema": null, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Get blob upload status", + "tags": [ + "Blobs" + ], + "url": "/reference/api/registry/latest/operations/GetBlobUploadStatus/", + "variants": [ + { + "description": "Upload in progress. No body is returned.", + "direction": "Response", + "examples": [], + "headers": { + "Docker-Upload-UUID": { + "description": "UUID of the upload session", + "example": "abc123", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "URL to continue or complete the upload", + "example": "/v2/library/ubuntu/blobs/uploads/abc123", + "schema": { + "type": "string" + } + }, + "Range": { + "description": "Current byte range uploaded (inclusive)", + "example": "0-16383", + "schema": { + "type": "string" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/get/responses/204", + "status": "204" + }, + { + "description": "Authentication required", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/get/responses/401", + "status": "401" + }, + { + "description": "Access denied", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/get/responses/403", + "status": "403" + }, + { + "description": "Upload session not found", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/get/responses/404", + "status": "404" + }, + { + "description": "Too many requests", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/get/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request PUT \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n --header 'Content-Type: application/octet-stream' \\\n --data-binary @request-body \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/blobs/uploads/abc123?digest=sha256%3Aabcd1234...'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "Complete the upload of a blob by finalizing an upload session.\n\nThis request must include the `digest` query parameter and optionally the last chunk of data. When the registry receives this request, it verifies the digest and stores the blob.\n\nThis endpoint supports:\n- Monolithic uploads (upload entire blob in this request)\n- Finalizing chunked uploads (last chunk plus `digest`)\n", + "id": "CompleteBlobUpload", + "line": 962, + "method": "PUT", + "parameters": [ + { + "description": "Repository name", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Upload session UUID returned from the POST request", + "example": "abc123", + "in": "path", + "name": "uuid", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the uploaded blob", + "example": "sha256:abcd1234...", + "in": "query", + "name": "digest", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/parameters/2", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/blobs/uploads/{uuid}", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put", + "raw": { + "description": "Complete the upload of a blob by finalizing an upload session.\n\nThis request must include the `digest` query parameter and optionally the last chunk of data. When the registry receives this request, it verifies the digest and stores the blob.\n\nThis endpoint supports:\n- Monolithic uploads (upload entire blob in this request)\n- Finalizing chunked uploads (last chunk plus `digest`)\n", + "operationId": "CompleteBlobUpload", + "parameters": [ + { + "description": "Repository name", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Upload session UUID returned from the POST request", + "example": "abc123", + "in": "path", + "name": "uuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the uploaded blob", + "example": "sha256:abcd1234...", + "in": "query", + "name": "digest", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "examples": { + "layer-upload": { + "summary": "Layer tarball blob", + "value": "\u003cbinary data not shown\u003e" + } + }, + "schema": { + "format": "binary", + "type": "string" + } + } + }, + "required": false + }, + "responses": { + "201": { + "description": "Upload completed successfully", + "headers": { + "Content-Length": { + "description": "Always zero for completed uploads", + "example": 0, + "schema": { + "type": "integer" + } + }, + "Docker-Content-Digest": { + "description": "Canonical digest of the stored blob", + "example": "sha256:abcd1234...", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "URL where the blob is now accessible", + "example": "/v2/library/ubuntu/blobs/sha256:abcd1234...", + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Invalid digest or missing parameters" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Access denied" + }, + "404": { + "description": "Upload session not found" + }, + "416": { + "description": "Requested range not satisfiable (if used in chunked mode)" + }, + "429": { + "description": "Too many requests" + } + }, + "summary": "Complete blob upload", + "tags": [ + "Blobs" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# PUT – complete upload (monolithic or final chunk)\ncurl -X PUT \\\n -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Content-Type: application/octet-stream\" \\\n --data-binary @layer.tar.gz \\\n \"https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/abc123?digest=sha256:abcd1234...\"\n" + } + ] + }, + "references": [], + "requestSchema": { + "format": "binary", + "type": "string" + }, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Complete blob upload", + "tags": [ + "Blobs" + ], + "url": "/reference/api/registry/latest/operations/CompleteBlobUpload/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "text", + "name": "layer-upload", + "text": "\u003cbinary data not shown\u003e", + "value": "\u003cbinary data not shown\u003e" + } + ], + "headers": null, + "media": "application/octet-stream", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/requestBody/content/application~1octet-stream", + "required": false, + "schema": { + "format": "binary", + "type": "string" + }, + "status": "" + }, + { + "description": "Upload completed successfully", + "direction": "Response", + "examples": [], + "headers": { + "Content-Length": { + "description": "Always zero for completed uploads", + "example": 0, + "schema": { + "type": "integer" + } + }, + "Docker-Content-Digest": { + "description": "Canonical digest of the stored blob", + "example": "sha256:abcd1234...", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "URL where the blob is now accessible", + "example": "/v2/library/ubuntu/blobs/sha256:abcd1234...", + "schema": { + "type": "string" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/responses/201", + "status": "201" + }, + { + "description": "Invalid digest or missing parameters", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/responses/400", + "status": "400" + }, + { + "description": "Authentication required", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/responses/401", + "status": "401" + }, + { + "description": "Access denied", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/responses/403", + "status": "403" + }, + { + "description": "Upload session not found", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/responses/404", + "status": "404" + }, + { + "description": "Requested range not satisfiable (if used in chunked mode)", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/responses/416", + "status": "416" + }, + { + "description": "Too many requests", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/put/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/blobs/uploads/abc123'", + "curlNotes": [], + "deprecated": null, + "description": "Cancel an in-progress blob upload session.\n\nThis operation discards any data that has been uploaded and invalidates the upload session.\n\nUse this when:\n- An upload fails or is aborted mid-process\n- The client wants to clean up unused upload sessions\n\nAfter cancellation, the UUID is no longer valid and a new `POST` must be issued to restart the upload.\n", + "id": "CancelBlobUpload", + "line": 1139, + "method": "DELETE", + "parameters": [ + { + "description": "Name of the repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/delete/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Upload session UUID", + "example": "abc123", + "in": "path", + "name": "uuid", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/delete/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/blobs/uploads/{uuid}", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/delete", + "raw": { + "description": "Cancel an in-progress blob upload session.\n\nThis operation discards any data that has been uploaded and invalidates the upload session.\n\nUse this when:\n- An upload fails or is aborted mid-process\n- The client wants to clean up unused upload sessions\n\nAfter cancellation, the UUID is no longer valid and a new `POST` must be issued to restart the upload.\n", + "operationId": "CancelBlobUpload", + "parameters": [ + { + "description": "Name of the repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Upload session UUID", + "example": "abc123", + "in": "path", + "name": "uuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Upload session cancelled successfully. No body is returned.", + "headers": { + "Content-Length": { + "description": "Always zero", + "example": 0, + "schema": { + "type": "integer" + } + } + } + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Access denied" + }, + "404": { + "description": "Upload session not found" + }, + "429": { + "description": "Too many requests" + } + }, + "summary": "Cancel blob upload", + "tags": [ + "Blobs" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# DELETE – cancel an upload session\ncurl -X DELETE \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/abc123`\n" + } + ] + }, + "references": [], + "requestSchema": null, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Cancel blob upload", + "tags": [ + "Blobs" + ], + "url": "/reference/api/registry/latest/operations/CancelBlobUpload/", + "variants": [ + { + "description": "Upload session cancelled successfully. No body is returned.", + "direction": "Response", + "examples": [], + "headers": { + "Content-Length": { + "description": "Always zero", + "example": 0, + "schema": { + "type": "integer" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/delete/responses/204", + "status": "204" + }, + { + "description": "Authentication required", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/delete/responses/401", + "status": "401" + }, + { + "description": "Access denied", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/delete/responses/403", + "status": "403" + }, + { + "description": "Upload session not found", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/delete/responses/404", + "status": "404" + }, + { + "description": "Too many requests", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/delete/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request PATCH \\\n --header 'Content-Range: bytes 0-65535' \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n --header 'Content-Type: application/octet-stream' \\\n --data-binary @request-body \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/blobs/uploads/abc123'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "Upload a chunk of a blob to an active upload session.\n\nUse this method for **chunked uploads**, especially for large blobs or when resuming interrupted uploads.\n\nThe client sends binary data using `PATCH`, optionally including a `Content-Range` header.\n\nAfter each chunk is accepted, the registry returns a `202 Accepted` response with:\n- `Range`: current byte range stored\n- `Docker-Upload-UUID`: identifier for the upload session\n- `Location`: URL to continue the upload or finalize with `PUT`\n", + "id": "UploadBlobChunk", + "line": 1049, + "method": "PATCH", + "parameters": [ + { + "description": "Repository name", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Upload session UUID", + "example": "abc123", + "in": "path", + "name": "uuid", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Optional. Byte range of the chunk being sent", + "example": "bytes 0-65535", + "in": "header", + "name": "Content-Range", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/parameters/2", + "required": false, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/blobs/uploads/{uuid}", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch", + "raw": { + "description": "Upload a chunk of a blob to an active upload session.\n\nUse this method for **chunked uploads**, especially for large blobs or when resuming interrupted uploads.\n\nThe client sends binary data using `PATCH`, optionally including a `Content-Range` header.\n\nAfter each chunk is accepted, the registry returns a `202 Accepted` response with:\n- `Range`: current byte range stored\n- `Docker-Upload-UUID`: identifier for the upload session\n- `Location`: URL to continue the upload or finalize with `PUT`\n", + "operationId": "UploadBlobChunk", + "parameters": [ + { + "description": "Repository name", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Upload session UUID", + "example": "abc123", + "in": "path", + "name": "uuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Optional. Byte range of the chunk being sent", + "example": "bytes 0-65535", + "in": "header", + "name": "Content-Range", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "examples": { + "chunk-0": { + "summary": "Upload chunk 0 of a blob", + "value": "\u003cbinary data not shown\u003e" + } + }, + "schema": { + "format": "binary", + "type": "string" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Chunk accepted and stored", + "headers": { + "Docker-Upload-UUID": { + "description": "Upload session UUID", + "example": "abc123", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "URL to continue or finalize the upload", + "example": "/v2/library/ubuntu/blobs/uploads/abc123", + "schema": { + "type": "string" + } + }, + "Range": { + "description": "Byte range uploaded so far (inclusive)", + "example": "0-65535", + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Malformed content or range" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Access denied" + }, + "404": { + "description": "Upload session not found" + }, + "416": { + "description": "Range error (e.g., chunk out of order)" + }, + "429": { + "description": "Too many requests" + } + }, + "summary": "Upload blob chunk", + "tags": [ + "Blobs" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# PATCH – upload a chunk (first 64 KiB)\ncurl -X PATCH \\\n -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Content-Type: application/octet-stream\" \\\n --data-binary @chunk-0.bin \\\n \"https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/abc123\"\n" + } + ] + }, + "references": [], + "requestSchema": { + "format": "binary", + "type": "string" + }, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Upload blob chunk", + "tags": [ + "Blobs" + ], + "url": "/reference/api/registry/latest/operations/UploadBlobChunk/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "text", + "name": "chunk-0", + "text": "\u003cbinary data not shown\u003e", + "value": "\u003cbinary data not shown\u003e" + } + ], + "headers": null, + "media": "application/octet-stream", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/requestBody/content/application~1octet-stream", + "required": true, + "schema": { + "format": "binary", + "type": "string" + }, + "status": "" + }, + { + "description": "Chunk accepted and stored", + "direction": "Response", + "examples": [], + "headers": { + "Docker-Upload-UUID": { + "description": "Upload session UUID", + "example": "abc123", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "URL to continue or finalize the upload", + "example": "/v2/library/ubuntu/blobs/uploads/abc123", + "schema": { + "type": "string" + } + }, + "Range": { + "description": "Byte range uploaded so far (inclusive)", + "example": "0-65535", + "schema": { + "type": "string" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/responses/202", + "status": "202" + }, + { + "description": "Malformed content or range", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/responses/400", + "status": "400" + }, + { + "description": "Authentication required", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/responses/401", + "status": "401" + }, + { + "description": "Access denied", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/responses/403", + "status": "403" + }, + { + "description": "Upload session not found", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/responses/404", + "status": "404" + }, + { + "description": "Range error (e.g., chunk out of order)", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/responses/416", + "status": "416" + }, + { + "description": "Too many requests", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1uploads~1{uuid}/patch/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "application/octet-stream", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n --header 'Accept: application/octet-stream' \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/blobs/sha256:abc123def456...'", + "curlNotes": [], + "deprecated": null, + "description": "Download the blob identified by digest from the registry.\n\nBlobs include image layers and configuration objects. Clients must use the digest from the manifest to retrieve a blob.\n\nThis endpoint may return a `307 Temporary Redirect` to a CDN or storage location. Clients must follow the redirect to obtain the actual blob content.\n\nThe blob content is typically a gzipped tarball (for layers) or JSON (for configs). The MIME type is usually `application/octet-stream`.\n", + "id": "GetBlob", + "line": 816, + "method": "GET", + "parameters": [ + { + "description": "Repository Name", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the Blob", + "example": "sha256:abc123def456...", + "in": "path", + "name": "digest", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/get/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/blobs/{digest}", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/get", + "raw": { + "description": "Download the blob identified by digest from the registry.\n\nBlobs include image layers and configuration objects. Clients must use the digest from the manifest to retrieve a blob.\n\nThis endpoint may return a `307 Temporary Redirect` to a CDN or storage location. Clients must follow the redirect to obtain the actual blob content.\n\nThe blob content is typically a gzipped tarball (for layers) or JSON (for configs). The MIME type is usually `application/octet-stream`.\n", + "operationId": "GetBlob", + "parameters": [ + { + "description": "Repository Name", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the Blob", + "example": "sha256:abc123def456...", + "in": "path", + "name": "digest", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/octet-stream": { + "examples": { + "small-layer": { + "summary": "Example binary blob (gzipped tar layer)", + "value": "\u003cbinary data not shown\u003e" + } + }, + "schema": { + "format": "binary", + "type": "string" + } + } + }, + "description": "Blob content returned directly", + "headers": { + "Content-Length": { + "description": "Size of the blob in bytes", + "example": 32768, + "schema": { + "type": "integer" + } + }, + "Content-Type": { + "description": "MIME type of the blob", + "example": "application/octet-stream", + "schema": { + "type": "string" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the returned blob", + "example": "sha256:abc123def456...", + "schema": { + "type": "string" + } + } + } + }, + "307": { + "description": "Temporary redirect to blob location", + "headers": { + "Location": { + "description": "Redirect URL for blob download (e.g., S3 or CDN)", + "example": "https://cdn.docker.io/blobs/library/ubuntu/abc123...", + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Access denied" + }, + "404": { + "description": "Blob not found" + }, + "429": { + "description": "Too many requests" + } + }, + "summary": "Retrieve blob", + "tags": [ + "Blobs" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# GET (download) a blob\ncurl -L \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/library/ubuntu/blobs/sha256:abc123... \\\n -o layer.tar.gz\n" + } + ] + }, + "references": [], + "requestSchema": null, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Retrieve blob", + "tags": [ + "Blobs" + ], + "url": "/reference/api/registry/latest/operations/GetBlob/", + "variants": [ + { + "description": "Blob content returned directly", + "direction": "Response", + "examples": [ + { + "language": "text", + "name": "small-layer", + "text": "\u003cbinary data not shown\u003e", + "value": "\u003cbinary data not shown\u003e" + } + ], + "headers": { + "Content-Length": { + "description": "Size of the blob in bytes", + "example": 32768, + "schema": { + "type": "integer" + } + }, + "Content-Type": { + "description": "MIME type of the blob", + "example": "application/octet-stream", + "schema": { + "type": "string" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the returned blob", + "example": "sha256:abc123def456...", + "schema": { + "type": "string" + } + } + }, + "media": "application/octet-stream", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/get/responses/200/content/application~1octet-stream", + "required": null, + "schema": { + "format": "binary", + "type": "string" + }, + "status": "200" + }, + { + "description": "Temporary redirect to blob location", + "direction": "Response", + "examples": [], + "headers": { + "Location": { + "description": "Redirect URL for blob download (e.g., S3 or CDN)", + "example": "https://cdn.docker.io/blobs/library/ubuntu/abc123...", + "schema": { + "type": "string" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/get/responses/307", + "status": "307" + }, + { + "description": "Authentication required", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/get/responses/401", + "status": "401" + }, + { + "description": "Access denied", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/get/responses/403", + "status": "403" + }, + { + "description": "Blob not found", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/get/responses/404", + "status": "404" + }, + { + "description": "Too many requests", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/get/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "application/octet-stream", + "curl": "curl \\\n --head \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n --header 'Accept: application/octet-stream' \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/blobs/sha256:abc123def4567890...'", + "curlNotes": [], + "deprecated": null, + "description": "Check whether a blob (layer or config) exists in the registry.\n\nThis is useful before uploading a blob to avoid duplicates.\n\nIf the blob is present, the registry returns a `200 OK` response with headers like `Content-Length` and `Docker-Content-Digest`.\n\nIf the blob does not exist, the response will be `404 Not Found`.\n", + "id": "CheckBlobExists", + "line": 753, + "method": "HEAD", + "parameters": [ + { + "description": "Name of the Repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/head/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the blob", + "example": "sha256:abc123def4567890...", + "in": "path", + "name": "digest", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/head/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/blobs/{digest}", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/head", + "raw": { + "description": "Check whether a blob (layer or config) exists in the registry.\n\nThis is useful before uploading a blob to avoid duplicates.\n\nIf the blob is present, the registry returns a `200 OK` response with headers like `Content-Length` and `Docker-Content-Digest`.\n\nIf the blob does not exist, the response will be `404 Not Found`.\n", + "operationId": "CheckBlobExists", + "parameters": [ + { + "description": "Name of the Repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the blob", + "example": "sha256:abc123def4567890...", + "in": "path", + "name": "digest", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Blob exists", + "headers": { + "Content-Length": { + "description": "Size of the blob in bytes", + "example": 32654, + "schema": { + "type": "integer" + } + }, + "Content-Type": { + "description": "MIME type of the blob content", + "example": "application/octet-stream", + "schema": { + "type": "string" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the blob", + "example": "sha256:abc123def4567890...", + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Access denied" + }, + "404": { + "description": "Blob not found" + }, + "429": { + "description": "Too many requests" + } + }, + "summary": "Check existence of blob", + "tags": [ + "Blobs" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# HEAD to check if a blob exists\ncurl -I \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/library/ubuntu/blobs/sha256:abc123...\n" + } + ] + }, + "references": [], + "requestSchema": null, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Check existence of blob", + "tags": [ + "Blobs" + ], + "url": "/reference/api/registry/latest/operations/CheckBlobExists/", + "variants": [ + { + "description": "Blob exists", + "direction": "Response", + "examples": [], + "headers": { + "Content-Length": { + "description": "Size of the blob in bytes", + "example": 32654, + "schema": { + "type": "integer" + } + }, + "Content-Type": { + "description": "MIME type of the blob content", + "example": "application/octet-stream", + "schema": { + "type": "string" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the blob", + "example": "sha256:abc123def4567890...", + "schema": { + "type": "string" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/head/responses/200", + "status": "200" + }, + { + "description": "Authentication required", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/head/responses/401", + "status": "401" + }, + { + "description": "Access denied", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/head/responses/403", + "status": "403" + }, + { + "description": "Blob not found", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/head/responses/404", + "status": "404" + }, + { + "description": "Too many requests", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1blobs~1{digest}/head/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "application/vnd.docker.distribution.manifest.v2+json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n --header 'Accept: application/vnd.docker.distribution.manifest.v2+json' \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/manifests/\u003cREFERENCE\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Fetch the manifest identified by `name` and `reference`, where `reference` can be a tag (e.g., `latest`) or a digest (e.g., `sha256:...`).\n\nThe manifest contains metadata about the image, including configuration and layer digests. It is required for pulling images from the registry.\n\nThis endpoint requires authentication. Use the `Authorization: Bearer \u003ctoken\u003e` header.\n\nUse the `Accept` header to select the manifest representation. Supported media types:\n\n- `application/vnd.docker.distribution.manifest.v2+json`\n- `application/vnd.docker.distribution.manifest.list.v2+json`\n- `application/vnd.oci.image.manifest.v1+json`\n- `application/vnd.oci.image.index.v1+json`\n", + "id": "GetImageManifest", + "line": 248, + "method": "GET", + "parameters": [ + { + "description": "Name of the target repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Tag or digest of the target manifest", + "examples": { + "by-digest": { + "summary": "Digest", + "value": "sha256:abc123def456..." + }, + "by-tag": { + "summary": "Tag", + "value": "latest" + } + }, + "in": "path", + "name": "reference", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/get/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/manifests/{reference}", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/get", + "raw": { + "description": "Fetch the manifest identified by `name` and `reference`, where `reference` can be a tag (e.g., `latest`) or a digest (e.g., `sha256:...`).\n\nThe manifest contains metadata about the image, including configuration and layer digests. It is required for pulling images from the registry.\n\nThis endpoint requires authentication. Use the `Authorization: Bearer \u003ctoken\u003e` header.\n\nUse the `Accept` header to select the manifest representation. Supported media types:\n\n- `application/vnd.docker.distribution.manifest.v2+json`\n- `application/vnd.docker.distribution.manifest.list.v2+json`\n- `application/vnd.oci.image.manifest.v1+json`\n- `application/vnd.oci.image.index.v1+json`\n", + "operationId": "GetImageManifest", + "parameters": [ + { + "description": "Name of the target repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Tag or digest of the target manifest", + "examples": { + "by-digest": { + "summary": "Digest", + "value": "sha256:abc123def456..." + }, + "by-tag": { + "summary": "Tag", + "value": "latest" + } + }, + "in": "path", + "name": "reference", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/vnd.docker.distribution.manifest.v2+json": { + "examples": { + "docker-manifest": { + "summary": "Docker image manifest (schema v2)", + "value": { + "config": { + "digest": "sha256:123456abcdef...", + "mediaType": "application/vnd.docker.container.image.v1+json", + "size": 7023 + }, + "layers": [ + { + "digest": "sha256:abcdef123456...", + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 32654 + }, + { + "digest": "sha256:7890abcdef12...", + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 16724 + } + ], + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "schemaVersion": 2 + } + } + }, + "schema": { + "properties": { + "config": { + "properties": { + "digest": { + "example": "sha256:a3f3e...c1234", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.container.image.v1+json", + "type": "string" + }, + "size": { + "example": 7023, + "type": "integer" + } + }, + "type": "object" + }, + "layers": { + "items": { + "properties": { + "digest": { + "example": "sha256:bcf2...78901", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "type": "string" + }, + "size": { + "example": 32654, + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + "mediaType": { + "example": "application/vnd.docker.distribution.manifest.v2+json", + "type": "string" + }, + "schemaVersion": { + "example": 2, + "type": "integer" + } + }, + "required": [ + "schemaVersion", + "mediaType", + "config", + "layers" + ], + "type": "object" + } + } + }, + "description": "Manifest fetched successfully.", + "headers": { + "Content-Type": { + "description": "Media type of the returned manifest.", + "schema": { + "type": "string" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the returned manifest content.", + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Invalid name or reference." + }, + "401": { + "description": "Authentication required." + }, + "403": { + "description": "Access denied." + }, + "404": { + "description": "Repository or manifest not found." + }, + "429": { + "description": "Too many requests." + } + }, + "summary": "Get image manifest", + "tags": [ + "Manifests" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# GET a manifest (by tag or digest)\ncurl -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Accept: application/vnd.docker.distribution.manifest.v2+json\" \\\n https://registry-1.docker.io/v2/library/ubuntu/manifests/latest\n" + } + ], + "x-displayName": "Manifests" + }, + "references": [], + "requestSchema": null, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Get image manifest", + "tags": [ + "Manifests" + ], + "url": "/reference/api/registry/latest/operations/GetImageManifest/", + "variants": [ + { + "description": "Manifest fetched successfully.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "docker-manifest", + "text": "{\n \"config\": {\n \"digest\": \"sha256:123456abcdef...\",\n \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n \"size\": 7023\n },\n \"layers\": [\n {\n \"digest\": \"sha256:abcdef123456...\",\n \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n \"size\": 32654\n },\n {\n \"digest\": \"sha256:7890abcdef12...\",\n \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n \"size\": 16724\n }\n ],\n \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n \"schemaVersion\": 2\n}", + "value": { + "config": { + "digest": "sha256:123456abcdef...", + "mediaType": "application/vnd.docker.container.image.v1+json", + "size": 7023 + }, + "layers": [ + { + "digest": "sha256:abcdef123456...", + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 32654 + }, + { + "digest": "sha256:7890abcdef12...", + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 16724 + } + ], + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "schemaVersion": 2 + } + } + ], + "headers": { + "Content-Type": { + "description": "Media type of the returned manifest.", + "schema": { + "type": "string" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the returned manifest content.", + "schema": { + "type": "string" + } + } + }, + "media": "application/vnd.docker.distribution.manifest.v2+json", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/get/responses/200/content/application~1vnd.docker.distribution.manifest.v2+json", + "required": null, + "schema": { + "properties": { + "config": { + "properties": { + "digest": { + "example": "sha256:a3f3e...c1234", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.container.image.v1+json", + "type": "string" + }, + "size": { + "example": 7023, + "type": "integer" + } + }, + "type": "object" + }, + "layers": { + "items": { + "properties": { + "digest": { + "example": "sha256:bcf2...78901", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "type": "string" + }, + "size": { + "example": 32654, + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + "mediaType": { + "example": "application/vnd.docker.distribution.manifest.v2+json", + "type": "string" + }, + "schemaVersion": { + "example": 2, + "type": "integer" + } + }, + "required": [ + "schemaVersion", + "mediaType", + "config", + "layers" + ], + "type": "object" + }, + "status": "200" + }, + { + "description": "Invalid name or reference.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/get/responses/400", + "status": "400" + }, + { + "description": "Authentication required.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/get/responses/401", + "status": "401" + }, + { + "description": "Access denied.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/get/responses/403", + "status": "403" + }, + { + "description": "Repository or manifest not found.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/get/responses/404", + "status": "404" + }, + { + "description": "Too many requests.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/get/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request PUT \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n --header 'Content-Type: application/vnd.docker.distribution.manifest.v2+json' \\\n --data-raw '{\n \"config\": {\n \"digest\": \"sha256:123456abcdef...\",\n \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n \"size\": 7023\n },\n \"layers\": [\n {\n \"digest\": \"sha256:abcdef123456...\",\n \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n \"size\": 32654\n }\n ],\n \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n \"schemaVersion\": 2\n}' \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/manifests/\u003cREFERENCE\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Upload an image manifest for a given tag or digest. This operation registers a manifest in a repository, allowing it to be pulled using the specified reference.\n\nThis endpoint is typically used after all layer and config blobs have been uploaded to the registry.\n\nThe manifest must conform to the expected schema and media type. For Docker image manifest schema version 2, use:\n`application/vnd.docker.distribution.manifest.v2+json`\n\nRequires authentication via a bearer token with `push` scope for the target repository.\n", + "id": "PutImageManifest", + "line": 377, + "method": "PUT", + "parameters": [ + { + "description": "Name of the target Repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Tag or digest to associate with the uploaded Manifest", + "examples": { + "by-digest": { + "summary": "Digest", + "value": "sha256:abc123def456..." + }, + "by-tag": { + "summary": "Tag", + "value": "latest" + } + }, + "in": "path", + "name": "reference", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/manifests/{reference}", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put", + "raw": { + "description": "Upload an image manifest for a given tag or digest. This operation registers a manifest in a repository, allowing it to be pulled using the specified reference.\n\nThis endpoint is typically used after all layer and config blobs have been uploaded to the registry.\n\nThe manifest must conform to the expected schema and media type. For Docker image manifest schema version 2, use:\n`application/vnd.docker.distribution.manifest.v2+json`\n\nRequires authentication via a bearer token with `push` scope for the target repository.\n", + "operationId": "PutImageManifest", + "parameters": [ + { + "description": "Name of the target Repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Tag or digest to associate with the uploaded Manifest", + "examples": { + "by-digest": { + "summary": "Digest", + "value": "sha256:abc123def456..." + }, + "by-tag": { + "summary": "Tag", + "value": "latest" + } + }, + "in": "path", + "name": "reference", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/vnd.docker.distribution.manifest.v2+json": { + "examples": { + "sample-manifest": { + "summary": "Sample Docker image manifest (schema v2)", + "value": { + "config": { + "digest": "sha256:123456abcdef...", + "mediaType": "application/vnd.docker.container.image.v1+json", + "size": 7023 + }, + "layers": [ + { + "digest": "sha256:abcdef123456...", + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 32654 + } + ], + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "schemaVersion": 2 + } + } + }, + "schema": { + "properties": { + "config": { + "properties": { + "digest": { + "example": "sha256:123456abcdef...", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.container.image.v1+json", + "type": "string" + }, + "size": { + "example": 7023, + "type": "integer" + } + }, + "required": [ + "mediaType", + "size", + "digest" + ], + "type": "object" + }, + "layers": { + "items": { + "properties": { + "digest": { + "example": "sha256:abcdef123456...", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "type": "string" + }, + "size": { + "example": 32654, + "type": "integer" + } + }, + "required": [ + "mediaType", + "size", + "digest" + ], + "type": "object" + }, + "type": "array" + }, + "mediaType": { + "example": "application/vnd.docker.distribution.manifest.v2+json", + "type": "string" + }, + "schemaVersion": { + "example": 2, + "type": "integer" + } + }, + "required": [ + "schemaVersion", + "mediaType", + "config", + "layers" + ], + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Manifest created successfully.", + "headers": { + "Content-Length": { + "description": "Always zero.", + "example": 0, + "schema": { + "type": "integer" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the stored manifest.", + "example": "sha256:abcdef123456...", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "Canonical location of the uploaded manifest.", + "example": "/v2/library/ubuntu/manifests/latest", + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Invalid name, reference, or manifest." + }, + "401": { + "description": "Authentication required." + }, + "403": { + "description": "Access denied." + }, + "404": { + "description": "Repository not found." + }, + "405": { + "description": "Operation not allowed." + }, + "429": { + "description": "Too many requests." + } + }, + "summary": "Put image manifest", + "tags": [ + "Manifests" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# PUT a manifest (tag = latest)\ncurl -X PUT \\\n -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Content-Type: application/vnd.docker.distribution.manifest.v2+json\" \\\n --data-binary @manifest.json \\\n https://registry-1.docker.io/v2/library/ubuntu/manifests/latest\n" + } + ] + }, + "references": [], + "requestSchema": { + "properties": { + "config": { + "properties": { + "digest": { + "example": "sha256:123456abcdef...", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.container.image.v1+json", + "type": "string" + }, + "size": { + "example": 7023, + "type": "integer" + } + }, + "required": [ + "mediaType", + "size", + "digest" + ], + "type": "object" + }, + "layers": { + "items": { + "properties": { + "digest": { + "example": "sha256:abcdef123456...", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "type": "string" + }, + "size": { + "example": 32654, + "type": "integer" + } + }, + "required": [ + "mediaType", + "size", + "digest" + ], + "type": "object" + }, + "type": "array" + }, + "mediaType": { + "example": "application/vnd.docker.distribution.manifest.v2+json", + "type": "string" + }, + "schemaVersion": { + "example": 2, + "type": "integer" + } + }, + "required": [ + "schemaVersion", + "mediaType", + "config", + "layers" + ], + "type": "object" + }, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Put image manifest", + "tags": [ + "Manifests" + ], + "url": "/reference/api/registry/latest/operations/PutImageManifest/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "sample-manifest", + "text": "{\n \"config\": {\n \"digest\": \"sha256:123456abcdef...\",\n \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n \"size\": 7023\n },\n \"layers\": [\n {\n \"digest\": \"sha256:abcdef123456...\",\n \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n \"size\": 32654\n }\n ],\n \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n \"schemaVersion\": 2\n}", + "value": { + "config": { + "digest": "sha256:123456abcdef...", + "mediaType": "application/vnd.docker.container.image.v1+json", + "size": 7023 + }, + "layers": [ + { + "digest": "sha256:abcdef123456...", + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 32654 + } + ], + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "schemaVersion": 2 + } + } + ], + "headers": null, + "media": "application/vnd.docker.distribution.manifest.v2+json", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/requestBody/content/application~1vnd.docker.distribution.manifest.v2+json", + "required": true, + "schema": { + "properties": { + "config": { + "properties": { + "digest": { + "example": "sha256:123456abcdef...", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.container.image.v1+json", + "type": "string" + }, + "size": { + "example": 7023, + "type": "integer" + } + }, + "required": [ + "mediaType", + "size", + "digest" + ], + "type": "object" + }, + "layers": { + "items": { + "properties": { + "digest": { + "example": "sha256:abcdef123456...", + "type": "string" + }, + "mediaType": { + "example": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "type": "string" + }, + "size": { + "example": 32654, + "type": "integer" + } + }, + "required": [ + "mediaType", + "size", + "digest" + ], + "type": "object" + }, + "type": "array" + }, + "mediaType": { + "example": "application/vnd.docker.distribution.manifest.v2+json", + "type": "string" + }, + "schemaVersion": { + "example": 2, + "type": "integer" + } + }, + "required": [ + "schemaVersion", + "mediaType", + "config", + "layers" + ], + "type": "object" + }, + "status": "" + }, + { + "description": "Manifest created successfully.", + "direction": "Response", + "examples": [], + "headers": { + "Content-Length": { + "description": "Always zero.", + "example": 0, + "schema": { + "type": "integer" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the stored manifest.", + "example": "sha256:abcdef123456...", + "schema": { + "type": "string" + } + }, + "Location": { + "description": "Canonical location of the uploaded manifest.", + "example": "/v2/library/ubuntu/manifests/latest", + "schema": { + "type": "string" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/responses/201", + "status": "201" + }, + { + "description": "Invalid name, reference, or manifest.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/responses/400", + "status": "400" + }, + { + "description": "Authentication required.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/responses/401", + "status": "401" + }, + { + "description": "Access denied.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/responses/403", + "status": "403" + }, + { + "description": "Repository not found.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/responses/404", + "status": "404" + }, + { + "description": "Operation not allowed.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/responses/405", + "status": "405" + }, + { + "description": "Too many requests.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/put/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n 'https://registry-1.docker.io/v2/yourusername%2Fhelloworld/manifests/sha256:abc123def456...'", + "curlNotes": [], + "deprecated": null, + "description": "Delete an image manifest from a repository by digest.\n\nOnly untagged or unreferenced manifests can be deleted. If the manifest is still referenced by a tag or another image, the registry will return `403 Forbidden`.\n\nThis operation requires `delete` access to the repository.\n\n\u003e **Note**\n\u003e\n\u003e Manifest deletion operations may take some time and could return a `500 Internal Server Error`. The system automatically retries the deletion in the background. Manual intervention is not required.\n", + "id": "DeleteImageManifest", + "line": 596, + "method": "DELETE", + "parameters": [ + { + "description": "Name of the repository", + "example": "yourusername/helloworld", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/delete/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the manifest to delete (e.g., `sha256:...`)", + "example": "sha256:abc123def456...", + "in": "path", + "name": "reference", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/delete/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/manifests/{reference}", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/delete", + "raw": { + "description": "Delete an image manifest from a repository by digest.\n\nOnly untagged or unreferenced manifests can be deleted. If the manifest is still referenced by a tag or another image, the registry will return `403 Forbidden`.\n\nThis operation requires `delete` access to the repository.\n\n\u003e **Note**\n\u003e\n\u003e Manifest deletion operations may take some time and could return a `500 Internal Server Error`. The system automatically retries the deletion in the background. Manual intervention is not required.\n", + "operationId": "DeleteImageManifest", + "parameters": [ + { + "description": "Name of the repository", + "example": "yourusername/helloworld", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Digest of the manifest to delete (e.g., `sha256:...`)", + "example": "sha256:abc123def456...", + "in": "path", + "name": "reference", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "202": { + "description": "Manifest deleted successfully. No content returned." + }, + "401": { + "description": "Authentication required." + }, + "403": { + "description": "Access denied. The manifest may still be referenced." + }, + "404": { + "description": "Manifest or repository not found." + }, + "405": { + "description": "Only digest-based deletion is allowed." + }, + "429": { + "description": "Too many requests." + } + }, + "summary": "Delete image manifest", + "tags": [ + "Manifests" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# DELETE a manifest by digest\ncurl -X DELETE \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/yourusername/helloworld/manifests/sha256:abc123def456...\n" + } + ] + }, + "references": [], + "requestSchema": null, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Delete image manifest", + "tags": [ + "Manifests" + ], + "url": "/reference/api/registry/latest/operations/DeleteImageManifest/", + "variants": [ + { + "description": "Manifest deleted successfully. No content returned.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/delete/responses/202", + "status": "202" + }, + { + "description": "Authentication required.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/delete/responses/401", + "status": "401" + }, + { + "description": "Access denied. The manifest may still be referenced.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/delete/responses/403", + "status": "403" + }, + { + "description": "Manifest or repository not found.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/delete/responses/404", + "status": "404" + }, + { + "description": "Only digest-based deletion is allowed.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/delete/responses/405", + "status": "405" + }, + { + "description": "Too many requests.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/delete/responses/429", + "status": "429" + } + ] + }, + { + "acceptMedia": "application/vnd.docker.distribution.manifest.v2+json", + "curl": "curl \\\n --head \\\n --header \"Authorization: Bearer ${REGISTRY_TOKEN}\" \\\n --header 'Accept: application/vnd.docker.distribution.manifest.v2+json' \\\n 'https://registry-1.docker.io/v2/library%2Fubuntu/manifests/\u003cREFERENCE\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Use this endpoint to verify whether a manifest exists by tag or digest.\n\nThis is a lightweight operation that returns only headers (no body). It is useful for:\n- Checking for the existence of a specific image version\n- Determining the digest or size of a manifest before downloading or deleting\n\nThis endpoint requires authentication with pull scope.\n\nUse the `Accept` header to select the manifest representation. Supported media types:\n\n- `application/vnd.docker.distribution.manifest.v2+json`\n- `application/vnd.docker.distribution.manifest.list.v2+json`\n- `application/vnd.oci.image.manifest.v1+json`\n- `application/vnd.oci.image.index.v1+json`\n", + "id": "HeadImageManifest", + "line": 519, + "method": "HEAD", + "parameters": [ + { + "description": "Name of the Repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/head/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Tag or digest to check", + "examples": { + "by-digest": { + "summary": "Digest", + "value": "sha256:abc123def456..." + }, + "by-tag": { + "summary": "Tag", + "value": "latest" + } + }, + "in": "path", + "name": "reference", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/head/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v2/{name}/manifests/{reference}", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/head", + "raw": { + "description": "Use this endpoint to verify whether a manifest exists by tag or digest.\n\nThis is a lightweight operation that returns only headers (no body). It is useful for:\n- Checking for the existence of a specific image version\n- Determining the digest or size of a manifest before downloading or deleting\n\nThis endpoint requires authentication with pull scope.\n\nUse the `Accept` header to select the manifest representation. Supported media types:\n\n- `application/vnd.docker.distribution.manifest.v2+json`\n- `application/vnd.docker.distribution.manifest.list.v2+json`\n- `application/vnd.oci.image.manifest.v1+json`\n- `application/vnd.oci.image.index.v1+json`\n", + "operationId": "HeadImageManifest", + "parameters": [ + { + "description": "Name of the Repository", + "example": "library/ubuntu", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Tag or digest to check", + "examples": { + "by-digest": { + "summary": "Digest", + "value": "sha256:abc123def456..." + }, + "by-tag": { + "summary": "Tag", + "value": "latest" + } + }, + "in": "path", + "name": "reference", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Manifest exists.", + "headers": { + "Content-Length": { + "description": "Size of the manifest in bytes", + "example": 7082, + "schema": { + "type": "integer" + } + }, + "Content-Type": { + "description": "Media type of the manifest", + "example": "application/vnd.docker.distribution.manifest.v2+json", + "schema": { + "type": "string" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the manifest", + "example": "sha256:abc123...", + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Authentication required." + }, + "403": { + "description": "Access denied." + }, + "404": { + "description": "Manifest not found." + }, + "429": { + "description": "Too many requests." + } + }, + "summary": "Check if manifest exists", + "tags": [ + "Manifests" + ], + "x-codeSamples": [ + { + "label": "cURL", + "lang": "Bash", + "source": "# HEAD /v2/{name}/manifests/{reference}\ncurl -I \\\n -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Accept: application/vnd.docker.distribution.manifest.v2+json\" \\\n https://registry-1.docker.io/v2/library/ubuntu/manifests/latest\n" + } + ] + }, + "references": [], + "requestSchema": null, + "security": [ + { + "registryToken": [] + } + ], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "summary": "Check if manifest exists", + "tags": [ + "Manifests" + ], + "url": "/reference/api/registry/latest/operations/HeadImageManifest/", + "variants": [ + { + "description": "Manifest exists.", + "direction": "Response", + "examples": [], + "headers": { + "Content-Length": { + "description": "Size of the manifest in bytes", + "example": 7082, + "schema": { + "type": "integer" + } + }, + "Content-Type": { + "description": "Media type of the manifest", + "example": "application/vnd.docker.distribution.manifest.v2+json", + "schema": { + "type": "string" + } + }, + "Docker-Content-Digest": { + "description": "Digest of the manifest", + "example": "sha256:abc123...", + "schema": { + "type": "string" + } + } + }, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/head/responses/200", + "status": "200" + }, + { + "description": "Authentication required.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/head/responses/401", + "status": "401" + }, + { + "description": "Access denied.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/head/responses/403", + "status": "403" + }, + { + "description": "Manifest not found.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/head/responses/404", + "status": "404" + }, + { + "description": "Too many requests.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v2~1{name}~1manifests~1{reference}/head/responses/429", + "status": "429" + } + ] + } + ], + "owner": "docker/docs", + "product": "registry", + "schemaCount": 62, + "schemaURLs": {}, + "schemas": [], + "securitySchemes": { + "registryToken": { + "description": "Follow the WWW-Authenticate challenge and obtain a repository-scoped registry bearer token. Public image pulls can obtain a token without account credentials; the registry request still sends that token. This token exchange is separate from Hub API authentication.", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "description": "Docker Hub registry API", + "url": "https://registry-1.docker.io", + "x-audience": "public" + } + ], + "source": "content/reference/api/registry/latest.yaml", + "sourceURL": "/reference/api/registry/latest.yaml", + "tags": [ + { + "description": "All endpoints in this API are prefixed by the version and repository name, for example:\n\n```\n/v2/\u003cname\u003e/\n```\n\nThis format provides structured access control and URI-based scoping of image operations.\n\nFor example, to interact with the `library/ubuntu` repository, use:\n\n```\n/v2/library/ubuntu/\n```\n\nRepository names must meet these requirements:\n1. Consist of path components matching `[a-z0-9]+(?:[._-][a-z0-9]+)*`\n2. If more than one component, they must be separated by `/`\n3. Full repository name must be fewer than 256 characters\n", + "kind": "info", + "name": "overview", + "summary": "Overview" + }, + { + "description": "Specifies registry authentication.\n", + "externalDocs": { + "description": "Detailed authentication workflow and token usage", + "url": "https://docs.docker.com/reference/api/registry/auth/" + }, + "kind": "info", + "name": "authentication", + "summary": "Authentication" + }, + { + "description": "Image manifests are JSON documents that describe an image: its configuration blob, the digests of each layer blob, and metadata such as media‑types and annotations.\n", + "kind": "nav", + "name": "Manifests", + "summary": "Manifests" + }, + { + "description": "Blobs are the binary objects referenced from manifests:\nthe config JSON and one or more compressed layer tarballs.\n", + "kind": "nav", + "name": "Blobs", + "summary": "Blobs" + }, + { + "description": "Pulling an image involves retrieving the manifest and downloading each of the image's layer blobs. This section outlines the general steps followed by a working example.\n\n1. [Get a bearer token for the repository](https://docs.docker.com/reference/api/registry/auth/).\n2. [Get the image manifest](#operation/GetImageManifest).\n3. If the response in the previous step is a multi-architecture manifest list, you must do the following:\n - Parse the `manifests[]` array to locate the digest for your target platform (e.g., `linux/amd64`).\n - [Get the image manifest](#operation/GetImageManifest) using the located digest.\n4. [Check if the blob exists](#operation/CheckBlobExists) before downloading. The client should send a `HEAD` request for each layer digest.\n5. [Download each layer blob](#operation/GetBlob) using the digest obtained from the manifest. The client should send a `GET` request for each layer digest.\n\nThe following bash script example pulls `library/ubuntu:latest` from Docker Hub.\n\n```bash\n#!/bin/bash\n\n# Step 1: Get a bearer token\nTOKEN=$(curl -s \"https://auth.docker.io/token?service=registry.docker.io\u0026scope=repository:library/ubuntu:pull\" | jq -r .token)\n\n# Step 2: Get the image manifest. In this example, an image manifest list is returned.\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Accept: application/vnd.docker.distribution.manifest.list.v2+json\" \\\n https://registry-1.docker.io/v2/library/ubuntu/manifests/latest \\\n -o manifest-list.json\n\n# Step 3a: Parse the `manifests[]` array to locate the digest for your target platform (e.g., `linux/amd64`).\nIMAGE_MANIFEST_DIGEST=$(jq -r '.manifests[] | select(.platform.architecture == \"amd64\" and .platform.os == \"linux\") | .digest' manifest-list.json)\n\n# Step 3b: Get the platform-specific image manifest\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Accept: application/vnd.docker.distribution.manifest.v2+json\" \\\n https://registry-1.docker.io/v2/library/ubuntu/manifests/$IMAGE_MANIFEST_DIGEST \\\n -o manifest.json\n\n# Step 4: Send a HEAD request to check if the layer blob exists\nDIGEST=$(jq -r '.layers[0].digest' manifest.json)\ncurl -I -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/library/ubuntu/blobs/$DIGEST\n\n# Step 5: Download the layer blob\ncurl -L -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/library/ubuntu/blobs/$DIGEST\n```\n\nThis example pulls the manifest and the first layer for the `ubuntu:latest` image on the `linux/amd64` platform. Repeat steps 4 and 5 for each digest in the `.layers[]` array in the manifest.\n", + "kind": "info", + "name": "pull", + "summary": "Pulling Images" + }, + { + "description": "Pushing an image involves uploading any image blobs (such as the config or layers), and then uploading the manifest that references those blobs.\n\nThis section outlines the basic steps to push an image using the registry API.\n\n1. [Get a bearer token for the repository](https://docs.docker.com/reference/api/registry/auth/)\n\n2. [Check if the blob exists](#operation/CheckBlobExists) using a `HEAD` request for each blob digest.\n\n3. If the blob does not exist, [upload the blob](#operation/CompleteBlobUpload) using a monolithic `PUT` request:\n - First, [initiate the upload](#operation/InitiateBlobUpload) with `POST`.\n - Then [upload and complete](#operation/CompleteBlobUpload) with `PUT`.\n\n **Note**: Alternatively, you can upload the blob in multiple chunks by using `PATCH` requests to send each chunk, followed by a final `PUT` request to complete the upload. This is known as a [chunked upload](#operation/UploadBlobChunk) and is useful for large blobs or when resuming interrupted uploads.\n\n\n4. [Upload the image manifest](#operation/PutImageManifest) using a `PUT` request to associate the config and layers.\n\nThe following bash script example pushes a dummy config blob and manifest to `yourusername/helloworld:latest` on Docker Hub. You can replace `yourusername` with your Docker Hub username and `dckr_pat` with your Docker Hub personal access token.\n\n```bash\n#!/bin/bash\n\nUSERNAME=yourusername\nPASSWORD=dckr_pat\nREPO=yourusername/helloworld\nTAG=latest\nCONFIG=config.json\nMIME_TYPE=application/vnd.docker.container.image.v1+json\n\n# Step 1: Get a bearer token\nTOKEN=$(curl -s -u \"$USERNAME:$PASSWORD\" \\\n\"https://auth.docker.io/token?service=registry.docker.io\u0026scope=repository:$REPO:push,pull\" \\\n| jq -r .token)\n\n# Create a dummy config blob and compute its digest\necho '{\"architecture\":\"amd64\",\"os\":\"linux\",\"config\":{},\"rootfs\":{\"type\":\"layers\",\"diff_ids\":[]}}' \u003e $CONFIG\nDIGEST=\"sha256:$(sha256sum $CONFIG | awk '{print $1}')\"\n\n# Step 2: Check if the blob exists\nSTATUS=$(curl -s -o /dev/null -w \"%{http_code}\" -I \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/$REPO/blobs/$DIGEST)\n\nif [ \"$STATUS\" != \"200\" ]; then\n # Step 3: Upload blob using monolithic upload\n LOCATION=$(curl -sI -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/$REPO/blobs/uploads/ \\\n | grep -i Location | tr -d '\\r' | awk '{print $2}')\n\n curl -s -X PUT \"$LOCATION\u0026digest=$DIGEST\" \\\n -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Content-Type: application/octet-stream\" \\\n --data-binary @$CONFIG\nfi\n\n# Step 4: Upload the manifest that references the config blob\nMANIFEST=$(cat \u003c\u003cEOF\n{\n \"schemaVersion\": 2,\n \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n \"config\": {\n \"mediaType\": \"$MIME_TYPE\",\n \"size\": $(stat -c%s $CONFIG),\n \"digest\": \"$DIGEST\"\n },\n \"layers\": []\n}\nEOF\n)\n\ncurl -s -X PUT \\\n -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Content-Type: application/vnd.docker.distribution.manifest.v2+json\" \\\n -d \"$MANIFEST\" \\\n https://registry-1.docker.io/v2/$REPO/manifests/$TAG\n\necho \"Pushed image to $REPO:$TAG\"\n```\n\nThis example pushes a minimal image with no layers. To push a complete image, repeat steps 2–3 for each layer and include the layer digests in the `layers[]` field of the manifest.\n", + "kind": "info", + "name": "push", + "summary": "Pushing Images" + }, + { + "description": "Deleting an image involves removing its manifest by digest. You must first retrieve the manifest digest, then issue a `DELETE` request using that digest.\n\nOnly untagged manifests (or those not referenced by other tags or images) can be deleted. If a manifest is still referenced, the registry returns `403 Forbidden`.\n\n\u003e **Note**\n\u003e\n\u003e Manifest deletion operations may experience latency and could return a `500 Internal Server Error` during deletion. The system automatically retries the deletion in the background, so the manifest will eventually be removed. You do not need to manually retry the request.\n\nThis section outlines the basic steps to delete an image using the registry API.\n\n1. [Get a bearer token for the repository](https://docs.docker.com/reference/api/registry/auth/).\n2. [Get the manifest](#operation/GetImageManifest) using the image's tag.\n3. Retrieve the `Docker-Content-Digest` header from the manifest response. This digest uniquely identifies the manifest.\n4. [Delete the manifest](#operation/DeleteImageManifest) using a `DELETE` request and the digest.\n\nThe following bash script example deletes the `latest` tag from `yourusername/helloworld` on Docker Hub. Replace `yourusername` with your Docker Hub username and `dckr_pat` with your Docker Hub personal access token.\n\n```bash\n#!/bin/bash\n\nUSERNAME=yourusername\nPASSWORD=dckr_pat\nREPO=yourusername/helloworld\nTAG=latest\n\n# Step 1: Get a bearer token\nTOKEN=$(curl -s -u \"$USERNAME:$PASSWORD\" \\\n \"https://auth.docker.io/token?service=registry.docker.io\u0026scope=repository:$REPO:pull,push,delete\" \\\n | jq -r .token)\n\n# Step 2 and 3: Get the manifest and extract the digest from response headers\nDIGEST=$(curl -sI -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Accept: application/vnd.docker.distribution.manifest.v2+json\" \\\n https://registry-1.docker.io/v2/$REPO/manifests/$TAG \\\n | grep -i Docker-Content-Digest | tr -d '\\r' | awk '{print $2}')\n\necho \"Deleting manifest with digest: $DIGEST\"\n\n# Step 4: Delete the manifest by digest\ncurl -s -X DELETE \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://registry-1.docker.io/v2/$REPO/manifests/$DIGEST\n\necho \"Deleted image: $REPO@$DIGEST\"\n```\n\nThis example deletes the manifest for the `latest` tag. To fully delete all references to an image, ensure no other tags or referrers point to the same manifest digest.\n", + "kind": "info", + "name": "delete", + "summary": "Deleting Images" + } + ], + "title": "Registry", + "url": "/reference/api/registry/latest/", + "version": "2" + }, + { + "connection": "hosted", + "description": "HTTP+JSON API for managing Docker governance policies and rules.\n\n**Resource model.** An organization owns one or more policies. Each policy\ncontains a list of rules grouped into a single domain: either `network` or\n`filesystem`. A policy's domain is derived from its rule actions; mixing\ndomains within a single policy is not permitted.\n\n**Lifecycle.** Create a policy with CreatePolicy, then add rules with\nCreateRule. Rules can be updated in place with UpdateRule or removed with\nDeleteRule. Deleting all rules does not delete the policy itself.\n\n**Rule evaluation.** All rules in a policy are tested against every request.\n`deny` always wins: if any rule matches with `decision: deny`, the request\nis denied regardless of any `allow` rules.\n\n**Enforcement.** Organization policies take precedence over local sandbox\npolicies and cannot be overridden by individual users.\n\n**Propagation.** Policy changes take up to five minutes to reach developer\nmachines after being written.\n\nSee the [AI Governance documentation](https://docs.docker.com/ai/sandboxes/governance/)\nfor product documentation.\n", + "diagnostics": [], + "digest": "85e78016fe389c0f17d684fcda083bdb768ddedd075f1736aae9b31f155a0344", + "exampleCount": 53, + "experimental": false, + "guides": [], + "id": "ai-governance", + "manual": "/manuals/ai/sandboxes/governance/", + "operations": [ + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/\u003cORG_NAME\u003e/governance/policies'", + "curlNotes": [], + "deprecated": null, + "description": "Returns a shallow summary of the organization's policies, one page at a time. The rule set is not included; use GetPolicy to fetch the full object.\n\nResults are paginated with an opaque cursor. Pass `page_size` to bound the page; if more policies remain, the response includes a non-null `next_page_token` to pass as `page_token` on the next request. Iterate until `next_page_token` is `null`. Treat the token as opaque; do not parse or construct it.\n", + "id": "listPolicies", + "line": 56, + "method": "GET", + "parameters": [ + { + "description": "Docker Hub organization name.", + "examples": { + "default": { + "value": "my-org" + } + }, + "in": "path", + "name": "org_name", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Maximum number of policies to return. Defaults to 100 if omitted or zero. The server caps values above 100 at 100.\n", + "in": "query", + "name": "page_size", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/get/parameters/0", + "required": false, + "schema": { + "default": 100, + "minimum": 0, + "type": "integer" + } + }, + { + "description": "Opaque cursor from a previous response's `next_page_token`. Omit to fetch the first page.\n", + "in": "query", + "name": "page_token", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/get/parameters/1", + "required": false, + "schema": { + "type": "string" + } + } + ], + "path": "/orgs/{org_name}/governance/policies", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/get", + "raw": { + "description": "Returns a shallow summary of the organization's policies, one page at a time. The rule set is not included; use GetPolicy to fetch the full object.\n\nResults are paginated with an opaque cursor. Pass `page_size` to bound the page; if more policies remain, the response includes a non-null `next_page_token` to pass as `page_token` on the next request. Iterate until `next_page_token` is `null`. Treat the token as opaque; do not parse or construct it.\n", + "operationId": "listPolicies", + "parameters": [ + { + "description": "Maximum number of policies to return. Defaults to 100 if omitted or zero. The server caps values above 100 at 100.\n", + "in": "query", + "name": "page_size", + "required": false, + "schema": { + "default": 100, + "minimum": 0, + "type": "integer" + } + }, + { + "description": "Opaque cursor from a previous response's `next_page_token`. Omit to fetch the first page.\n", + "in": "query", + "name": "page_token", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "data": [ + { + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "type": "allowlist_v0", + "updated_at": "2026-04-22T00:00:00Z" + } + ], + "next_page_token": "AQpteyJQSyI6Im15LW9yZyIsIlNLIjoicG9saWN5I3BvbF8ifQ" + } + } + }, + "schema": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/PolicySummary" + }, + "type": "array" + }, + "next_page_token": { + "description": "The opaque cursor for the next page, or `null` on the last page.\n", + "example": "AQpteyJQSyI6Im15LW9yZyIsIlNLIjoicG9saWN5I3BvbF8ifQ", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "data", + "next_page_token" + ], + "type": "object" + } + } + }, + "description": "Object wrapping an array of policy summaries under `data` and a `next_page_token`, which is null on the last page. Rule sets are not included; use GetPolicy to fetch a full policy." + }, + "400": { + "$ref": "#/components/responses/InvalidArgument" + }, + "401": { + "$ref": "#/components/responses/Unauthenticated" + }, + "403": { + "$ref": "#/components/responses/PermissionDenied" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + }, + "summary": "List policies", + "tags": [ + "policies" + ] + }, + "references": [ + { + "ref": "#/components/responses/InternalError", + "url": null + }, + { + "ref": "#/components/responses/InvalidArgument", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/PermissionDenied", + "url": null + }, + { + "ref": "#/components/responses/Unauthenticated", + "url": null + }, + { + "ref": "#/components/schemas/PolicySummary", + "url": "/reference/api/ai-governance/latest/schemas/PolicySummary/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "description": "Short-lived JWT obtained by exchanging Docker Hub credentials at\n`POST https://hub.docker.com/v2/auth/token`. Pass the JWT in the\n`Authorization: Bearer \u003ctoken\u003e` header. Tokens expire after a short\nperiod; request a fresh one when you receive a `401`.\n\nThe `password` field of the token request accepts any of the following\ncredential types:\n\n| Type | Format | Notes |\n|------|--------|-------|\n| Password | Plain text | Your Docker Hub account password. |\n| Personal Access Token (PAT) | `dckr_pat_*` | Recommended over passwords. Create one under Account Settings → Security. |\n| Organization Access Token (OAT) | `dckr_oat_*` | Scoped to an organization. Create one under Organization Settings → Access Tokens. |\n\nPAT and OAT strings can't be used directly as a bearer token. They must\nbe exchanged at the token endpoint first.\n\nSee [Docker Hub authentication](https://docs.docker.com/reference/api/hub/latest/operations/AuthCreateAccessToken/)\nfor full details.\n", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/v2" + } + ], + "summary": "List policies", + "tags": [ + "policies" + ], + "url": "/reference/api/ai-governance/latest/operations/listPolicies/", + "variants": [ + { + "description": "Object wrapping an array of policy summaries under `data` and a `next_page_token`, which is null on the last page. Rule sets are not included; use GetPolicy to fetch a full policy.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"data\": [\n {\n \"created_at\": \"2026-04-22T00:00:00Z\",\n \"id\": \"pol_06evsmp24r1pg71cm8500546pkbn\",\n \"name\": \"Security Research — hardened\",\n \"org\": \"my-org\",\n \"scope\": {\n \"teams\": [\n \"d290f1ee-6c54-4b01-90e6-d701748f0851\"\n ]\n },\n \"type\": \"allowlist_v0\",\n \"updated_at\": \"2026-04-22T00:00:00Z\"\n }\n ],\n \"next_page_token\": \"AQpteyJQSyI6Im15LW9yZyIsIlNLIjoicG9saWN5I3BvbF8ifQ\"\n}", + "value": { + "data": [ + { + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "type": "allowlist_v0", + "updated_at": "2026-04-22T00:00:00Z" + } + ], + "next_page_token": "AQpteyJQSyI6Im15LW9yZyIsIlNLIjoicG9saWN5I3BvbF8ifQ" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/get/responses/200/content/application~1json", + "required": null, + "schema": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/PolicySummary" + }, + "type": "array" + }, + "next_page_token": { + "description": "The opaque cursor for the next page, or `null` on the last page.\n", + "example": "AQpteyJQSyI6Im15LW9yZyIsIlNLIjoicG9saWN5I3BvbF8ifQ", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "data", + "next_page_token" + ], + "type": "object" + }, + "status": "200" + }, + { + "description": "Bad request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"invalid_argument\",\n \"message\": \"name is required\"\n }\n}", + "value": { + "error": { + "code": "invalid_argument", + "message": "name is required" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/get/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "400" + }, + { + "description": "Missing or invalid credentials", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"unauthenticated\",\n \"message\": \"unauthenticated\"\n }\n}", + "value": { + "error": { + "code": "unauthenticated", + "message": "unauthenticated" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "401" + }, + { + "description": "Caller lacks the required permission for this org, or the org is not entitled to use governance.\n", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"permission_denied\",\n \"message\": \"permission denied\"\n }\n}", + "value": { + "error": { + "code": "permission_denied", + "message": "permission denied" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "403" + }, + { + "description": "Not found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"not_found\",\n \"message\": \"policy not found\"\n }\n}", + "value": { + "error": { + "code": "not_found", + "message": "policy not found" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "Internal server error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"internal\",\n \"message\": \"internal error\"\n }\n}", + "value": { + "error": { + "code": "internal", + "message": "internal error" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/get/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"name\": \"Security Research — hardened\",\n \"scope\": {\n \"teams\": [\n \"d290f1ee-6c54-4b01-90e6-d701748f0851\"\n ]\n }\n}' \\\n 'https://hub.docker.com/v2/orgs/\u003cORG_NAME\u003e/governance/policies'", + "curlNotes": [], + "deprecated": null, + "description": "Creates a new policy with an empty rule set. Rules are added separately via the rules sub-resource.\n", + "id": "createPolicy", + "line": 131, + "method": "POST", + "parameters": [ + { + "description": "Docker Hub organization name.", + "examples": { + "default": { + "value": "my-org" + } + }, + "in": "path", + "name": "org_name", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/orgs/{org_name}/governance/policies", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/post", + "raw": { + "description": "Creates a new policy with an empty rule set. Rules are added separately via the rules sub-resource.\n", + "operationId": "createPolicy", + "requestBody": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "name": "Security Research — hardened", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/CreatePolicyRequest" + } + } + }, + "description": "Policy name and optional scope.", + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T00:00:00Z" + } + } + }, + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + }, + "description": "Policy created. Returns the new policy without its rule set." + }, + "400": { + "$ref": "#/components/responses/InvalidArgument" + }, + "401": { + "$ref": "#/components/responses/Unauthenticated" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + }, + "summary": "Create policy", + "tags": [ + "policies" + ] + }, + "references": [ + { + "ref": "#/components/responses/Conflict", + "url": null + }, + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/InternalError", + "url": null + }, + { + "ref": "#/components/responses/InvalidArgument", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthenticated", + "url": null + }, + { + "ref": "#/components/schemas/CreatePolicyRequest", + "url": "/reference/api/ai-governance/latest/schemas/CreatePolicyRequest/" + }, + { + "ref": "#/components/schemas/Policy", + "url": "/reference/api/ai-governance/latest/schemas/Policy/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/CreatePolicyRequest" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "description": "Short-lived JWT obtained by exchanging Docker Hub credentials at\n`POST https://hub.docker.com/v2/auth/token`. Pass the JWT in the\n`Authorization: Bearer \u003ctoken\u003e` header. Tokens expire after a short\nperiod; request a fresh one when you receive a `401`.\n\nThe `password` field of the token request accepts any of the following\ncredential types:\n\n| Type | Format | Notes |\n|------|--------|-------|\n| Password | Plain text | Your Docker Hub account password. |\n| Personal Access Token (PAT) | `dckr_pat_*` | Recommended over passwords. Create one under Account Settings → Security. |\n| Organization Access Token (OAT) | `dckr_oat_*` | Scoped to an organization. Create one under Organization Settings → Access Tokens. |\n\nPAT and OAT strings can't be used directly as a bearer token. They must\nbe exchanged at the token endpoint first.\n\nSee [Docker Hub authentication](https://docs.docker.com/reference/api/hub/latest/operations/AuthCreateAccessToken/)\nfor full details.\n", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/v2" + } + ], + "summary": "Create policy", + "tags": [ + "policies" + ], + "url": "/reference/api/ai-governance/latest/operations/createPolicy/", + "variants": [ + { + "description": "Policy name and optional scope.", + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"name\": \"Security Research — hardened\",\n \"scope\": {\n \"teams\": [\n \"d290f1ee-6c54-4b01-90e6-d701748f0851\"\n ]\n }\n}", + "value": { + "name": "Security Research — hardened", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/CreatePolicyRequest" + }, + "status": "" + }, + { + "description": "Policy created. Returns the new policy without its rule set.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"created_at\": \"2026-04-22T00:00:00Z\",\n \"id\": \"pol_06evsmp24r1pg71cm8500546pkbn\",\n \"name\": \"Security Research — hardened\",\n \"org\": \"my-org\",\n \"scope\": {\n \"teams\": [\n \"d290f1ee-6c54-4b01-90e6-d701748f0851\"\n ]\n },\n \"updated_at\": \"2026-04-22T00:00:00Z\"\n}", + "value": { + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T00:00:00Z" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Policy" + }, + "status": "201" + }, + { + "description": "Bad request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"invalid_argument\",\n \"message\": \"name is required\"\n }\n}", + "value": { + "error": { + "code": "invalid_argument", + "message": "name is required" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/post/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "400" + }, + { + "description": "Missing or invalid credentials", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"unauthenticated\",\n \"message\": \"unauthenticated\"\n }\n}", + "value": { + "error": { + "code": "unauthenticated", + "message": "unauthenticated" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "401" + }, + { + "description": "Caller lacks the required permission for this org, the org is not entitled to use governance (`permission_denied`), or a creation limit has been reached (`limit_exceeded`): the org already has the maximum number of policies, or the policy already has the maximum number of rules.\n", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "limit_exceeded", + "text": "{\n \"error\": {\n \"code\": \"limit_exceeded\",\n \"message\": \"organization has reached the maximum of 100 policies\"\n }\n}", + "value": { + "error": { + "code": "limit_exceeded", + "message": "organization has reached the maximum of 100 policies" + } + } + }, + { + "language": "json", + "name": "permission_denied", + "text": "{\n \"error\": {\n \"code\": \"permission_denied\",\n \"message\": \"permission denied\"\n }\n}", + "value": { + "error": { + "code": "permission_denied", + "message": "permission denied" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/post/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "403" + }, + { + "description": "Not found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"not_found\",\n \"message\": \"policy not found\"\n }\n}", + "value": { + "error": { + "code": "not_found", + "message": "policy not found" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/post/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "Conflict", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"conflict\",\n \"message\": \"policy name already in use\"\n }\n}", + "value": { + "error": { + "code": "conflict", + "message": "policy name already in use" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "Internal server error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"internal\",\n \"message\": \"internal error\"\n }\n}", + "value": { + "error": { + "code": "internal", + "message": "internal error" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies/post/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/\u003cORG_NAME\u003e/governance/policies/\u003cPOLICY_ID\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Returns the full policy including its `allowlist_v0` rule set.", + "id": "getPolicy", + "line": 185, + "method": "GET", + "parameters": [ + { + "description": "Docker Hub organization name.", + "examples": { + "default": { + "value": "my-org" + } + }, + "in": "path", + "name": "org_name", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Unique policy identifier.", + "examples": { + "default": { + "value": "pol_06evsmp24r1pg71cm8500546pkbn" + } + }, + "in": "path", + "name": "policy_id", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/orgs/{org_name}/governance/policies/{policy_id}", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/get", + "raw": { + "description": "Returns the full policy including its `allowlist_v0` rule set.", + "operationId": "getPolicy", + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "allowlist_v0": { + "domain": "network", + "rules": [ + { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + ] + }, + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T00:00:00Z" + } + } + }, + "schema": { + "$ref": "#/components/schemas/Policy" + } + } + }, + "description": "Full policy including its `allowlist_v0` rule set." + }, + "401": { + "$ref": "#/components/responses/Unauthenticated" + }, + "403": { + "$ref": "#/components/responses/PermissionDenied" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + }, + "summary": "Get policy", + "tags": [ + "policies" + ] + }, + "references": [ + { + "ref": "#/components/responses/InternalError", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/PermissionDenied", + "url": null + }, + { + "ref": "#/components/responses/Unauthenticated", + "url": null + }, + { + "ref": "#/components/schemas/Policy", + "url": "/reference/api/ai-governance/latest/schemas/Policy/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "description": "Short-lived JWT obtained by exchanging Docker Hub credentials at\n`POST https://hub.docker.com/v2/auth/token`. Pass the JWT in the\n`Authorization: Bearer \u003ctoken\u003e` header. Tokens expire after a short\nperiod; request a fresh one when you receive a `401`.\n\nThe `password` field of the token request accepts any of the following\ncredential types:\n\n| Type | Format | Notes |\n|------|--------|-------|\n| Password | Plain text | Your Docker Hub account password. |\n| Personal Access Token (PAT) | `dckr_pat_*` | Recommended over passwords. Create one under Account Settings → Security. |\n| Organization Access Token (OAT) | `dckr_oat_*` | Scoped to an organization. Create one under Organization Settings → Access Tokens. |\n\nPAT and OAT strings can't be used directly as a bearer token. They must\nbe exchanged at the token endpoint first.\n\nSee [Docker Hub authentication](https://docs.docker.com/reference/api/hub/latest/operations/AuthCreateAccessToken/)\nfor full details.\n", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/v2" + } + ], + "summary": "Get policy", + "tags": [ + "policies" + ], + "url": "/reference/api/ai-governance/latest/operations/getPolicy/", + "variants": [ + { + "description": "Full policy including its `allowlist_v0` rule set.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"allowlist_v0\": {\n \"domain\": \"network\",\n \"rules\": [\n {\n \"actions\": [\n \"connect:tcp\",\n \"connect:udp\"\n ],\n \"decision\": \"allow\",\n \"id\": \"rule_06evsm9qjm1pdsk0a8nkfaxy7jna\",\n \"name\": \"allow research mirrors\",\n \"resources\": [\n \"research.mitre.org\",\n \"cve.mitre.org\"\n ]\n }\n ]\n },\n \"created_at\": \"2026-04-22T00:00:00Z\",\n \"id\": \"pol_06evsmp24r1pg71cm8500546pkbn\",\n \"name\": \"Security Research — hardened\",\n \"org\": \"my-org\",\n \"scope\": {\n \"teams\": [\n \"d290f1ee-6c54-4b01-90e6-d701748f0851\"\n ]\n },\n \"updated_at\": \"2026-04-22T00:00:00Z\"\n}", + "value": { + "allowlist_v0": { + "domain": "network", + "rules": [ + { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + ] + }, + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T00:00:00Z" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Policy" + }, + "status": "200" + }, + { + "description": "Missing or invalid credentials", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"unauthenticated\",\n \"message\": \"unauthenticated\"\n }\n}", + "value": { + "error": { + "code": "unauthenticated", + "message": "unauthenticated" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/get/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "401" + }, + { + "description": "Caller lacks the required permission for this org, or the org is not entitled to use governance.\n", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"permission_denied\",\n \"message\": \"permission denied\"\n }\n}", + "value": { + "error": { + "code": "permission_denied", + "message": "permission denied" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/get/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "403" + }, + { + "description": "Not found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"not_found\",\n \"message\": \"policy not found\"\n }\n}", + "value": { + "error": { + "code": "not_found", + "message": "policy not found" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "Internal server error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"internal\",\n \"message\": \"internal error\"\n }\n}", + "value": { + "error": { + "code": "internal", + "message": "internal error" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/get/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/\u003cORG_NAME\u003e/governance/policies/\u003cPOLICY_ID\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Permanently deletes the policy and its rule set. Returns the deleted\npolicy as a courtesy; its `updated_at` is unchanged by the deletion.\nChanges may take up to five minutes to reach developer machines.\n", + "id": "deletePolicy", + "line": 309, + "method": "DELETE", + "parameters": [ + { + "description": "Docker Hub organization name.", + "examples": { + "default": { + "value": "my-org" + } + }, + "in": "path", + "name": "org_name", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Unique policy identifier.", + "examples": { + "default": { + "value": "pol_06evsmp24r1pg71cm8500546pkbn" + } + }, + "in": "path", + "name": "policy_id", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/orgs/{org_name}/governance/policies/{policy_id}", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/delete", + "raw": { + "description": "Permanently deletes the policy and its rule set. Returns the deleted\npolicy as a courtesy; its `updated_at` is unchanged by the deletion.\nChanges may take up to five minutes to reach developer machines.\n", + "operationId": "deletePolicy", + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "deleted": { + "allowlist_v0": { + "domain": "network", + "rules": [ + { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + ] + }, + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T00:00:00Z" + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/DeletePolicyResponse" + } + } + }, + "description": "Policy deleted, returns the deleted policy." + }, + "401": { + "$ref": "#/components/responses/Unauthenticated" + }, + "403": { + "$ref": "#/components/responses/PermissionDenied" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + }, + "summary": "Delete policy", + "tags": [ + "policies" + ] + }, + "references": [ + { + "ref": "#/components/responses/InternalError", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/PermissionDenied", + "url": null + }, + { + "ref": "#/components/responses/Unauthenticated", + "url": null + }, + { + "ref": "#/components/schemas/DeletePolicyResponse", + "url": "/reference/api/ai-governance/latest/schemas/DeletePolicyResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "description": "Short-lived JWT obtained by exchanging Docker Hub credentials at\n`POST https://hub.docker.com/v2/auth/token`. Pass the JWT in the\n`Authorization: Bearer \u003ctoken\u003e` header. Tokens expire after a short\nperiod; request a fresh one when you receive a `401`.\n\nThe `password` field of the token request accepts any of the following\ncredential types:\n\n| Type | Format | Notes |\n|------|--------|-------|\n| Password | Plain text | Your Docker Hub account password. |\n| Personal Access Token (PAT) | `dckr_pat_*` | Recommended over passwords. Create one under Account Settings → Security. |\n| Organization Access Token (OAT) | `dckr_oat_*` | Scoped to an organization. Create one under Organization Settings → Access Tokens. |\n\nPAT and OAT strings can't be used directly as a bearer token. They must\nbe exchanged at the token endpoint first.\n\nSee [Docker Hub authentication](https://docs.docker.com/reference/api/hub/latest/operations/AuthCreateAccessToken/)\nfor full details.\n", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/v2" + } + ], + "summary": "Delete policy", + "tags": [ + "policies" + ], + "url": "/reference/api/ai-governance/latest/operations/deletePolicy/", + "variants": [ + { + "description": "Policy deleted, returns the deleted policy.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"deleted\": {\n \"allowlist_v0\": {\n \"domain\": \"network\",\n \"rules\": [\n {\n \"actions\": [\n \"connect:tcp\",\n \"connect:udp\"\n ],\n \"decision\": \"allow\",\n \"id\": \"rule_06evsm9qjm1pdsk0a8nkfaxy7jna\",\n \"name\": \"allow research mirrors\",\n \"resources\": [\n \"research.mitre.org\",\n \"cve.mitre.org\"\n ]\n }\n ]\n },\n \"created_at\": \"2026-04-22T00:00:00Z\",\n \"id\": \"pol_06evsmp24r1pg71cm8500546pkbn\",\n \"name\": \"Security Research — hardened\",\n \"org\": \"my-org\",\n \"scope\": {\n \"teams\": [\n \"d290f1ee-6c54-4b01-90e6-d701748f0851\"\n ]\n },\n \"updated_at\": \"2026-04-22T00:00:00Z\"\n }\n}", + "value": { + "deleted": { + "allowlist_v0": { + "domain": "network", + "rules": [ + { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + ] + }, + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T00:00:00Z" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/delete/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/DeletePolicyResponse" + }, + "status": "200" + }, + { + "description": "Missing or invalid credentials", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"unauthenticated\",\n \"message\": \"unauthenticated\"\n }\n}", + "value": { + "error": { + "code": "unauthenticated", + "message": "unauthenticated" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/delete/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "401" + }, + { + "description": "Caller lacks the required permission for this org, or the org is not entitled to use governance.\n", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"permission_denied\",\n \"message\": \"permission denied\"\n }\n}", + "value": { + "error": { + "code": "permission_denied", + "message": "permission denied" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/delete/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "403" + }, + { + "description": "Not found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"not_found\",\n \"message\": \"policy not found\"\n }\n}", + "value": { + "error": { + "code": "not_found", + "message": "policy not found" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/delete/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "Internal server error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"internal\",\n \"message\": \"internal error\"\n }\n}", + "value": { + "error": { + "code": "internal", + "message": "internal error" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/delete/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PATCH \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"name\": \"Security Research\"\n}' \\\n 'https://hub.docker.com/v2/orgs/\u003cORG_NAME\u003e/governance/policies/\u003cPOLICY_ID\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Partially updates a policy's metadata. Only fields present in the\nrequest body are updated; absent fields are left unchanged. The `scope`\nobject is patched per sub-field: sending `teams` replaces that list,\nwhile an omitted sub-field is left untouched and an empty list clears\nit (org-wide).\n\nThe rule set is not modified here. Use the rule endpoints for that.\nAt least one field must be present. Returns the policy in both its old\nand new states. Changes may take up to five minutes to reach developer\nmachines.\n", + "id": "updatePolicy", + "line": 223, + "method": "PATCH", + "parameters": [ + { + "description": "Docker Hub organization name.", + "examples": { + "default": { + "value": "my-org" + } + }, + "in": "path", + "name": "org_name", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Unique policy identifier.", + "examples": { + "default": { + "value": "pol_06evsmp24r1pg71cm8500546pkbn" + } + }, + "in": "path", + "name": "policy_id", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/orgs/{org_name}/governance/policies/{policy_id}", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/patch", + "raw": { + "description": "Partially updates a policy's metadata. Only fields present in the\nrequest body are updated; absent fields are left unchanged. The `scope`\nobject is patched per sub-field: sending `teams` replaces that list,\nwhile an omitted sub-field is left untouched and an empty list clears\nit (org-wide).\n\nThe rule set is not modified here. Use the rule endpoints for that.\nAt least one field must be present. Returns the policy in both its old\nand new states. Changes may take up to five minutes to reach developer\nmachines.\n", + "operationId": "updatePolicy", + "requestBody": { + "content": { + "application/json": { + "examples": { + "rename": { + "summary": "Rename the policy", + "value": { + "name": "Security Research" + } + }, + "scope": { + "summary": "Restrict to a team", + "value": { + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/UpdatePolicyRequest" + } + } + }, + "description": "Fields to update. Absent fields are left unchanged.", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "new": { + "allowlist_v0": { + "domain": "network", + "rules": [ + { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + ] + }, + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T10:00:00Z" + }, + "old": { + "allowlist_v0": { + "domain": "network", + "rules": [ + { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + ] + }, + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T00:00:00Z" + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/UpdatePolicyResponse" + } + } + }, + "description": "Policy updated, returns old and new states." + }, + "400": { + "$ref": "#/components/responses/InvalidArgument" + }, + "401": { + "$ref": "#/components/responses/Unauthenticated" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + }, + "summary": "Update policy", + "tags": [ + "policies" + ] + }, + "references": [ + { + "ref": "#/components/responses/Conflict", + "url": null + }, + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/InternalError", + "url": null + }, + { + "ref": "#/components/responses/InvalidArgument", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthenticated", + "url": null + }, + { + "ref": "#/components/schemas/UpdatePolicyRequest", + "url": "/reference/api/ai-governance/latest/schemas/UpdatePolicyRequest/" + }, + { + "ref": "#/components/schemas/UpdatePolicyResponse", + "url": "/reference/api/ai-governance/latest/schemas/UpdatePolicyResponse/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/UpdatePolicyRequest" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "description": "Short-lived JWT obtained by exchanging Docker Hub credentials at\n`POST https://hub.docker.com/v2/auth/token`. Pass the JWT in the\n`Authorization: Bearer \u003ctoken\u003e` header. Tokens expire after a short\nperiod; request a fresh one when you receive a `401`.\n\nThe `password` field of the token request accepts any of the following\ncredential types:\n\n| Type | Format | Notes |\n|------|--------|-------|\n| Password | Plain text | Your Docker Hub account password. |\n| Personal Access Token (PAT) | `dckr_pat_*` | Recommended over passwords. Create one under Account Settings → Security. |\n| Organization Access Token (OAT) | `dckr_oat_*` | Scoped to an organization. Create one under Organization Settings → Access Tokens. |\n\nPAT and OAT strings can't be used directly as a bearer token. They must\nbe exchanged at the token endpoint first.\n\nSee [Docker Hub authentication](https://docs.docker.com/reference/api/hub/latest/operations/AuthCreateAccessToken/)\nfor full details.\n", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/v2" + } + ], + "summary": "Update policy", + "tags": [ + "policies" + ], + "url": "/reference/api/ai-governance/latest/operations/updatePolicy/", + "variants": [ + { + "description": "Fields to update. Absent fields are left unchanged.", + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "rename", + "text": "{\n \"name\": \"Security Research\"\n}", + "value": { + "name": "Security Research" + } + }, + { + "language": "json", + "name": "scope", + "text": "{\n \"scope\": {\n \"teams\": [\n \"d290f1ee-6c54-4b01-90e6-d701748f0851\"\n ]\n }\n}", + "value": { + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/patch/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/UpdatePolicyRequest" + }, + "status": "" + }, + { + "description": "Policy updated, returns old and new states.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"new\": {\n \"allowlist_v0\": {\n \"domain\": \"network\",\n \"rules\": [\n {\n \"actions\": [\n \"connect:tcp\",\n \"connect:udp\"\n ],\n \"decision\": \"allow\",\n \"id\": \"rule_06evsm9qjm1pdsk0a8nkfaxy7jna\",\n \"name\": \"allow research mirrors\",\n \"resources\": [\n \"research.mitre.org\",\n \"cve.mitre.org\"\n ]\n }\n ]\n },\n \"created_at\": \"2026-04-22T00:00:00Z\",\n \"id\": \"pol_06evsmp24r1pg71cm8500546pkbn\",\n \"name\": \"Security Research\",\n \"org\": \"my-org\",\n \"scope\": {\n \"teams\": [\n \"d290f1ee-6c54-4b01-90e6-d701748f0851\"\n ]\n },\n \"updated_at\": \"2026-04-22T10:00:00Z\"\n },\n \"old\": {\n \"allowlist_v0\": {\n \"domain\": \"network\",\n \"rules\": [\n {\n \"actions\": [\n \"connect:tcp\",\n \"connect:udp\"\n ],\n \"decision\": \"allow\",\n \"id\": \"rule_06evsm9qjm1pdsk0a8nkfaxy7jna\",\n \"name\": \"allow research mirrors\",\n \"resources\": [\n \"research.mitre.org\",\n \"cve.mitre.org\"\n ]\n }\n ]\n },\n \"created_at\": \"2026-04-22T00:00:00Z\",\n \"id\": \"pol_06evsmp24r1pg71cm8500546pkbn\",\n \"name\": \"Security Research — hardened\",\n \"org\": \"my-org\",\n \"scope\": {\n \"teams\": [\n \"d290f1ee-6c54-4b01-90e6-d701748f0851\"\n ]\n },\n \"updated_at\": \"2026-04-22T00:00:00Z\"\n }\n}", + "value": { + "new": { + "allowlist_v0": { + "domain": "network", + "rules": [ + { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + ] + }, + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T10:00:00Z" + }, + "old": { + "allowlist_v0": { + "domain": "network", + "rules": [ + { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + ] + }, + "created_at": "2026-04-22T00:00:00Z", + "id": "pol_06evsmp24r1pg71cm8500546pkbn", + "name": "Security Research — hardened", + "org": "my-org", + "scope": { + "teams": [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + }, + "updated_at": "2026-04-22T00:00:00Z" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/patch/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/UpdatePolicyResponse" + }, + "status": "200" + }, + { + "description": "Bad request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"invalid_argument\",\n \"message\": \"name is required\"\n }\n}", + "value": { + "error": { + "code": "invalid_argument", + "message": "name is required" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/patch/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "400" + }, + { + "description": "Missing or invalid credentials", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"unauthenticated\",\n \"message\": \"unauthenticated\"\n }\n}", + "value": { + "error": { + "code": "unauthenticated", + "message": "unauthenticated" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/patch/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "401" + }, + { + "description": "Caller lacks the required permission for this org, the org is not entitled to use governance (`permission_denied`), or a creation limit has been reached (`limit_exceeded`): the org already has the maximum number of policies, or the policy already has the maximum number of rules.\n", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "limit_exceeded", + "text": "{\n \"error\": {\n \"code\": \"limit_exceeded\",\n \"message\": \"organization has reached the maximum of 100 policies\"\n }\n}", + "value": { + "error": { + "code": "limit_exceeded", + "message": "organization has reached the maximum of 100 policies" + } + } + }, + { + "language": "json", + "name": "permission_denied", + "text": "{\n \"error\": {\n \"code\": \"permission_denied\",\n \"message\": \"permission denied\"\n }\n}", + "value": { + "error": { + "code": "permission_denied", + "message": "permission denied" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/patch/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "403" + }, + { + "description": "Not found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"not_found\",\n \"message\": \"policy not found\"\n }\n}", + "value": { + "error": { + "code": "not_found", + "message": "policy not found" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/patch/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "Conflict", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"conflict\",\n \"message\": \"policy name already in use\"\n }\n}", + "value": { + "error": { + "code": "conflict", + "message": "policy name already in use" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/patch/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "Internal server error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"internal\",\n \"message\": \"internal error\"\n }\n}", + "value": { + "error": { + "code": "internal", + "message": "internal error" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}/patch/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"actions\": [\n \"read\",\n \"write\"\n ],\n \"decision\": \"allow\",\n \"name\": \"allow data directory\",\n \"resources\": [\n \"/data\"\n ]\n}' \\\n 'https://hub.docker.com/v2/orgs/\u003cORG_NAME\u003e/governance/policies/\u003cPOLICY_ID\u003e/rules'", + "curlNotes": [], + "deprecated": null, + "description": "Adds a rule to the policy's rule set. All rules in a policy must share\nthe same domain (network or filesystem); mixing domains is rejected.\n\n**Network** actions: `connect:tcp`, `connect:udp`. Resources are\nhostnames (for example, `example.com`), wildcard subdomains (`*.example.com`\nfor one level, `**.example.com` for any depth), hostnames with an optional\nport (for example, `example.com:443`), or CIDRs in IPv4 or IPv6 notation\n(for example, `10.0.0.0/8` or `2001:db8::/32`).\n\n**Filesystem** actions: `read`, `write`. Resources are paths (for example,\n`/data`). Use `*` to match within a single path segment and `**` to match\nrecursively across segments (for example, `/data/**`).\n\nChanges may take up to five minutes to reach developer machines.\n", + "id": "createRule", + "line": 356, + "method": "POST", + "parameters": [ + { + "description": "Docker Hub organization name.", + "examples": { + "default": { + "value": "my-org" + } + }, + "in": "path", + "name": "org_name", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Unique policy identifier.", + "examples": { + "default": { + "value": "pol_06evsmp24r1pg71cm8500546pkbn" + } + }, + "in": "path", + "name": "policy_id", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/parameters/1", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/orgs/{org_name}/governance/policies/{policy_id}/rules", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/post", + "raw": { + "description": "Adds a rule to the policy's rule set. All rules in a policy must share\nthe same domain (network or filesystem); mixing domains is rejected.\n\n**Network** actions: `connect:tcp`, `connect:udp`. Resources are\nhostnames (for example, `example.com`), wildcard subdomains (`*.example.com`\nfor one level, `**.example.com` for any depth), hostnames with an optional\nport (for example, `example.com:443`), or CIDRs in IPv4 or IPv6 notation\n(for example, `10.0.0.0/8` or `2001:db8::/32`).\n\n**Filesystem** actions: `read`, `write`. Resources are paths (for example,\n`/data`). Use `*` to match within a single path segment and `**` to match\nrecursively across segments (for example, `/data/**`).\n\nChanges may take up to five minutes to reach developer machines.\n", + "operationId": "createRule", + "requestBody": { + "content": { + "application/json": { + "examples": { + "filesystem": { + "summary": "Filesystem rule", + "value": { + "actions": [ + "read", + "write" + ], + "decision": "allow", + "name": "allow data directory", + "resources": [ + "/data" + ] + } + }, + "network": { + "summary": "Network rule", + "value": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + } + }, + "schema": { + "$ref": "#/components/schemas/CreateRuleRequest" + } + } + }, + "description": "Rule definition including actions, resources, and decision.", + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "examples": { + "filesystem": { + "summary": "Filesystem rule", + "value": { + "actions": [ + "read", + "write" + ], + "decision": "allow", + "id": "rule_07fwtnr0kn2qetl1b9olfbyz8kob", + "name": "allow data directory", + "resources": [ + "/data" + ] + } + }, + "network": { + "summary": "Network rule", + "value": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + } + }, + "schema": { + "$ref": "#/components/schemas/Rule" + } + } + }, + "description": "Rule created and added to the policy's rule set." + }, + "400": { + "$ref": "#/components/responses/InvalidArgument" + }, + "401": { + "$ref": "#/components/responses/Unauthenticated" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + }, + "summary": "Create rule", + "tags": [ + "rules" + ] + }, + "references": [ + { + "ref": "#/components/responses/Conflict", + "url": null + }, + { + "ref": "#/components/responses/Forbidden", + "url": null + }, + { + "ref": "#/components/responses/InternalError", + "url": null + }, + { + "ref": "#/components/responses/InvalidArgument", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/Unauthenticated", + "url": null + }, + { + "ref": "#/components/schemas/CreateRuleRequest", + "url": "/reference/api/ai-governance/latest/schemas/CreateRuleRequest/" + }, + { + "ref": "#/components/schemas/Rule", + "url": "/reference/api/ai-governance/latest/schemas/Rule/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/CreateRuleRequest" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "description": "Short-lived JWT obtained by exchanging Docker Hub credentials at\n`POST https://hub.docker.com/v2/auth/token`. Pass the JWT in the\n`Authorization: Bearer \u003ctoken\u003e` header. Tokens expire after a short\nperiod; request a fresh one when you receive a `401`.\n\nThe `password` field of the token request accepts any of the following\ncredential types:\n\n| Type | Format | Notes |\n|------|--------|-------|\n| Password | Plain text | Your Docker Hub account password. |\n| Personal Access Token (PAT) | `dckr_pat_*` | Recommended over passwords. Create one under Account Settings → Security. |\n| Organization Access Token (OAT) | `dckr_oat_*` | Scoped to an organization. Create one under Organization Settings → Access Tokens. |\n\nPAT and OAT strings can't be used directly as a bearer token. They must\nbe exchanged at the token endpoint first.\n\nSee [Docker Hub authentication](https://docs.docker.com/reference/api/hub/latest/operations/AuthCreateAccessToken/)\nfor full details.\n", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/v2" + } + ], + "summary": "Create rule", + "tags": [ + "rules" + ], + "url": "/reference/api/ai-governance/latest/operations/createRule/", + "variants": [ + { + "description": "Rule definition including actions, resources, and decision.", + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "filesystem", + "text": "{\n \"actions\": [\n \"read\",\n \"write\"\n ],\n \"decision\": \"allow\",\n \"name\": \"allow data directory\",\n \"resources\": [\n \"/data\"\n ]\n}", + "value": { + "actions": [ + "read", + "write" + ], + "decision": "allow", + "name": "allow data directory", + "resources": [ + "/data" + ] + } + }, + { + "language": "json", + "name": "network", + "text": "{\n \"actions\": [\n \"connect:tcp\",\n \"connect:udp\"\n ],\n \"decision\": \"allow\",\n \"name\": \"allow research mirrors\",\n \"resources\": [\n \"research.mitre.org\",\n \"cve.mitre.org\"\n ]\n}", + "value": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/CreateRuleRequest" + }, + "status": "" + }, + { + "description": "Rule created and added to the policy's rule set.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "filesystem", + "text": "{\n \"actions\": [\n \"read\",\n \"write\"\n ],\n \"decision\": \"allow\",\n \"id\": \"rule_07fwtnr0kn2qetl1b9olfbyz8kob\",\n \"name\": \"allow data directory\",\n \"resources\": [\n \"/data\"\n ]\n}", + "value": { + "actions": [ + "read", + "write" + ], + "decision": "allow", + "id": "rule_07fwtnr0kn2qetl1b9olfbyz8kob", + "name": "allow data directory", + "resources": [ + "/data" + ] + } + }, + { + "language": "json", + "name": "network", + "text": "{\n \"actions\": [\n \"connect:tcp\",\n \"connect:udp\"\n ],\n \"decision\": \"allow\",\n \"id\": \"rule_06evsm9qjm1pdsk0a8nkfaxy7jna\",\n \"name\": \"allow research mirrors\",\n \"resources\": [\n \"research.mitre.org\",\n \"cve.mitre.org\"\n ]\n}", + "value": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Rule" + }, + "status": "201" + }, + { + "description": "Bad request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"invalid_argument\",\n \"message\": \"name is required\"\n }\n}", + "value": { + "error": { + "code": "invalid_argument", + "message": "name is required" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/post/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "400" + }, + { + "description": "Missing or invalid credentials", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"unauthenticated\",\n \"message\": \"unauthenticated\"\n }\n}", + "value": { + "error": { + "code": "unauthenticated", + "message": "unauthenticated" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/post/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "401" + }, + { + "description": "Caller lacks the required permission for this org, the org is not entitled to use governance (`permission_denied`), or a creation limit has been reached (`limit_exceeded`): the org already has the maximum number of policies, or the policy already has the maximum number of rules.\n", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "limit_exceeded", + "text": "{\n \"error\": {\n \"code\": \"limit_exceeded\",\n \"message\": \"organization has reached the maximum of 100 policies\"\n }\n}", + "value": { + "error": { + "code": "limit_exceeded", + "message": "organization has reached the maximum of 100 policies" + } + } + }, + { + "language": "json", + "name": "permission_denied", + "text": "{\n \"error\": {\n \"code\": \"permission_denied\",\n \"message\": \"permission denied\"\n }\n}", + "value": { + "error": { + "code": "permission_denied", + "message": "permission denied" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/post/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "403" + }, + { + "description": "Not found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"not_found\",\n \"message\": \"policy not found\"\n }\n}", + "value": { + "error": { + "code": "not_found", + "message": "policy not found" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/post/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "Conflict", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"conflict\",\n \"message\": \"policy name already in use\"\n }\n}", + "value": { + "error": { + "code": "conflict", + "message": "policy name already in use" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "Internal server error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"internal\",\n \"message\": \"internal error\"\n }\n}", + "value": { + "error": { + "code": "internal", + "message": "internal error" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules/post/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://hub.docker.com/v2/orgs/\u003cORG_NAME\u003e/governance/policies/\u003cPOLICY_ID\u003e/rules/\u003cRULE_ID\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Deletes a rule from the policy. Returns the deleted rule. Changes may\ntake up to five minutes to reach developer machines.\n", + "id": "deleteRule", + "line": 497, + "method": "DELETE", + "parameters": [ + { + "description": "Docker Hub organization name.", + "examples": { + "default": { + "value": "my-org" + } + }, + "in": "path", + "name": "org_name", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Unique policy identifier.", + "examples": { + "default": { + "value": "pol_06evsmp24r1pg71cm8500546pkbn" + } + }, + "in": "path", + "name": "policy_id", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Unique rule identifier within the policy.", + "examples": { + "default": { + "value": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna" + } + }, + "in": "path", + "name": "rule_id", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/parameters/2", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/orgs/{org_name}/governance/policies/{policy_id}/rules/{rule_id}", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/delete", + "raw": { + "description": "Deletes a rule from the policy. Returns the deleted rule. Changes may\ntake up to five minutes to reach developer machines.\n", + "operationId": "deleteRule", + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "deleted": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/DeleteRuleResponse" + } + } + }, + "description": "Rule deleted, returns the deleted rule." + }, + "401": { + "$ref": "#/components/responses/Unauthenticated" + }, + "403": { + "$ref": "#/components/responses/PermissionDenied" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + }, + "summary": "Delete rule", + "tags": [ + "rules" + ] + }, + "references": [ + { + "ref": "#/components/responses/InternalError", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/PermissionDenied", + "url": null + }, + { + "ref": "#/components/responses/Unauthenticated", + "url": null + }, + { + "ref": "#/components/schemas/DeleteRuleResponse", + "url": "/reference/api/ai-governance/latest/schemas/DeleteRuleResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "description": "Short-lived JWT obtained by exchanging Docker Hub credentials at\n`POST https://hub.docker.com/v2/auth/token`. Pass the JWT in the\n`Authorization: Bearer \u003ctoken\u003e` header. Tokens expire after a short\nperiod; request a fresh one when you receive a `401`.\n\nThe `password` field of the token request accepts any of the following\ncredential types:\n\n| Type | Format | Notes |\n|------|--------|-------|\n| Password | Plain text | Your Docker Hub account password. |\n| Personal Access Token (PAT) | `dckr_pat_*` | Recommended over passwords. Create one under Account Settings → Security. |\n| Organization Access Token (OAT) | `dckr_oat_*` | Scoped to an organization. Create one under Organization Settings → Access Tokens. |\n\nPAT and OAT strings can't be used directly as a bearer token. They must\nbe exchanged at the token endpoint first.\n\nSee [Docker Hub authentication](https://docs.docker.com/reference/api/hub/latest/operations/AuthCreateAccessToken/)\nfor full details.\n", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/v2" + } + ], + "summary": "Delete rule", + "tags": [ + "rules" + ], + "url": "/reference/api/ai-governance/latest/operations/deleteRule/", + "variants": [ + { + "description": "Rule deleted, returns the deleted rule.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"deleted\": {\n \"actions\": [\n \"connect:tcp\",\n \"connect:udp\"\n ],\n \"decision\": \"allow\",\n \"id\": \"rule_06evsm9qjm1pdsk0a8nkfaxy7jna\",\n \"name\": \"allow research mirrors\",\n \"resources\": [\n \"research.mitre.org\",\n \"cve.mitre.org\"\n ]\n }\n}", + "value": { + "deleted": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/delete/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/DeleteRuleResponse" + }, + "status": "200" + }, + { + "description": "Missing or invalid credentials", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"unauthenticated\",\n \"message\": \"unauthenticated\"\n }\n}", + "value": { + "error": { + "code": "unauthenticated", + "message": "unauthenticated" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/delete/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "401" + }, + { + "description": "Caller lacks the required permission for this org, or the org is not entitled to use governance.\n", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"permission_denied\",\n \"message\": \"permission denied\"\n }\n}", + "value": { + "error": { + "code": "permission_denied", + "message": "permission denied" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/delete/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "403" + }, + { + "description": "Not found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"not_found\",\n \"message\": \"policy not found\"\n }\n}", + "value": { + "error": { + "code": "not_found", + "message": "policy not found" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/delete/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "Internal server error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"internal\",\n \"message\": \"internal error\"\n }\n}", + "value": { + "error": { + "code": "internal", + "message": "internal error" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/delete/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "500" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PATCH \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"resources\": [\n \"research.mitre.org\"\n ]\n}' \\\n 'https://hub.docker.com/v2/orgs/\u003cORG_NAME\u003e/governance/policies/\u003cPOLICY_ID\u003e/rules/\u003cRULE_ID\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "Partially updates a rule. Only fields present in the request body are\nupdated; absent fields are left unchanged. Returns the rule in both its\nold and new states.\n\nChanging `actions` across domains (for example, from network actions to\nfilesystem actions) is rejected. Changes may take up to five minutes to\nreach developer machines.\n", + "id": "updateRule", + "line": 439, + "method": "PATCH", + "parameters": [ + { + "description": "Docker Hub organization name.", + "examples": { + "default": { + "value": "my-org" + } + }, + "in": "path", + "name": "org_name", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Unique policy identifier.", + "examples": { + "default": { + "value": "pol_06evsmp24r1pg71cm8500546pkbn" + } + }, + "in": "path", + "name": "policy_id", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Unique rule identifier within the policy.", + "examples": { + "default": { + "value": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna" + } + }, + "in": "path", + "name": "rule_id", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/parameters/2", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/orgs/{org_name}/governance/policies/{policy_id}/rules/{rule_id}", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/patch", + "raw": { + "description": "Partially updates a rule. Only fields present in the request body are\nupdated; absent fields are left unchanged. Returns the rule in both its\nold and new states.\n\nChanging `actions` across domains (for example, from network actions to\nfilesystem actions) is rejected. Changes may take up to five minutes to\nreach developer machines.\n", + "operationId": "updateRule", + "requestBody": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "resources": [ + "research.mitre.org" + ] + } + } + }, + "schema": { + "$ref": "#/components/schemas/UpdateRuleRequest" + } + } + }, + "description": "Fields to update. Absent fields are left unchanged.", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "new": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org" + ] + }, + "old": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/UpdateRuleResponse" + } + } + }, + "description": "Rule updated, returns old and new states." + }, + "400": { + "$ref": "#/components/responses/InvalidArgument" + }, + "401": { + "$ref": "#/components/responses/Unauthenticated" + }, + "403": { + "$ref": "#/components/responses/PermissionDenied" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "500": { + "$ref": "#/components/responses/InternalError" + } + }, + "summary": "Update rule", + "tags": [ + "rules" + ] + }, + "references": [ + { + "ref": "#/components/responses/Conflict", + "url": null + }, + { + "ref": "#/components/responses/InternalError", + "url": null + }, + { + "ref": "#/components/responses/InvalidArgument", + "url": null + }, + { + "ref": "#/components/responses/NotFound", + "url": null + }, + { + "ref": "#/components/responses/PermissionDenied", + "url": null + }, + { + "ref": "#/components/responses/Unauthenticated", + "url": null + }, + { + "ref": "#/components/schemas/UpdateRuleRequest", + "url": "/reference/api/ai-governance/latest/schemas/UpdateRuleRequest/" + }, + { + "ref": "#/components/schemas/UpdateRuleResponse", + "url": "/reference/api/ai-governance/latest/schemas/UpdateRuleResponse/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/UpdateRuleRequest" + }, + "security": [ + { + "bearerAuth": [] + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "description": "Short-lived JWT obtained by exchanging Docker Hub credentials at\n`POST https://hub.docker.com/v2/auth/token`. Pass the JWT in the\n`Authorization: Bearer \u003ctoken\u003e` header. Tokens expire after a short\nperiod; request a fresh one when you receive a `401`.\n\nThe `password` field of the token request accepts any of the following\ncredential types:\n\n| Type | Format | Notes |\n|------|--------|-------|\n| Password | Plain text | Your Docker Hub account password. |\n| Personal Access Token (PAT) | `dckr_pat_*` | Recommended over passwords. Create one under Account Settings → Security. |\n| Organization Access Token (OAT) | `dckr_oat_*` | Scoped to an organization. Create one under Organization Settings → Access Tokens. |\n\nPAT and OAT strings can't be used directly as a bearer token. They must\nbe exchanged at the token endpoint first.\n\nSee [Docker Hub authentication](https://docs.docker.com/reference/api/hub/latest/operations/AuthCreateAccessToken/)\nfor full details.\n", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/v2" + } + ], + "summary": "Update rule", + "tags": [ + "rules" + ], + "url": "/reference/api/ai-governance/latest/operations/updateRule/", + "variants": [ + { + "description": "Fields to update. Absent fields are left unchanged.", + "direction": "Request", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"resources\": [\n \"research.mitre.org\"\n ]\n}", + "value": { + "resources": [ + "research.mitre.org" + ] + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/patch/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/UpdateRuleRequest" + }, + "status": "" + }, + { + "description": "Rule updated, returns old and new states.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"new\": {\n \"actions\": [\n \"connect:tcp\",\n \"connect:udp\"\n ],\n \"decision\": \"allow\",\n \"id\": \"rule_06evsm9qjm1pdsk0a8nkfaxy7jna\",\n \"name\": \"allow research mirrors\",\n \"resources\": [\n \"research.mitre.org\"\n ]\n },\n \"old\": {\n \"actions\": [\n \"connect:tcp\",\n \"connect:udp\"\n ],\n \"decision\": \"allow\",\n \"id\": \"rule_06evsm9qjm1pdsk0a8nkfaxy7jna\",\n \"name\": \"allow research mirrors\",\n \"resources\": [\n \"research.mitre.org\",\n \"cve.mitre.org\"\n ]\n }\n}", + "value": { + "new": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org" + ] + }, + "old": { + "actions": [ + "connect:tcp", + "connect:udp" + ], + "decision": "allow", + "id": "rule_06evsm9qjm1pdsk0a8nkfaxy7jna", + "name": "allow research mirrors", + "resources": [ + "research.mitre.org", + "cve.mitre.org" + ] + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/patch/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/UpdateRuleResponse" + }, + "status": "200" + }, + { + "description": "Bad request", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"invalid_argument\",\n \"message\": \"name is required\"\n }\n}", + "value": { + "error": { + "code": "invalid_argument", + "message": "name is required" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/patch/responses/400/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "400" + }, + { + "description": "Missing or invalid credentials", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"unauthenticated\",\n \"message\": \"unauthenticated\"\n }\n}", + "value": { + "error": { + "code": "unauthenticated", + "message": "unauthenticated" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/patch/responses/401/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "401" + }, + { + "description": "Caller lacks the required permission for this org, or the org is not entitled to use governance.\n", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"permission_denied\",\n \"message\": \"permission denied\"\n }\n}", + "value": { + "error": { + "code": "permission_denied", + "message": "permission denied" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/patch/responses/403/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "403" + }, + { + "description": "Not found", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"not_found\",\n \"message\": \"policy not found\"\n }\n}", + "value": { + "error": { + "code": "not_found", + "message": "policy not found" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/patch/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "Conflict", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"conflict\",\n \"message\": \"policy name already in use\"\n }\n}", + "value": { + "error": { + "code": "conflict", + "message": "policy name already in use" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/patch/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "Internal server error", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "default", + "text": "{\n \"error\": {\n \"code\": \"internal\",\n \"message\": \"internal error\"\n }\n}", + "value": { + "error": { + "code": "internal", + "message": "internal error" + } + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1orgs~1{org_name}~1governance~1policies~1{policy_id}~1rules~1{rule_id}/patch/responses/500/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "500" + } + ] + } + ], + "owner": "docker/governor-services", + "product": "ai-governance", + "schemaCount": 43, + "schemaURLs": { + "#/components/schemas/AllowlistV0": "/reference/api/ai-governance/latest/schemas/AllowlistV0/", + "#/components/schemas/CedarV1Policy": "/reference/api/ai-governance/latest/schemas/CedarV1Policy/", + "#/components/schemas/CreatePolicyRequest": "/reference/api/ai-governance/latest/schemas/CreatePolicyRequest/", + "#/components/schemas/CreateRuleRequest": "/reference/api/ai-governance/latest/schemas/CreateRuleRequest/", + "#/components/schemas/DeletePolicyResponse": "/reference/api/ai-governance/latest/schemas/DeletePolicyResponse/", + "#/components/schemas/DeleteRuleResponse": "/reference/api/ai-governance/latest/schemas/DeleteRuleResponse/", + "#/components/schemas/Error": "/reference/api/ai-governance/latest/schemas/Error/", + "#/components/schemas/Policy": "/reference/api/ai-governance/latest/schemas/Policy/", + "#/components/schemas/PolicySummary": "/reference/api/ai-governance/latest/schemas/PolicySummary/", + "#/components/schemas/Rule": "/reference/api/ai-governance/latest/schemas/Rule/", + "#/components/schemas/RuleActions": "/reference/api/ai-governance/latest/schemas/RuleActions/", + "#/components/schemas/RuleDecision": "/reference/api/ai-governance/latest/schemas/RuleDecision/", + "#/components/schemas/RuleResources": "/reference/api/ai-governance/latest/schemas/RuleResources/", + "#/components/schemas/Scope": "/reference/api/ai-governance/latest/schemas/Scope/", + "#/components/schemas/ScopePatch": "/reference/api/ai-governance/latest/schemas/ScopePatch/", + "#/components/schemas/UpdatePolicyRequest": "/reference/api/ai-governance/latest/schemas/UpdatePolicyRequest/", + "#/components/schemas/UpdatePolicyResponse": "/reference/api/ai-governance/latest/schemas/UpdatePolicyResponse/", + "#/components/schemas/UpdateRuleRequest": "/reference/api/ai-governance/latest/schemas/UpdateRuleRequest/", + "#/components/schemas/UpdateRuleResponse": "/reference/api/ai-governance/latest/schemas/UpdateRuleResponse/" + }, + "schemas": [ + { + "name": "AllowlistV0", + "pointer": "/components/schemas/AllowlistV0", + "schema": { + "description": "Network or filesystem allowlist containing a list of rules. Present on\nPolicy when `PolicySummary.type` is `allowlist_v0`; omitted when the\npolicy has no rules yet. All rules in an allowlist share the same domain.\nAll rules are evaluated on every request: `deny` always wins over `allow`.\n", + "properties": { + "domain": { + "description": "The access-control domain shared by all rules in this allowlist. Derived from rule actions: network actions (`connect:tcp`, `connect:udp`) produce `network`; filesystem actions (`read`, `write`) produce `filesystem`. Present when `rules` is non-empty; absent when the allowlist has no rules.\n", + "enum": [ + "network", + "filesystem" + ], + "examples": [ + "network" + ], + "type": "string" + }, + "rules": { + "items": { + "$ref": "#/components/schemas/Rule" + }, + "type": "array" + } + }, + "required": [ + "rules" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/AllowlistV0/" + }, + { + "name": "CedarV1Policy", + "pointer": "/components/schemas/CedarV1Policy", + "schema": { + "description": "Cedar:V1 policy body. Present on `Policy` when `PolicySummary.type` is `cedar_v1`. Cedar policies encode their rules directly in `text` rather than in the rules sub-resource; the rules endpoints are not available for Cedar policies.\n", + "properties": { + "schema_url": { + "description": "URL of the Cedar schema this policy was authored against. The evaluator looks up the schema by this URL from its built-in registry. Use `https://schemas.docker.com/policy/cedar/v1/mcp/v0` for MCP policies.\n", + "examples": [ + "https://schemas.docker.com/policy/cedar/v1/mcp/v0" + ], + "type": "string" + }, + "text": { + "description": "One or more Cedar `permit` or `forbid` statements. Must be syntactically valid Cedar and must not carry an `@id` annotation (IDs are server-assigned).\n", + "examples": [ + "permit(principal, action == MCP::Action::\"call_tool\", resource is MCP::Tool);" + ], + "type": "string" + } + }, + "required": [ + "text", + "schema_url" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/CedarV1Policy/" + }, + { + "name": "CreatePolicyRequest", + "pointer": "/components/schemas/CreatePolicyRequest", + "schema": { + "description": "Fields required to create a new policy. Omitting `cedar_v1` creates an `allowlist_v0` policy with an empty rule set. Supplying `cedar_v1` creates a Cedar:V1 policy; rules are embedded in the Cedar text rather than managed via the rules sub-resource.\n", + "properties": { + "cedar_v1": { + "$ref": "#/components/schemas/CedarV1Policy" + }, + "name": { + "description": "Policy name, unique within the organization.", + "examples": [ + "Security Research — hardened" + ], + "type": "string" + }, + "scope": { + "$ref": "#/components/schemas/Scope" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/CreatePolicyRequest/" + }, + { + "name": "CreateRuleRequest", + "pointer": "/components/schemas/CreateRuleRequest", + "schema": { + "description": "Fields required to create a new rule within a policy's rule set.", + "properties": { + "actions": { + "$ref": "#/components/schemas/RuleActions" + }, + "decision": { + "$ref": "#/components/schemas/RuleDecision" + }, + "name": { + "description": "Human-readable label for the rule.", + "examples": [ + "allow research mirrors" + ], + "type": "string" + }, + "resources": { + "$ref": "#/components/schemas/RuleResources" + } + }, + "required": [ + "name", + "actions", + "resources", + "decision" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/CreateRuleRequest/" + }, + { + "name": "DeletePolicyResponse", + "pointer": "/components/schemas/DeletePolicyResponse", + "schema": { + "description": "The full deleted policy.", + "properties": { + "deleted": { + "$ref": "#/components/schemas/Policy" + } + }, + "required": [ + "deleted" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/DeletePolicyResponse/" + }, + { + "name": "DeleteRuleResponse", + "pointer": "/components/schemas/DeleteRuleResponse", + "schema": { + "description": "The deleted rule.", + "properties": { + "deleted": { + "$ref": "#/components/schemas/Rule" + } + }, + "required": [ + "deleted" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/DeleteRuleResponse/" + }, + { + "name": "Error", + "pointer": "/components/schemas/Error", + "schema": { + "description": "Error envelope returned on all non-2xx responses.", + "properties": { + "error": { + "description": "Error detail.", + "examples": [ + { + "code": "not_found", + "message": "policy not found" + } + ], + "properties": { + "code": { + "description": "Machine-readable error code. `not_found`: the requested resource does not exist, the org does not exist, or the caller is not a member of the organization (the organization's existence is not revealed to callers who cannot access it). `conflict`: a resource with the same name already exists. `invalid_argument`: the request body is malformed or fails validation. `unauthenticated`: missing or invalid credentials. `permission_denied`: the org is not entitled to use governance. `limit_exceeded`: the org has reached its maximum number of policies, or the policy has reached its maximum number of rules. `unimplemented`: the endpoint or feature is not yet available. `internal`: unexpected server error.\n", + "enum": [ + "not_found", + "conflict", + "invalid_argument", + "unauthenticated", + "permission_denied", + "limit_exceeded", + "unimplemented", + "internal" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/Error/" + }, + { + "name": "Policy", + "pointer": "/components/schemas/Policy", + "schema": { + "description": "Full policy representation. Exactly one of `allowlist_v0` or `cedar_v1` is present, depending on the policy type.\n", + "properties": { + "allowlist_v0": { + "$ref": "#/components/schemas/AllowlistV0" + }, + "cedar_v1": { + "$ref": "#/components/schemas/CedarV1Policy" + }, + "created_at": { + "examples": [ + "2026-04-22T00:00:00Z" + ], + "format": "date-time", + "type": "string" + }, + "id": { + "examples": [ + "pol_06evsmp24r1pg71cm8500546pkbn" + ], + "type": "string" + }, + "name": { + "description": "Human-readable label, unique within the organization.", + "examples": [ + "Security Research — hardened" + ], + "type": "string" + }, + "org": { + "examples": [ + "my-org" + ], + "type": "string" + }, + "scope": { + "$ref": "#/components/schemas/Scope" + }, + "updated_at": { + "examples": [ + "2026-04-22T00:00:00Z" + ], + "format": "date-time", + "type": "string" + } + }, + "required": [ + "id", + "name", + "org", + "scope", + "created_at", + "updated_at" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/Policy/" + }, + { + "name": "PolicySummary", + "pointer": "/components/schemas/PolicySummary", + "schema": { + "description": "Shallow policy representation returned by ListPolicies. Excludes the rule set.", + "properties": { + "created_at": { + "examples": [ + "2026-04-22T00:00:00Z" + ], + "format": "date-time", + "type": "string" + }, + "id": { + "examples": [ + "pol_06evsmp24r1pg71cm8500546pkbn" + ], + "type": "string" + }, + "name": { + "description": "Human-readable label, unique within the organization.", + "examples": [ + "Security Research — hardened" + ], + "type": "string" + }, + "org": { + "examples": [ + "my-org" + ], + "type": "string" + }, + "scope": { + "$ref": "#/components/schemas/Scope" + }, + "type": { + "description": "Identifies the policy type. `allowlist_v0` for network/filesystem allowlist policies; `cedar_v1` for Cedar language policies.\n", + "enum": [ + "allowlist_v0", + "cedar_v1" + ], + "examples": [ + "allowlist_v0" + ], + "type": "string" + }, + "updated_at": { + "examples": [ + "2026-04-22T00:00:00Z" + ], + "format": "date-time", + "type": "string" + } + }, + "required": [ + "id", + "name", + "org", + "scope", + "created_at", + "updated_at", + "type" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/PolicySummary/" + }, + { + "name": "Rule", + "pointer": "/components/schemas/Rule", + "schema": { + "description": "A single allow or deny rule within an allowlist policy.", + "properties": { + "actions": { + "$ref": "#/components/schemas/RuleActions" + }, + "decision": { + "$ref": "#/components/schemas/RuleDecision" + }, + "id": { + "examples": [ + "rule_06evsm9qjm1pdsk0a8nkfaxy7jna" + ], + "type": "string" + }, + "name": { + "description": "Human-readable label for the rule.", + "examples": [ + "allow research mirrors" + ], + "type": "string" + }, + "resources": { + "$ref": "#/components/schemas/RuleResources" + } + }, + "required": [ + "id", + "name", + "actions", + "resources", + "decision" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/Rule/" + }, + { + "name": "RuleActions", + "pointer": "/components/schemas/RuleActions", + "schema": { + "description": "Network actions: `connect:tcp`, `connect:udp`. Filesystem actions: `read`, `write`. All actions in a rule must belong to the same domain; mixing network and filesystem actions in one rule is rejected.\n", + "examples": [ + [ + "connect:tcp", + "connect:udp" + ] + ], + "items": { + "enum": [ + "connect:tcp", + "connect:udp", + "read", + "write" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "url": "/reference/api/ai-governance/latest/schemas/RuleActions/" + }, + { + "name": "RuleDecision", + "pointer": "/components/schemas/RuleDecision", + "schema": { + "description": "Outcome applied when this rule matches a request. `deny` always wins: if any rule in the policy matches with `decision: deny`, the request is denied even if other rules match with `decision: allow`.\n", + "enum": [ + "allow", + "deny" + ], + "examples": [ + "allow" + ], + "type": "string" + }, + "url": "/reference/api/ai-governance/latest/schemas/RuleDecision/" + }, + { + "name": "RuleResources", + "pointer": "/components/schemas/RuleResources", + "schema": { + "description": "Network domain: hostnames (for example, `example.com`), wildcard subdomains (`*.example.com` or `**.example.com`), hostnames with port (for example, `example.com:443`), or CIDRs in IPv4 or IPv6 notation (for example, `10.0.0.0/8` or `2001:db8::/32`). Filesystem domain: paths (for example, `/data`); `*` matches within one path segment, `**` matches recursively (for example, `/data/**`).\n", + "examples": [ + [ + "research.mitre.org", + "cve.mitre.org" + ] + ], + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "url": "/reference/api/ai-governance/latest/schemas/RuleResources/" + }, + { + "name": "Scope", + "pointer": "/components/schemas/Scope", + "schema": { + "description": "Restricts the policy to specific teams. An empty or absent list means the policy applies org-wide.", + "properties": { + "teams": { + "description": "Team IDs the policy applies to. Each must be a valid team in the organization.", + "examples": [ + [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/Scope/" + }, + { + "name": "ScopePatch", + "pointer": "/components/schemas/ScopePatch", + "schema": { + "description": "Per-sub-field patch of a policy's scope. An omitted sub-field is left unchanged; a present list replaces that dimension, and an empty list clears it (making the policy org-wide for that dimension).\n", + "properties": { + "teams": { + "examples": [ + [ + "d290f1ee-6c54-4b01-90e6-d701748f0851" + ] + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/ScopePatch/" + }, + { + "name": "UpdatePolicyRequest", + "pointer": "/components/schemas/UpdatePolicyRequest", + "schema": { + "description": "Partial update of a policy. Only fields present in the body are updated; absent fields are left unchanged. At least one field must be present. For `cedar_v1` policies, supply `cedar_v1` to replace the policy text; `name` and `scope` may be combined freely.\n", + "properties": { + "cedar_v1": { + "$ref": "#/components/schemas/CedarV1Policy" + }, + "name": { + "description": "Policy name, unique within the organization.", + "examples": [ + "Security Research" + ], + "minLength": 1, + "type": "string" + }, + "scope": { + "$ref": "#/components/schemas/ScopePatch" + } + }, + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/UpdatePolicyRequest/" + }, + { + "name": "UpdatePolicyResponse", + "pointer": "/components/schemas/UpdatePolicyResponse", + "schema": { + "description": "The full policy before and after the update.", + "properties": { + "new": { + "$ref": "#/components/schemas/Policy" + }, + "old": { + "$ref": "#/components/schemas/Policy" + } + }, + "required": [ + "old", + "new" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/UpdatePolicyResponse/" + }, + { + "name": "UpdateRuleRequest", + "pointer": "/components/schemas/UpdateRuleRequest", + "schema": { + "description": "Partial update. Only fields present in the body are updated; absent fields are left unchanged.", + "properties": { + "actions": { + "$ref": "#/components/schemas/RuleActions" + }, + "decision": { + "$ref": "#/components/schemas/RuleDecision" + }, + "name": { + "description": "Human-readable label for the rule.", + "examples": [ + "allow research mirrors" + ], + "type": "string" + }, + "resources": { + "$ref": "#/components/schemas/RuleResources" + } + }, + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/UpdateRuleRequest/" + }, + { + "name": "UpdateRuleResponse", + "pointer": "/components/schemas/UpdateRuleResponse", + "schema": { + "description": "The rule state before and after the update.", + "properties": { + "new": { + "$ref": "#/components/schemas/Rule" + }, + "old": { + "$ref": "#/components/schemas/Rule" + } + }, + "required": [ + "old", + "new" + ], + "type": "object" + }, + "url": "/reference/api/ai-governance/latest/schemas/UpdateRuleResponse/" + } + ], + "securitySchemes": { + "bearerAuth": { + "bearerFormat": "JWT", + "description": "Short-lived JWT obtained by exchanging Docker Hub credentials at\n`POST https://hub.docker.com/v2/auth/token`. Pass the JWT in the\n`Authorization: Bearer \u003ctoken\u003e` header. Tokens expire after a short\nperiod; request a fresh one when you receive a `401`.\n\nThe `password` field of the token request accepts any of the following\ncredential types:\n\n| Type | Format | Notes |\n|------|--------|-------|\n| Password | Plain text | Your Docker Hub account password. |\n| Personal Access Token (PAT) | `dckr_pat_*` | Recommended over passwords. Create one under Account Settings → Security. |\n| Organization Access Token (OAT) | `dckr_oat_*` | Scoped to an organization. Create one under Organization Settings → Access Tokens. |\n\nPAT and OAT strings can't be used directly as a bearer token. They must\nbe exchanged at the token endpoint first.\n\nSee [Docker Hub authentication](https://docs.docker.com/reference/api/hub/latest/operations/AuthCreateAccessToken/)\nfor full details.\n", + "scheme": "bearer", + "type": "http" + } + }, + "servers": [ + { + "url": "https://hub.docker.com/v2" + } + ], + "source": "content/reference/api/ai-governance/api.yaml", + "sourceURL": "/reference/api/ai-governance/api.yaml", + "tags": [ + { + "description": "Policy lifecycle management", + "kind": "nav", + "name": "policies", + "summary": "Policies" + }, + { + "description": "Rule management within an allowlist policy", + "kind": "nav", + "name": "rules", + "summary": "Rules" + } + ], + "title": "AI Governance", + "url": "/reference/api/ai-governance/latest/", + "version": "1" + }, + { + "connection": "hosted", + "description": "Use this API to create sandboxes, run processes, work with files, and manage sandbox resources. Start with a kit through the SDK, or use the HTTP operations here directly.\n\nManagement requests use an Authorization bearer token. File and process requests go to the sandbox endpoint in core.endpoint.uri and require a short-lived scoped endpoint credential, not the management token. The SDK obtains that credential for you. Each operation also checks its declared permissions. Direct Unix socket access uses the operating system's socket access controls instead of HTTP authentication. Interactive WebSocket operations describe their supported credential transports separately.\n\nThe Docker Cloud API base URL is https://connect.docker.com/sandboxes. Append each /v1 path without removing the base URL's path prefix. For sandbox endpoint operations, use the sandbox endpoint as the base URL instead.\n\nOperations list their success and error responses. A 202 response means work is still in progress; read the resource until it reaches the expected state. Errors contain a stable code, a message, and optional details. Inspect the code as well as the HTTP status.\n\nSend the current ETag in If-Match when an operation requires it. Operations that accept Idempotency-Key use that HTTP header to identify retries: the same key and payload return the first result; a different payload fails. Keys are retained for at least 24 hours.\n\nLists use pageSize and pageToken. Continue with nextPageToken until it is empty. Supported filters and ordering are listed on each operation. Resource names contain immutable identifiers; displayName is a label. A 64-bit integer is returned as a JSON string; inputs accept a number or a string.", + "diagnostics": [], + "digest": "150e4a3299c8cd2372aa18c3d2c4f6313e9833532924ae9be2907b0a233e9aba", + "exampleCount": 81, + "experimental": true, + "guides": [ + "/manuals/ai/sandboxes-api/authentication.md", + "/manuals/ai/sandboxes-api/get-started.md" + ], + "id": "sandboxes", + "manual": "/manuals/ai/sandboxes-api/", + "operations": [ + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://sandbox.invalid/v1/files?path=%3CPATH%3E'", + "curlNotes": [], + "deprecated": null, + "description": "List lists directory entries by path ascending.", + "id": "list", + "line": 26, + "method": "GET", + "parameters": [ + { + "description": "path is the directory path.", + "in": "query", + "name": "path", + "pointer": "/paths/~1v1~1files/get/parameters/0", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + }, + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "pointer": "/paths/~1v1~1files/get/parameters/1", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an optional continuation token.", + "in": "query", + "name": "pageToken", + "pointer": "/paths/~1v1~1files/get/parameters/2", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable field is\npath.", + "in": "query", + "name": "orderBy", + "pointer": "/paths/~1v1~1files/get/parameters/3", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "path": "/v1/files", + "pointer": "/paths/~1v1~1files/get", + "raw": { + "description": "List lists directory entries by path ascending.", + "operationId": "list", + "parameters": [ + { + "description": "path is the directory path.", + "in": "query", + "name": "path", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + }, + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an optional continuation token.", + "in": "query", + "name": "pageToken", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable field is\npath.", + "in": "query", + "name": "orderBy", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilesListResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "List lists directory entries by path ascending.", + "tags": [ + "Files" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesFilesRead" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/FilesListResponse", + "url": "/reference/api/sandboxes/latest/schemas/FilesListResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "List lists directory entries by path ascending.", + "tags": [ + "Files" + ], + "url": "/reference/api/sandboxes/latest/operations/list/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/FilesListResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request DELETE \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://sandbox.invalid/v1/files?path=%3CPATH%3E'", + "curlNotes": [], + "deprecated": null, + "description": "Remove deletes a path. Removing an absent path succeeds. A nonrecursive\nremoval of a nonempty directory returns FAILED_PRECONDITION unchanged.\nA recursive removal that stops partway still answers OK: check\nRemoveResponse.failed_path, not the operation status. Removed paths stay removed.", + "id": "remove", + "line": 94, + "method": "DELETE", + "parameters": [ + { + "description": "path is the sandbox path to remove.", + "in": "query", + "name": "path", + "pointer": "/paths/~1v1~1files/delete/parameters/0", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + }, + { + "description": "recursive removes directory contents when true.", + "in": "query", + "name": "recursive", + "pointer": "/paths/~1v1~1files/delete/parameters/1", + "required": false, + "schema": { + "title": "recursive", + "type": "boolean" + } + } + ], + "path": "/v1/files", + "pointer": "/paths/~1v1~1files/delete", + "raw": { + "description": "Remove deletes a path. Removing an absent path succeeds. A nonrecursive\nremoval of a nonempty directory returns FAILED_PRECONDITION unchanged.\nA recursive removal that stops partway still answers OK: check\nRemoveResponse.failed_path, not the operation status. Removed paths stay removed.", + "operationId": "remove", + "parameters": [ + { + "description": "path is the sandbox path to remove.", + "in": "query", + "name": "path", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + }, + { + "description": "recursive removes directory contents when true.", + "in": "query", + "name": "recursive", + "required": false, + "schema": { + "title": "recursive", + "type": "boolean" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilesRemoveResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Remove deletes a path.", + "tags": [ + "Files" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesFilesWrite" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/FilesRemoveResponse", + "url": "/reference/api/sandboxes/latest/schemas/FilesRemoveResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Remove deletes a path.", + "tags": [ + "Files" + ], + "url": "/reference/api/sandboxes/latest/operations/remove/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files/delete/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/FilesRemoveResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files/delete/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/octet-stream", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/octet-stream' \\\n 'https://sandbox.invalid/v1/files/content?path=%3CPATH%3E'", + "curlNotes": [], + "deprecated": null, + "description": "ReadFile returns raw file content over HTTP; Stat exposes file metadata.\nContent above the unary message cap is refused, never truncated.", + "id": "readFile", + "line": 148, + "method": "GET", + "parameters": [ + { + "description": "path is the sandbox path of a regular file.", + "in": "query", + "name": "path", + "pointer": "/paths/~1v1~1files~1content/get/parameters/0", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + } + ], + "path": "/v1/files/content", + "pointer": "/paths/~1v1~1files~1content/get", + "raw": { + "description": "ReadFile returns raw file content over HTTP; Stat exposes file metadata.\nContent above the unary message cap is refused, never truncated.", + "operationId": "readFile", + "parameters": [ + { + "description": "path is the sandbox path of a regular file.", + "in": "query", + "name": "path", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/octet-stream": { + "schema": { + "contentMediaType": "application/octet-stream" + } + } + }, + "description": "Success", + "headers": { + "Content-Length": { + "description": "Exact byte count of the complete file; this response does not use chunked transfer encoding.", + "required": true, + "schema": { + "minimum": 0, + "type": "integer" + } + } + } + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "ReadFile returns raw file content over HTTP; Stat exposes file metadata.", + "tags": [ + "Files" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-http-transfer": { + "response": { + "bytesField": "data", + "mediaType": "application/octet-stream" + } + }, + "x-sbx-plane": "data", + "x-sbx-request-schema": { + "$ref": "#/components/schemas/FilesReadFileRequest" + }, + "x-sbx-required-permissions": [ + "sandboxesFilesRead" + ], + "x-sbx-response-schema": { + "$ref": "#/components/schemas/FilesReadFileResponse" + }, + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/FilesReadFileRequest", + "url": "/reference/api/sandboxes/latest/schemas/FilesReadFileRequest/" + }, + { + "ref": "#/components/schemas/FilesReadFileResponse", + "url": "/reference/api/sandboxes/latest/schemas/FilesReadFileResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "ReadFile returns raw file content over HTTP; Stat exposes file metadata.", + "tags": [ + "Files" + ], + "url": "/reference/api/sandboxes/latest/operations/readFile/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "Content-Length": { + "description": "Exact byte count of the complete file; this response does not use chunked transfer encoding.", + "required": true, + "schema": { + "minimum": 0, + "type": "integer" + } + } + }, + "media": "application/octet-stream", + "pointer": "/paths/~1v1~1files~1content/get/responses/200/content/application~1octet-stream", + "required": null, + "schema": { + "contentMediaType": "application/octet-stream" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1content/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PUT \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/octet-stream' \\\n --data-binary @request-body \\\n 'https://sandbox.invalid/v1/files/content?path=%3CPATH%3E'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "WriteFile accepts raw content with path and mode query parameters.\nIt replaces the complete target state and carries no request_id.", + "id": "writeFile", + "line": 207, + "method": "PUT", + "parameters": [ + { + "description": "path is the sandbox path.", + "in": "query", + "name": "path", + "pointer": "/paths/~1v1~1files~1content/put/parameters/0", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + }, + { + "description": "mode carries Unix permission bits. Upload applies mode \u0026 0777, or 0644 when\nthat value is zero, without subtracting umask; Download reports stored bits.", + "in": "query", + "name": "mode", + "pointer": "/paths/~1v1~1files~1content/put/parameters/1", + "required": false, + "schema": { + "title": "mode", + "type": "integer" + } + } + ], + "path": "/v1/files/content", + "pointer": "/paths/~1v1~1files~1content/put", + "raw": { + "description": "WriteFile accepts raw content with path and mode query parameters.\nIt replaces the complete target state and carries no request_id.", + "operationId": "writeFile", + "parameters": [ + { + "description": "path is the sandbox path.", + "in": "query", + "name": "path", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + }, + { + "description": "mode carries Unix permission bits. Upload applies mode \u0026 0777, or 0644 when\nthat value is zero, without subtracting umask; Download reports stored bits.", + "in": "query", + "name": "mode", + "required": false, + "schema": { + "title": "mode", + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "contentMediaType": "application/octet-stream" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilesWriteFileResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "WriteFile accepts raw content with path and mode query parameters.", + "tags": [ + "Files" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-http-transfer": { + "request": { + "bytesField": "data", + "mediaType": "application/octet-stream" + } + }, + "x-sbx-plane": "data", + "x-sbx-request-schema": { + "$ref": "#/components/schemas/FilesWriteFileRequest" + }, + "x-sbx-required-permissions": [ + "sandboxesFilesWrite" + ], + "x-sbx-response-schema": { + "$ref": "#/components/schemas/FilesWriteFileResponse" + }, + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/FilesWriteFileRequest", + "url": "/reference/api/sandboxes/latest/schemas/FilesWriteFileRequest/" + }, + { + "ref": "#/components/schemas/FilesWriteFileResponse", + "url": "/reference/api/sandboxes/latest/schemas/FilesWriteFileResponse/" + } + ], + "requestSchema": { + "contentMediaType": "application/octet-stream" + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "WriteFile accepts raw content with path and mode query parameters.", + "tags": [ + "Files" + ], + "url": "/reference/api/sandboxes/latest/operations/writeFile/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/octet-stream", + "pointer": "/paths/~1v1~1files~1content/put/requestBody/content/application~1octet-stream", + "required": true, + "schema": { + "contentMediaType": "application/octet-stream" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1content/put/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/FilesWriteFileResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1content/put/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PUT \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://sandbox.invalid/v1/files/directories'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "Mkdir creates a directory. Without parents, a missing parent returns\nNOT_FOUND without creating directories. A repeated Mkdir converges when\nthe leaf already exists as a directory. A converged call leaves\nthe directory's mode unchanged on every request.", + "id": "mkdir", + "line": 275, + "method": "PUT", + "parameters": [], + "path": "/v1/files/directories", + "pointer": "/paths/~1v1~1files~1directories/put", + "raw": { + "description": "Mkdir creates a directory. Without parents, a missing parent returns\nNOT_FOUND without creating directories. A repeated Mkdir converges when\nthe leaf already exists as a directory. A converged call leaves\nthe directory's mode unchanged on every request.", + "operationId": "mkdir", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilesMkdirRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilesMkdirResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Mkdir creates a directory.", + "tags": [ + "Files" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesFilesWrite" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/FilesMkdirRequest", + "url": "/reference/api/sandboxes/latest/schemas/FilesMkdirRequest/" + }, + { + "ref": "#/components/schemas/FilesMkdirResponse", + "url": "/reference/api/sandboxes/latest/schemas/FilesMkdirResponse/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/FilesMkdirRequest" + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Mkdir creates a directory.", + "tags": [ + "Files" + ], + "url": "/reference/api/sandboxes/latest/operations/mkdir/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1directories/put/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/FilesMkdirRequest" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1directories/put/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/FilesMkdirResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1directories/put/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "multipart/mixed", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: multipart/mixed' \\\n 'https://sandbox.invalid/v1/files/download?paths=%3CPATHS%3E'", + "curlNotes": [], + "deprecated": null, + "description": "Download streams file headers, bytes, and per-file errors. A path that\nleaves the jail through a symlink, or names a non-regular object, reports\na FileError with a error reason instead of reading through it.", + "id": "download", + "line": 319, + "method": "GET", + "parameters": [ + { + "description": "paths naming stable regular files or absent entries at canonical absolute paths\nyield contiguous results in request order, including duplicates.", + "in": "query", + "name": "paths", + "pointer": "/paths/~1v1~1files~1download/get/parameters/0", + "required": true, + "schema": { + "items": { + "type": "string" + }, + "minItems": 1, + "title": "paths", + "type": "array" + } + } + ], + "path": "/v1/files/download", + "pointer": "/paths/~1v1~1files~1download/get", + "raw": { + "description": "Download streams file headers, bytes, and per-file errors. A path that\nleaves the jail through a symlink, or names a non-regular object, reports\na FileError with a error reason instead of reading through it.", + "operationId": "download", + "parameters": [ + { + "description": "paths naming stable regular files or absent entries at canonical absolute paths\nyield contiguous results in request order, including duplicates.", + "in": "query", + "name": "paths", + "required": true, + "schema": { + "items": { + "type": "string" + }, + "minItems": 1, + "title": "paths", + "type": "array" + } + } + ], + "responses": { + "200": { + "content": { + "multipart/mixed": { + "itemEncoding": { + "contentType": "application/json, application/octet-stream", + "headers": { + "Content-Disposition": { + "required": true, + "schema": { + "enum": [ + "attachment; name=metadata", + "attachment; name=content", + "attachment; name=error", + "attachment; name=stream-error" + ], + "type": "string" + } + } + } + }, + "itemSchema": { + "anyOf": [ + { + "$ref": "#/components/schemas/FileHeader" + }, + { + "contentMediaType": "application/octet-stream" + }, + { + "$ref": "#/components/schemas/FileError" + }, + { + "$ref": "#/components/schemas/Error" + } + ] + }, + "x-sbx-framing": { + "description": "Read metadata followed by one continuous raw content part. JSON controls are separate parts with Content-Type application/json; binary content uses application/octet-stream. A final stream-error part carries the shared Error for a whole-stream failure. A clean closing delimiter with no stream-error is required for success; aborted connections are failures.", + "parts": { + "content": { + "contentType": "application/octet-stream", + "schema": { + "contentMediaType": "application/octet-stream" + } + }, + "error": { + "contentType": "application/json", + "schema": { + "$ref": "#/components/schemas/FileError" + } + }, + "metadata": { + "contentType": "application/json", + "schema": { + "$ref": "#/components/schemas/FileHeader" + } + }, + "stream-error": { + "contentType": "application/json", + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "repeatedItems": true, + "requiresClosingDelimiter": true, + "requiresTerminal": false + } + } + }, + "description": "Success\n\nRead metadata followed by one continuous raw content part. JSON controls are separate parts with Content-Type application/json; binary content uses application/octet-stream. A final stream-error part carries the shared Error for a whole-stream failure. A clean closing delimiter with no stream-error is required for success; aborted connections are failures." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Download streams file headers, bytes, and per-file errors.", + "tags": [ + "Files" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-http-transfer": { + "response": { + "bytesField": "data", + "errorField": "error", + "mediaType": "multipart/mixed", + "metadataField": "header", + "repeatedItems": true + } + }, + "x-sbx-plane": "data", + "x-sbx-request-schema": { + "$ref": "#/components/schemas/FilesDownloadRequest" + }, + "x-sbx-required-permissions": [ + "sandboxesFilesRead" + ], + "x-sbx-response-schema": { + "$ref": "#/components/schemas/FilesDownloadResponse" + }, + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/FileError", + "url": "/reference/api/sandboxes/latest/schemas/FileError/" + }, + { + "ref": "#/components/schemas/FileHeader", + "url": "/reference/api/sandboxes/latest/schemas/FileHeader/" + }, + { + "ref": "#/components/schemas/FilesDownloadRequest", + "url": "/reference/api/sandboxes/latest/schemas/FilesDownloadRequest/" + }, + { + "ref": "#/components/schemas/FilesDownloadResponse", + "url": "/reference/api/sandboxes/latest/schemas/FilesDownloadResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Download streams file headers, bytes, and per-file errors.", + "tags": [ + "Files" + ], + "url": "/reference/api/sandboxes/latest/operations/download/", + "variants": [ + { + "description": "Success\n\nRead metadata followed by one continuous raw content part. JSON controls are separate parts with Content-Type application/json; binary content uses application/octet-stream. A final stream-error part carries the shared Error for a whole-stream failure. A clean closing delimiter with no stream-error is required for success; aborted connections are failures.", + "direction": "Response", + "examples": [], + "headers": null, + "itemEncoding": { + "contentType": "application/json, application/octet-stream", + "headers": { + "Content-Disposition": { + "required": true, + "schema": { + "enum": [ + "attachment; name=metadata", + "attachment; name=content", + "attachment; name=error", + "attachment; name=stream-error" + ], + "type": "string" + } + } + } + }, + "itemSchema": { + "anyOf": [ + { + "$ref": "#/components/schemas/FileHeader" + }, + { + "contentMediaType": "application/octet-stream" + }, + { + "$ref": "#/components/schemas/FileError" + }, + { + "$ref": "#/components/schemas/Error" + } + ] + }, + "media": "multipart/mixed", + "pointer": "/paths/~1v1~1files~1download/get/responses/200/content/multipart~1mixed", + "required": null, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1download/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://sandbox.invalid/v1/files/move'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "Move renames or moves a path. The destination is exact: an existing regular\nfile is replaced, the source basename is never appended, and a directory\ndestination is refused unchanged. A source or destination that leaves the jail\nthrough a symlink refuses with FAILED_PRECONDITION and a error reason.", + "id": "move", + "line": 421, + "method": "POST", + "parameters": [], + "path": "/v1/files/move", + "pointer": "/paths/~1v1~1files~1move/post", + "raw": { + "description": "Move renames or moves a path. The destination is exact: an existing regular\nfile is replaced, the source basename is never appended, and a directory\ndestination is refused unchanged. A source or destination that leaves the jail\nthrough a symlink refuses with FAILED_PRECONDITION and a error reason.", + "operationId": "move", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilesMoveRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilesMoveResponse" + } + } + }, + "description": "Success" + }, + "409": { + "content": { + "application/json": { + "examples": { + "move_crosses_filesystem": { + "summary": "`from` and `to` are on different filesystems, and `Move` never copies the contents to cross the boundary.", + "value": { + "code": "failedPrecondition", + "message": "move_crosses_filesystem: `from` and `to` are on different filesystems, and `Move` never copies the contents to cross the boundary." + } + }, + "move_destination_is_directory": { + "summary": "`from` names a regular file and `to` an existing directory, which `Move` refuses rather than moving the file into it.", + "value": { + "code": "failedPrecondition", + "message": "move_destination_is_directory: `from` names a regular file and `to` an existing directory, which `Move` refuses rather than moving the file into it." + } + }, + "move_destination_occupied": { + "summary": "`from` names a directory and `to` an existing path, which `Move` refuses rather than replacing.", + "value": { + "code": "failedPrecondition", + "message": "move_destination_occupied: `from` names a directory and `to` an existing path, which `Move` refuses rather than replacing." + } + }, + "path_authority_nonregular_object": { + "summary": "The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required.", + "value": { + "code": "failedPrecondition", + "message": "path_authority_nonregular_object: The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required." + } + }, + "path_authority_symlink_escape": { + "summary": "The path resolves through a symlink that does not resolve to a target inside the sandbox jail.", + "value": { + "code": "failedPrecondition", + "message": "path_authority_symlink_escape: The path resolves through a symlink that does not resolve to a target inside the sandbox jail." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The path resolves through a symlink that does not resolve to a target inside the sandbox jail.\n\nThe path names an existing socket, FIFO, device, or other non-regular object where a regular file is required.\n\n`from` names a regular file and `to` an existing directory, which `Move` refuses rather than moving the file into it.\n\n`from` names a directory and `to` an existing path, which `Move` refuses rather than replacing.\n\n`from` and `to` are on different filesystems, and `Move` never copies the contents to cross the boundary." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Move renames or moves a path.", + "tags": [ + "Files" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The path resolves through a symlink that does not resolve to a target inside the sandbox jail.", + "reason": "path_authority_symlink_escape" + }, + { + "code": "FAILED_PRECONDITION", + "description": "The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required.", + "reason": "path_authority_nonregular_object" + }, + { + "code": "FAILED_PRECONDITION", + "description": "`from` names a regular file and `to` an existing directory, which `Move` refuses rather than moving the file into it.", + "reason": "move_destination_is_directory" + }, + { + "code": "FAILED_PRECONDITION", + "description": "`from` names a directory and `to` an existing path, which `Move` refuses rather than replacing.", + "reason": "move_destination_occupied" + }, + { + "code": "FAILED_PRECONDITION", + "description": "`from` and `to` are on different filesystems, and `Move` never copies the contents to cross the boundary.", + "reason": "move_crosses_filesystem" + } + ], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesFilesWrite" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/FilesMoveRequest", + "url": "/reference/api/sandboxes/latest/schemas/FilesMoveRequest/" + }, + { + "ref": "#/components/schemas/FilesMoveResponse", + "url": "/reference/api/sandboxes/latest/schemas/FilesMoveResponse/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/FilesMoveRequest" + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Move renames or moves a path.", + "tags": [ + "Files" + ], + "url": "/reference/api/sandboxes/latest/operations/move/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1move/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/FilesMoveRequest" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1move/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/FilesMoveResponse" + }, + "status": "200" + }, + { + "description": "The path resolves through a symlink that does not resolve to a target inside the sandbox jail.\n\nThe path names an existing socket, FIFO, device, or other non-regular object where a regular file is required.\n\n`from` names a regular file and `to` an existing directory, which `Move` refuses rather than moving the file into it.\n\n`from` names a directory and `to` an existing path, which `Move` refuses rather than replacing.\n\n`from` and `to` are on different filesystems, and `Move` never copies the contents to cross the boundary.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "move_crosses_filesystem", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"move_crosses_filesystem: `from` and `to` are on different filesystems, and `Move` never copies the contents to cross the boundary.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "move_crosses_filesystem: `from` and `to` are on different filesystems, and `Move` never copies the contents to cross the boundary." + } + }, + { + "language": "json", + "name": "move_destination_is_directory", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"move_destination_is_directory: `from` names a regular file and `to` an existing directory, which `Move` refuses rather than moving the file into it.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "move_destination_is_directory: `from` names a regular file and `to` an existing directory, which `Move` refuses rather than moving the file into it." + } + }, + { + "language": "json", + "name": "move_destination_occupied", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"move_destination_occupied: `from` names a directory and `to` an existing path, which `Move` refuses rather than replacing.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "move_destination_occupied: `from` names a directory and `to` an existing path, which `Move` refuses rather than replacing." + } + }, + { + "language": "json", + "name": "path_authority_nonregular_object", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"path_authority_nonregular_object: The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "path_authority_nonregular_object: The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required." + } + }, + { + "language": "json", + "name": "path_authority_symlink_escape", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"path_authority_symlink_escape: The path resolves through a symlink that does not resolve to a target inside the sandbox jail.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "path_authority_symlink_escape: The path resolves through a symlink that does not resolve to a target inside the sandbox jail." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1move/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1move/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://sandbox.invalid/v1/files/stat?path=%3CPATH%3E'", + "curlNotes": [], + "deprecated": null, + "description": "Stat reads metadata for one path.\nA metadata read has a different response from the file-content resource.", + "id": "stat", + "line": 522, + "method": "GET", + "parameters": [ + { + "description": "path is the sandbox path.", + "in": "query", + "name": "path", + "pointer": "/paths/~1v1~1files~1stat/get/parameters/0", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + } + ], + "path": "/v1/files/stat", + "pointer": "/paths/~1v1~1files~1stat/get", + "raw": { + "description": "Stat reads metadata for one path.\nA metadata read has a different response from the file-content resource.", + "operationId": "stat", + "parameters": [ + { + "description": "path is the sandbox path.", + "in": "query", + "name": "path", + "required": true, + "schema": { + "minLength": 1, + "title": "path", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilesStatResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Stat reads metadata for one path.", + "tags": [ + "Files" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesFilesRead" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/FilesStatResponse", + "url": "/reference/api/sandboxes/latest/schemas/FilesStatResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Stat reads metadata for one path.", + "tags": [ + "Files" + ], + "url": "/reference/api/sandboxes/latest/operations/stat/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1stat/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/FilesStatResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1stat/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: multipart/form-data' \\\n --data-binary @request-body \\\n 'https://sandbox.invalid/v1/files/upload'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "Upload streams one or more files. The first frame must be FileHeader.\nWriting through a symlink that leaves the jail, or onto an existing\nnon-regular object, refuses with FAILED_PRECONDITION and a error reason.", + "id": "upload", + "line": 567, + "method": "POST", + "parameters": [], + "path": "/v1/files/upload", + "pointer": "/paths/~1v1~1files~1upload/post", + "raw": { + "description": "Upload streams one or more files. The first frame must be FileHeader.\nWriting through a symlink that leaves the jail, or onto an existing\nnon-regular object, refuses with FAILED_PRECONDITION and a error reason.", + "operationId": "upload", + "requestBody": { + "content": { + "multipart/form-data": { + "itemEncoding": { + "contentType": "application/json, application/octet-stream" + }, + "itemSchema": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "metadata": { + "$ref": "#/components/schemas/FileHeader" + } + }, + "required": [ + "metadata" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "content": { + "contentMediaType": "application/octet-stream" + } + }, + "required": [ + "content" + ], + "type": "object" + } + ] + }, + "x-sbx-framing": { + "description": "Send ordered metadata/content pairs. Each metadata part is application/json; the following content part is application/octet-stream containing raw bytes, including an empty file. Content-Disposition is form-data with the corresponding part name. Content-Transfer-Encoding is refused. A clean closing multipart delimiter is required; truncated content never completes the current item. Malformed occurrences report invalidArgument with a BadRequest detail identifying the occurrence index and path.", + "partOrder": [ + "metadata", + "content" + ], + "repeatedItems": true, + "requiresClosingDelimiter": true + } + } + }, + "description": "Send ordered metadata/content pairs. Each metadata part is application/json; the following content part is application/octet-stream containing raw bytes, including an empty file. Content-Disposition is form-data with the corresponding part name. Content-Transfer-Encoding is refused. A clean closing multipart delimiter is required; truncated content never completes the current item. Malformed occurrences report invalidArgument with a BadRequest detail identifying the occurrence index and path.", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilesUploadResponse" + } + } + }, + "description": "Success" + }, + "409": { + "content": { + "application/json": { + "examples": { + "path_authority_nonregular_object": { + "summary": "The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required.", + "value": { + "code": "failedPrecondition", + "message": "path_authority_nonregular_object: The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required." + } + }, + "path_authority_symlink_escape": { + "summary": "The path resolves through a symlink that does not resolve to a target inside the sandbox jail.", + "value": { + "code": "failedPrecondition", + "message": "path_authority_symlink_escape: The path resolves through a symlink that does not resolve to a target inside the sandbox jail." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The path resolves through a symlink that does not resolve to a target inside the sandbox jail.\n\nThe path names an existing socket, FIFO, device, or other non-regular object where a regular file is required." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Upload streams one or more files.", + "tags": [ + "Files" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The path resolves through a symlink that does not resolve to a target inside the sandbox jail.", + "reason": "path_authority_symlink_escape" + }, + { + "code": "FAILED_PRECONDITION", + "description": "The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required.", + "reason": "path_authority_nonregular_object" + } + ], + "x-sbx-http-transfer": { + "request": { + "bytesField": "data", + "itemPathField": "header.path", + "mediaType": "multipart/form-data", + "metadataField": "header", + "repeatedItems": true + } + }, + "x-sbx-plane": "data", + "x-sbx-request-schema": { + "$ref": "#/components/schemas/FilesUploadRequest" + }, + "x-sbx-required-permissions": [ + "sandboxesFilesWrite" + ], + "x-sbx-response-schema": { + "$ref": "#/components/schemas/FilesUploadResponse" + }, + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/FileHeader", + "url": "/reference/api/sandboxes/latest/schemas/FileHeader/" + }, + { + "ref": "#/components/schemas/FilesUploadRequest", + "url": "/reference/api/sandboxes/latest/schemas/FilesUploadRequest/" + }, + { + "ref": "#/components/schemas/FilesUploadResponse", + "url": "/reference/api/sandboxes/latest/schemas/FilesUploadResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Upload streams one or more files.", + "tags": [ + "Files" + ], + "url": "/reference/api/sandboxes/latest/operations/upload/", + "variants": [ + { + "description": "Send ordered metadata/content pairs. Each metadata part is application/json; the following content part is application/octet-stream containing raw bytes, including an empty file. Content-Disposition is form-data with the corresponding part name. Content-Transfer-Encoding is refused. A clean closing multipart delimiter is required; truncated content never completes the current item. Malformed occurrences report invalidArgument with a BadRequest detail identifying the occurrence index and path.", + "direction": "Request", + "examples": [], + "headers": null, + "itemEncoding": { + "contentType": "application/json, application/octet-stream" + }, + "itemSchema": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "metadata": { + "$ref": "#/components/schemas/FileHeader" + } + }, + "required": [ + "metadata" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "content": { + "contentMediaType": "application/octet-stream" + } + }, + "required": [ + "content" + ], + "type": "object" + } + ] + }, + "media": "multipart/form-data", + "pointer": "/paths/~1v1~1files~1upload/post/requestBody/content/multipart~1form-data", + "required": true, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1upload/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/FilesUploadResponse" + }, + "status": "200" + }, + { + "description": "The path resolves through a symlink that does not resolve to a target inside the sandbox jail.\n\nThe path names an existing socket, FIFO, device, or other non-regular object where a regular file is required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "path_authority_nonregular_object", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"path_authority_nonregular_object: The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "path_authority_nonregular_object: The path names an existing socket, FIFO, device, or other non-regular object where a regular file is required." + } + }, + { + "language": "json", + "name": "path_authority_symlink_escape", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"path_authority_symlink_escape: The path resolves through a symlink that does not resolve to a target inside the sandbox jail.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "path_authority_symlink_escape: The path resolves through a symlink that does not resolve to a target inside the sandbox jail." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1upload/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1files~1upload/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/identity/exchange'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "ExchangeDockerCredential consumes an identity token once for the authenticated owner.\nThe exchanged credential is stored for that owner; the response is empty.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "exchangeDockerCredential", + "line": 672, + "method": "POST", + "parameters": [], + "path": "/v1/identity/exchange", + "pointer": "/paths/~1v1~1identity~1exchange/post", + "raw": { + "description": "ExchangeDockerCredential consumes an identity token once for the authenticated owner.\nThe exchanged credential is stored for that owner; the response is empty.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "exchangeDockerCredential", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityExchangeServiceExchangeDockerCredentialRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExchangeCompositionCredentialResponse" + } + } + }, + "description": "Success" + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "ExchangeDockerCredential consumes an identity token once for the authenticated owner.", + "tags": [ + "Credentials" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "credentialsExchange" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ExchangeCompositionCredentialResponse", + "url": "/reference/api/sandboxes/latest/schemas/ExchangeCompositionCredentialResponse/" + }, + { + "ref": "#/components/schemas/IdentityExchangeServiceExchangeDockerCredentialRequest", + "url": "/reference/api/sandboxes/latest/schemas/IdentityExchangeServiceExchangeDockerCredentialRequest/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/IdentityExchangeServiceExchangeDockerCredentialRequest" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "ExchangeDockerCredential consumes an identity token once for the authenticated owner.", + "tags": [ + "Credentials" + ], + "url": "/reference/api/sandboxes/latest/operations/exchangeDockerCredential/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1identity~1exchange/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/IdentityExchangeServiceExchangeDockerCredentialRequest" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1identity~1exchange/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ExchangeCompositionCredentialResponse" + }, + "status": "200" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1identity~1exchange/post/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1identity~1exchange/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/images'", + "curlNotes": [], + "deprecated": null, + "description": "ListImages lists images in the caller's owner scope.", + "id": "listImages", + "line": 725, + "method": "GET", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "pointer": "/paths/~1v1~1images/get/parameters/0", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "pointer": "/paths/~1v1~1images/get/parameters/1", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name, uid and status.", + "in": "query", + "name": "filter", + "pointer": "/paths/~1v1~1images/get/parameters/2", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "pointer": "/paths/~1v1~1images/get/parameters/3", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "path": "/v1/images", + "pointer": "/paths/~1v1~1images/get", + "raw": { + "description": "ListImages lists images in the caller's owner scope.", + "operationId": "listImages", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name, uid and status.", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListImagesResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "ListImages lists images in the caller's owner scope.", + "tags": [ + "Images" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "imagesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ListImagesResponse", + "url": "/reference/api/sandboxes/latest/schemas/ListImagesResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "ListImages lists images in the caller's owner scope.", + "tags": [ + "Images" + ], + "url": "/reference/api/sandboxes/latest/operations/listImages/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1images/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ListImagesResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1images/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/images'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "CreateImage registers pushed OCI content or disk content derived from a snapshot or sandbox.", + "id": "createImage", + "line": 788, + "method": "POST", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1images/post/parameters/0", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "path": "/v1/images", + "pointer": "/paths/~1v1~1images/post", + "raw": { + "description": "CreateImage registers pushed OCI content or disk content derived from a snapshot or sandbox.", + "operationId": "createImage", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateImageRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Image" + }, + { + "not": { + "properties": { + "status": { + "enum": [ + "pending", + "waitingForPush", + "preparing" + ] + } + }, + "required": [ + "status" + ] + } + } + ] + } + } + }, + "description": "Success", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + }, + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "202": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Image" + }, + { + "properties": { + "status": { + "enum": [ + "pending", + "waitingForPush", + "preparing" + ] + } + }, + "required": [ + "status" + ] + } + ] + } + } + }, + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + }, + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload.", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + } + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + } + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "CreateImage registers pushed OCI content or disk content derived from a snapshot or sandbox.", + "tags": [ + "Images" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "imagesWrite" + ], + "x-sbx-resource-response": { + "$ref": "#/components/schemas/Image" + }, + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/CreateImageRequest", + "url": "/reference/api/sandboxes/latest/schemas/CreateImageRequest/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Image", + "url": "/reference/api/sandboxes/latest/schemas/Image/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/CreateImageRequest" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "CreateImage registers pushed OCI content or disk content derived from a snapshot or sandbox.", + "tags": [ + "Images" + ], + "url": "/reference/api/sandboxes/latest/operations/createImage/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1images/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/CreateImageRequest" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + }, + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1images/post/responses/201/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Image" + }, + { + "not": { + "properties": { + "status": { + "enum": [ + "pending", + "waitingForPush", + "preparing" + ] + } + }, + "required": [ + "status" + ] + } + } + ] + }, + "status": "201" + }, + { + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "direction": "Response", + "examples": [], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + }, + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1images/post/responses/202/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Image" + }, + { + "properties": { + "status": { + "enum": [ + "pending", + "waitingForPush", + "preparing" + ] + } + }, + "required": [ + "status" + ] + } + ] + }, + "status": "202" + }, + { + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1images/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1images/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/images/\u003cIMAGE\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "GetImage reads one image by its resource name.", + "id": "getImage", + "line": 909, + "method": "GET", + "parameters": [ + { + "description": "The image id.", + "in": "path", + "name": "image", + "pointer": "/paths/~1v1~1images~1{image}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "pointer": "/paths/~1v1~1images~1{image}/get/parameters/1", + "schema": { + "type": "string" + } + } + ], + "path": "/v1/images/{image}", + "pointer": "/paths/~1v1~1images~1{image}/get", + "raw": { + "description": "GetImage reads one image by its resource name.", + "operationId": "getImage", + "parameters": [ + { + "description": "The image id.", + "in": "path", + "name": "image", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Image" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "304": { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body." + }, + "404": { + "content": { + "application/json": { + "examples": { + "notFound": { + "summary": "The target is absent or not visible within the caller's scope.", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target is absent or not visible within the caller's scope." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetImage reads one image by its resource name.", + "tags": [ + "Images" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "NOT_FOUND", + "description": "The target is absent or not visible within the caller's scope." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "imagesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Image", + "url": "/reference/api/sandboxes/latest/schemas/Image/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetImage reads one image by its resource name.", + "tags": [ + "Images" + ], + "url": "/reference/api/sandboxes/latest/operations/getImage/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Image" + }, + "status": "200" + }, + { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1images~1{image}/get/responses/304", + "status": "304" + }, + { + "description": "The target is absent or not visible within the caller's scope.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "notFound", + "text": "{\n \"code\": \"notFound\",\n \"message\": \"The target is absent or not visible within the caller's scope.\"\n}", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://connect.docker.com/sandboxes/v1/images/\u003cIMAGE\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "DeleteImage deletes an image; deleting an already absent image succeeds.", + "id": "deleteImage", + "line": 970, + "method": "DELETE", + "parameters": [ + { + "description": "The image id.", + "in": "path", + "name": "image", + "pointer": "/paths/~1v1~1images~1{image}/delete/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1images~1{image}/delete/parameters/1", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/images/{image}", + "pointer": "/paths/~1v1~1images~1{image}/delete", + "raw": { + "description": "DeleteImage deletes an image; deleting an already absent image succeeds.", + "operationId": "deleteImage", + "parameters": [ + { + "description": "The image id.", + "in": "path", + "name": "image", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Success. The response carries no body." + }, + "409": { + "content": { + "application/json": { + "examples": { + "deletion_content_lease_held": { + "summary": "An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held.", + "value": { + "code": "failedPrecondition", + "message": "deletion_content_lease_held: An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held." + } + }, + "deletion_preparation_incomplete": { + "summary": "The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.", + "value": { + "code": "failedPrecondition", + "message": "deletion_preparation_incomplete: The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.\n\nAn admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held." + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "DeleteImage deletes an image; deleting an already absent image succeeds.", + "tags": [ + "Images" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.", + "reason": "deletion_preparation_incomplete" + }, + { + "code": "FAILED_PRECONDITION", + "description": "An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held.", + "reason": "deletion_content_lease_held" + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "imagesWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "DeleteImage deletes an image; deleting an already absent image succeeds.", + "tags": [ + "Images" + ], + "url": "/reference/api/sandboxes/latest/operations/deleteImage/", + "variants": [ + { + "description": "Success. The response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1images~1{image}/delete/responses/204", + "status": "204" + }, + { + "description": "The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.\n\nAn admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "deletion_content_lease_held", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"deletion_content_lease_held: An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "deletion_content_lease_held: An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held." + } + }, + { + "language": "json", + "name": "deletion_preparation_incomplete", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"deletion_preparation_incomplete: The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "deletion_preparation_incomplete: The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}/delete/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}/delete/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}/delete/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}/delete/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/images/\u003cIMAGE\u003e/pull-spec'", + "curlNotes": [], + "deprecated": null, + "description": "GetImagePullSpec returns short-lived pull material through registry-transfer support.\nAction: the pull spec is derived material about the image, not a sub-resource of it.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "getImagePullSpec", + "line": 1065, + "method": "GET", + "parameters": [ + { + "description": "The image id.", + "in": "path", + "name": "image", + "pointer": "/paths/~1v1~1images~1{image}~1pull-spec/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/images/{image}/pull-spec", + "pointer": "/paths/~1v1~1images~1{image}~1pull-spec/get", + "raw": { + "description": "GetImagePullSpec returns short-lived pull material through registry-transfer support.\nAction: the pull spec is derived material about the image, not a sub-resource of it.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "getImagePullSpec", + "parameters": [ + { + "description": "The image id.", + "in": "path", + "name": "image", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImagePullSpec" + } + } + }, + "description": "Success", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + } + } + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service.", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + } + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + } + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetImagePullSpec returns short-lived pull material through registry-transfer support.", + "tags": [ + "Images" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "imagesPull" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ImagePullSpec", + "url": "/reference/api/sandboxes/latest/schemas/ImagePullSpec/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetImagePullSpec returns short-lived pull material through registry-transfer support.", + "tags": [ + "Images" + ], + "url": "/reference/api/sandboxes/latest/operations/getImagePullSpec/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}~1pull-spec/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ImagePullSpec" + }, + "status": "200" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}~1pull-spec/get/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1images~1{image}~1pull-spec/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/mcp-servers/\u003cMCPSERVER\u003e/authorization'", + "curlNotes": [], + "deprecated": null, + "description": "GetMcpAuthorization reads the owner-scoped flow, including its pending URL, under mcp.write.", + "id": "getMcpAuthorization", + "line": 1139, + "method": "GET", + "parameters": [ + { + "description": "The mcpServer id.", + "in": "path", + "name": "mcpServer", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization/get/parameters/1", + "schema": { + "type": "string" + } + } + ], + "path": "/v1/mcp-servers/{mcpServer}/authorization", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization/get", + "raw": { + "description": "GetMcpAuthorization reads the owner-scoped flow, including its pending URL, under mcp.write.", + "operationId": "getMcpAuthorization", + "parameters": [ + { + "description": "The mcpServer id.", + "in": "path", + "name": "mcpServer", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/McpAuthorization" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "304": { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body." + }, + "404": { + "content": { + "application/json": { + "examples": { + "notFound": { + "summary": "The target is absent or not visible within the caller's scope.", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target is absent or not visible within the caller's scope." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetMcpAuthorization reads the owner-scoped flow, including its pending URL, under mcp.write.", + "tags": [ + "MCP gateways" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "NOT_FOUND", + "description": "The target is absent or not visible within the caller's scope." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "mcpWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/McpAuthorization", + "url": "/reference/api/sandboxes/latest/schemas/McpAuthorization/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetMcpAuthorization reads the owner-scoped flow, including its pending URL, under mcp.write.", + "tags": [ + "MCP gateways" + ], + "url": "/reference/api/sandboxes/latest/operations/getMcpAuthorization/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/McpAuthorization" + }, + "status": "200" + }, + { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization/get/responses/304", + "status": "304" + }, + { + "description": "The target is absent or not visible within the caller's scope.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "notFound", + "text": "{\n \"code\": \"notFound\",\n \"message\": \"The target is absent or not visible within the caller's scope.\"\n}", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/mcp-servers/\u003cMCPSERVER\u003e/authorization/authorize'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "AuthorizeMcpServer authorizes credentials for one named upstream.\nAction: authorization runs an interactive grant whose result is not the request body.", + "id": "authorizeMcpServer", + "line": 1201, + "method": "POST", + "parameters": [ + { + "description": "The mcpServer id.", + "in": "path", + "name": "mcpServer", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization~1authorize/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Optional current authorization etag. A supplied stale value answers 412 with failedPrecondition; omission permits create or convergence, including forced reauthorization.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization~1authorize/post/parameters/1", + "schema": { + "description": "(OPTIONAL) etag optionally pins the current authorization; a supplied stale value refuses.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/mcp-servers/{mcpServer}/authorization/authorize", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization~1authorize/post", + "raw": { + "description": "AuthorizeMcpServer authorizes credentials for one named upstream.\nAction: authorization runs an interactive grant whose result is not the request body.", + "operationId": "authorizeMcpServer", + "parameters": [ + { + "description": "The mcpServer id.", + "in": "path", + "name": "mcpServer", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Optional current authorization etag. A supplied stale value answers 412 with failedPrecondition; omission permits create or convergence, including forced reauthorization.", + "in": "header", + "name": "If-Match", + "schema": { + "description": "(OPTIONAL) etag optionally pins the current authorization; a supplied stale value refuses.", + "title": "If-Match", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "AuthorizeMcpServerRequest starts or refreshes MCP upstream authorization.", + "properties": { + "forceReauth": { + "description": "force_reauth starts a fresh flow while existing credentials serve until completion.\nRepeating a pending flow converges without reminting.", + "type": "boolean" + }, + "remoteUrl": { + "description": "remote_url binds authorization to a concrete upstream URL when supplied.", + "format": "uri", + "type": [ + "string", + "null" + ] + } + }, + "title": "AuthorizeMcpServerRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/McpAuthorization" + }, + { + "not": { + "properties": { + "status": { + "enum": [ + "pending" + ] + } + }, + "required": [ + "status" + ] + } + } + ] + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "202": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/McpAuthorization" + }, + { + "properties": { + "status": { + "enum": [ + "pending" + ] + } + }, + "required": [ + "status" + ] + } + ] + } + } + }, + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "AuthorizeMcpServer authorizes credentials for one named upstream.", + "tags": [ + "MCP gateways" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "mcpWrite" + ], + "x-sbx-resource-response": { + "$ref": "#/components/schemas/McpAuthorization" + }, + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/McpAuthorization", + "url": "/reference/api/sandboxes/latest/schemas/McpAuthorization/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "AuthorizeMcpServerRequest starts or refreshes MCP upstream authorization.", + "properties": { + "forceReauth": { + "description": "force_reauth starts a fresh flow while existing credentials serve until completion.\nRepeating a pending flow converges without reminting.", + "type": "boolean" + }, + "remoteUrl": { + "description": "remote_url binds authorization to a concrete upstream URL when supplied.", + "format": "uri", + "type": [ + "string", + "null" + ] + } + }, + "title": "AuthorizeMcpServerRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "AuthorizeMcpServer authorizes credentials for one named upstream.", + "tags": [ + "MCP gateways" + ], + "url": "/reference/api/sandboxes/latest/operations/authorizeMcpServer/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization~1authorize/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "AuthorizeMcpServerRequest starts or refreshes MCP upstream authorization.", + "properties": { + "forceReauth": { + "description": "force_reauth starts a fresh flow while existing credentials serve until completion.\nRepeating a pending flow converges without reminting.", + "type": "boolean" + }, + "remoteUrl": { + "description": "remote_url binds authorization to a concrete upstream URL when supplied.", + "format": "uri", + "type": [ + "string", + "null" + ] + } + }, + "title": "AuthorizeMcpServerRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization~1authorize/post/responses/200/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/McpAuthorization" + }, + { + "not": { + "properties": { + "status": { + "enum": [ + "pending" + ] + } + }, + "required": [ + "status" + ] + } + } + ] + }, + "status": "200" + }, + { + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization~1authorize/post/responses/202/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/McpAuthorization" + }, + { + "properties": { + "status": { + "enum": [ + "pending" + ] + } + }, + "required": [ + "status" + ] + } + ] + }, + "status": "202" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization~1authorize/post/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1mcp-servers~1{mcpServer}~1authorization~1authorize/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/network-policies'", + "curlNotes": [], + "deprecated": null, + "description": "GetNetworkPolicies returns effective and exact views of the same installed generation.", + "id": "getNetworkPoliciesInOwnerScope", + "line": 1314, + "method": "GET", + "parameters": [], + "path": "/v1/network-policies", + "pointer": "/paths/~1v1~1network-policies/get", + "raw": { + "description": "GetNetworkPolicies returns effective and exact views of the same installed generation.", + "operationId": "getNetworkPoliciesInOwnerScope", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetNetworkPoliciesResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetNetworkPolicies returns effective and exact views of the same installed generation.", + "tags": [ + "Network policies" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "networkPoliciesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/GetNetworkPoliciesResponse", + "url": "/reference/api/sandboxes/latest/schemas/GetNetworkPoliciesResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetNetworkPolicies returns effective and exact views of the same installed generation.", + "tags": [ + "Network policies" + ], + "url": "/reference/api/sandboxes/latest/operations/getNetworkPoliciesInOwnerScope/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1network-policies/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/GetNetworkPoliciesResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1network-policies/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/policy-logs?since=2023-01-15T01%3A30%3A15.01Z\u0026until=2023-01-15T01%3A30%3A15.01Z'", + "curlNotes": [], + "deprecated": null, + "description": "ListPolicyLogEntries lists observed policy decisions.", + "id": "listPolicyLogEntriesInOwnerScope", + "line": 1343, + "method": "GET", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "pointer": "/paths/~1v1~1policy-logs/get/parameters/0", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "pointer": "/paths/~1v1~1policy-logs/get/parameters/1", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable field is\ndomain.", + "in": "query", + "name": "filter", + "pointer": "/paths/~1v1~1policy-logs/get/parameters/2", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "An RFC 3339 timestamp, for example 2026-01-01T12:00:00Z. Fractional seconds may contain up to nine digits. The supported range is 0001-01-01T00:00:00Z through 9999-12-31T23:59:59.999999999Z.", + "in": "query", + "name": "since", + "pointer": "/paths/~1v1~1policy-logs/get/parameters/3", + "required": false, + "schema": { + "examples": [ + "2023-01-15T01:30:15.01Z", + "2024-12-25T12:00:00Z" + ], + "format": "date-time", + "type": "string" + } + }, + { + "description": "An RFC 3339 timestamp, for example 2026-01-01T12:00:00Z. Fractional seconds may contain up to nine digits. The supported range is 0001-01-01T00:00:00Z through 9999-12-31T23:59:59.999999999Z.", + "in": "query", + "name": "until", + "pointer": "/paths/~1v1~1policy-logs/get/parameters/4", + "required": false, + "schema": { + "examples": [ + "2023-01-15T01:30:15.01Z", + "2024-12-25T12:00:00Z" + ], + "format": "date-time", + "type": "string" + } + } + ], + "path": "/v1/policy-logs", + "pointer": "/paths/~1v1~1policy-logs/get", + "raw": { + "description": "ListPolicyLogEntries lists observed policy decisions.", + "operationId": "listPolicyLogEntriesInOwnerScope", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable field is\ndomain.", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "An RFC 3339 timestamp, for example 2026-01-01T12:00:00Z. Fractional seconds may contain up to nine digits. The supported range is 0001-01-01T00:00:00Z through 9999-12-31T23:59:59.999999999Z.", + "in": "query", + "name": "since", + "required": false, + "schema": { + "examples": [ + "2023-01-15T01:30:15.01Z", + "2024-12-25T12:00:00Z" + ], + "format": "date-time", + "type": "string" + } + }, + { + "description": "An RFC 3339 timestamp, for example 2026-01-01T12:00:00Z. Fractional seconds may contain up to nine digits. The supported range is 0001-01-01T00:00:00Z through 9999-12-31T23:59:59.999999999Z.", + "in": "query", + "name": "until", + "required": false, + "schema": { + "examples": [ + "2023-01-15T01:30:15.01Z", + "2024-12-25T12:00:00Z" + ], + "format": "date-time", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPolicyLogEntriesResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "ListPolicyLogEntries lists observed policy decisions.", + "tags": [ + "Network policies" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "networkPoliciesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ListPolicyLogEntriesResponse", + "url": "/reference/api/sandboxes/latest/schemas/ListPolicyLogEntriesResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "ListPolicyLogEntries lists observed policy decisions.", + "tags": [ + "Network policies" + ], + "url": "/reference/api/sandboxes/latest/operations/listPolicyLogEntriesInOwnerScope/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1policy-logs/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ListPolicyLogEntriesResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1policy-logs/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://sandbox.invalid/v1/processes'", + "curlNotes": [], + "deprecated": null, + "description": "ListProcesses lists processes in creation order.", + "id": "listProcesses", + "line": 1418, + "method": "GET", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "pointer": "/paths/~1v1~1processes/get/parameters/0", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an optional continuation token.", + "in": "query", + "name": "pageToken", + "pointer": "/paths/~1v1~1processes/get/parameters/1", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nsession and state.", + "in": "query", + "name": "filter", + "pointer": "/paths/~1v1~1processes/get/parameters/2", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + } + ], + "path": "/v1/processes", + "pointer": "/paths/~1v1~1processes/get", + "raw": { + "description": "ListProcesses lists processes in creation order.", + "operationId": "listProcesses", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an optional continuation token.", + "in": "query", + "name": "pageToken", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nsession and state.", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListProcessesResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "ListProcesses lists processes in creation order.", + "tags": [ + "Processes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesExec" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ListProcessesResponse", + "url": "/reference/api/sandboxes/latest/schemas/ListProcessesResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "ListProcesses lists processes in creation order.", + "tags": [ + "Processes" + ], + "url": "/reference/api/sandboxes/latest/operations/listProcesses/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ListProcessesResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://sandbox.invalid/v1/processes'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "CreateProcess starts a durable interactive process and returns its resource name.", + "id": "createProcess", + "line": 1478, + "method": "POST", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1processes/post/parameters/0", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "path": "/v1/processes", + "pointer": "/paths/~1v1~1processes/post", + "raw": { + "description": "CreateProcess starts a durable interactive process and returns its resource name.", + "operationId": "createProcess", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateProcessRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Process" + } + } + }, + "description": "Success" + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "CreateProcess starts a durable interactive process and returns its resource name.", + "tags": [ + "Processes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesExec" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/CreateProcessRequest", + "url": "/reference/api/sandboxes/latest/schemas/CreateProcessRequest/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Process", + "url": "/reference/api/sandboxes/latest/schemas/Process/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/CreateProcessRequest" + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "CreateProcess starts a durable interactive process and returns its resource name.", + "tags": [ + "Processes" + ], + "url": "/reference/api/sandboxes/latest/operations/createProcess/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/CreateProcessRequest" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Process" + }, + "status": "201" + }, + { + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://sandbox.invalid/v1/processes/exec'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "Exec runs one command to completion. A retry after transport failure may run it again.\nAction at the collection root: it runs a command to completion instead of creating a\nprocess a caller can address.", + "id": "exec", + "line": 1544, + "method": "POST", + "parameters": [], + "path": "/v1/processes/exec", + "pointer": "/paths/~1v1~1processes~1exec/post", + "raw": { + "description": "Exec runs one command to completion. A retry after transport failure may run it again.\nAction at the collection root: it runs a command to completion instead of creating a\nprocess a caller can address.", + "operationId": "exec", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Exec runs one command to completion.", + "tags": [ + "Processes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesExec" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ExecRequest", + "url": "/reference/api/sandboxes/latest/schemas/ExecRequest/" + }, + { + "ref": "#/components/schemas/ExecResponse", + "url": "/reference/api/sandboxes/latest/schemas/ExecResponse/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/ExecRequest" + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Exec runs one command to completion.", + "tags": [ + "Processes" + ], + "url": "/reference/api/sandboxes/latest/operations/exec/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1exec/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/ExecRequest" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1exec/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ExecResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1exec/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://sandbox.invalid/v1/processes/\u003cPROCESS\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "GetProcess reads one process by its endpoint-scoped resource name.", + "id": "getProcess", + "line": 1587, + "method": "GET", + "parameters": [ + { + "description": "The process id.", + "in": "path", + "name": "process", + "pointer": "/paths/~1v1~1processes~1{process}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/processes/{process}", + "pointer": "/paths/~1v1~1processes~1{process}/get", + "raw": { + "description": "GetProcess reads one process by its endpoint-scoped resource name.", + "operationId": "getProcess", + "parameters": [ + { + "description": "The process id.", + "in": "path", + "name": "process", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Process" + } + } + }, + "description": "Success" + }, + "404": { + "content": { + "application/json": { + "examples": { + "notFound": { + "summary": "The target is absent or not visible within the caller's scope.", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target is absent or not visible within the caller's scope." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "GetProcess reads one process by its endpoint-scoped resource name.", + "tags": [ + "Processes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "NOT_FOUND", + "description": "The target is absent or not visible within the caller's scope." + } + ], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesExec" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Process", + "url": "/reference/api/sandboxes/latest/schemas/Process/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "GetProcess reads one process by its endpoint-scoped resource name.", + "tags": [ + "Processes" + ], + "url": "/reference/api/sandboxes/latest/operations/getProcess/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1{process}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Process" + }, + "status": "200" + }, + { + "description": "The target is absent or not visible within the caller's scope.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "notFound", + "text": "{\n \"code\": \"notFound\",\n \"message\": \"The target is absent or not visible within the caller's scope.\"\n}", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1{process}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1{process}/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "", + "curl": "", + "curlNotes": [ + "Use a WebSocket client with the subprotocol, credential transport, and frame schemas documented for this operation." + ], + "deprecated": null, + "description": "Interact binds the complete process name from the path to the first Attach frame.\nA conflicting name is INVALID_ARGUMENT before any attach.", + "id": "interact", + "line": 1643, + "method": "GET", + "parameters": [ + { + "description": "The process id.", + "in": "path", + "name": "process", + "pointer": "/paths/~1v1~1processes~1{process}~1interact/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/processes/{process}/interact", + "pointer": "/paths/~1v1~1processes~1{process}~1interact/get", + "raw": { + "description": "Interact binds the complete process name from the path to the first Attach frame.\nA conflicting name is INVALID_ARGUMENT before any attach.", + "operationId": "interact", + "parameters": [ + { + "description": "The process id.", + "in": "path", + "name": "process", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "101": { + "description": "The connection becomes a sandboxes.v1 session: one InteractRequest per inbound text frame and one ProcessOutput per outbound one. Path parameters identify the target; the first attach frame must agree. Refusals after upgrade carry an error frame followed by a close code." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + }, + { + "sandboxWebSocketBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Interact binds the complete process name from the path to the first Attach frame.", + "tags": [ + "Processes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "data", + "x-sbx-request-schema": { + "$ref": "#/components/schemas/InteractRequest" + }, + "x-sbx-required-permissions": [ + "sandboxesExec" + ], + "x-sbx-response-schema": { + "$ref": "#/components/schemas/ProcessOutput" + }, + "x-sbx-serving-surface": "sandboxEndpoint", + "x-websocket": { + "authentication": "Use exactly one sandbox-scoped Authorization bearer credential or, when endpoint credentialTransports advertises webSocketSubprotocol, offer sandboxes.bearer.v1. followed by canonical unpadded base64url of that credential alongside sandboxes.v1. The decoded token is limited to 4096 bytes. The server echoes only sandboxes.v1; mixed or duplicate credentials, query credentials and cookie-only authentication are refused.", + "bearerSubprotocolPrefix": "sandboxes.bearer.v1.", + "browser": "Open a WSS endpoint using its scoped credential. Browsers may send cookies; the server ignores them as authority and permits cross-origin explicit bearer authentication. Browser WebSocket errors do not expose pre-upgrade HTTP status or bodies; only post-upgrade Error frames are typed. No reconnect or input replay is automatic.", + "closeCode": { + "1000": "The service ended the stream, or the caller cancelled it.", + "1002": "The handshake negotiated no subprotocol.", + "1003": "A frame arrived as binary; every frame is text.", + "1007": "A frame was not the public JSON request message.", + "1008": "The service refused with a 4xx error, or the endpoint credential expired.", + "1009": "A frame exceeded the route’s frame limit.", + "1011": "The service failed with a code the front door maps to a 5xx." + }, + "errorFrame": { + "$ref": "#/components/schemas/Error" + }, + "firstRequestField": "attach", + "maxBearerTokenBytes": 4096, + "preUpgradeStatus": { + "400": "The request has an invalid subprotocol offer, mixed or malformed credentials, an oversized credential, or a query parameter.", + "401": "The scoped credential is missing, invalid or expired.", + "403": "The scoped credential does not grant this endpoint permission.", + "404": "The scoped credential does not address this sandbox endpoint." + }, + "reconnect": "Acquire a fresh scoped credential, open a new connection, and send attach with attach.resumeFrom set to the last received chunk.streamSequence. Resume replays output only; never replay stdin or process creation.", + "requestFrame": { + "$ref": "#/components/schemas/InteractRequest" + }, + "responseFrame": { + "$ref": "#/components/schemas/ProcessOutput" + }, + "resumeRequestField": "attach.resumeFrom", + "resumeResponseField": "chunk.streamSequence", + "subprotocol": "sandboxes.v1", + "terminalFrame": "The last text frame before a close carries the one error body, because a close reason holds at most 123 bytes." + } + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/InteractRequest", + "url": "/reference/api/sandboxes/latest/schemas/InteractRequest/" + }, + { + "ref": "#/components/schemas/ProcessOutput", + "url": "/reference/api/sandboxes/latest/schemas/ProcessOutput/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + }, + { + "sandboxWebSocketBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Interact binds the complete process name from the path to the first Attach frame.", + "tags": [ + "Processes" + ], + "url": "/reference/api/sandboxes/latest/operations/interact/", + "variants": [ + { + "description": "The connection becomes a sandboxes.v1 session: one InteractRequest per inbound text frame and one ProcessOutput per outbound one. Path parameters identify the target; the first attach frame must agree. Refusals after upgrade carry an error frame followed by a close code.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1processes~1{process}~1interact/get/responses/101", + "status": "101" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1{process}~1interact/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://sandbox.invalid/v1/processes/\u003cPROCESS\u003e/output'", + "curlNotes": [], + "deprecated": null, + "description": "ReadOutput returns one page of retained output after a stream_sequence, the\nsame cursor Interact resumes from, so a REST client can read what a process printed.", + "id": "readOutput", + "line": 1717, + "method": "GET", + "parameters": [ + { + "description": "The process id.", + "in": "path", + "name": "process", + "pointer": "/paths/~1v1~1processes~1{process}~1output/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "resume_from returns output after this stream_sequence; 0 means from the start.\nMissing output after this point fails with FAILED_PRECONDITION, as for Attach.", + "in": "query", + "name": "resumeFrom", + "pointer": "/paths/~1v1~1processes~1{process}~1output/get/parameters/1", + "required": false, + "schema": { + "format": "int64", + "title": "resume_from", + "type": [ + "integer", + "string" + ] + } + }, + { + "description": "max_bytes is a soft bound on the page's data: whole chunks only, and the first retained\nchunk always fits so a caller always advances. 0 means the backend's default page.", + "in": "query", + "name": "maxBytes", + "pointer": "/paths/~1v1~1processes~1{process}~1output/get/parameters/2", + "required": false, + "schema": { + "title": "max_bytes", + "type": "integer" + } + } + ], + "path": "/v1/processes/{process}/output", + "pointer": "/paths/~1v1~1processes~1{process}~1output/get", + "raw": { + "description": "ReadOutput returns one page of retained output after a stream_sequence, the\nsame cursor Interact resumes from, so a REST client can read what a process printed.", + "operationId": "readOutput", + "parameters": [ + { + "description": "The process id.", + "in": "path", + "name": "process", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "resume_from returns output after this stream_sequence; 0 means from the start.\nMissing output after this point fails with FAILED_PRECONDITION, as for Attach.", + "in": "query", + "name": "resumeFrom", + "required": false, + "schema": { + "format": "int64", + "title": "resume_from", + "type": [ + "integer", + "string" + ] + } + }, + { + "description": "max_bytes is a soft bound on the page's data: whole chunks only, and the first retained\nchunk always fits so a caller always advances. 0 means the backend's default page.", + "in": "query", + "name": "maxBytes", + "required": false, + "schema": { + "title": "max_bytes", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReadOutputResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "ReadOutput returns one page of retained output after a stream_sequence, the same cursor Interact resumes from, so a REST client can read what a process printed.", + "tags": [ + "Processes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesExec" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ReadOutputResponse", + "url": "/reference/api/sandboxes/latest/schemas/ReadOutputResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "ReadOutput returns one page of retained output after a stream_sequence, the same cursor Interact resumes from, so a REST client can read what a process printed.", + "tags": [ + "Processes" + ], + "url": "/reference/api/sandboxes/latest/operations/readOutput/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1{process}~1output/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ReadOutputResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1{process}~1output/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://sandbox.invalid/v1/processes/\u003cPROCESS\u003e/signal'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "Signal sends one signal to an existing process.\nAction: a signal is delivered to a running process and leaves no representation to\nreplace.", + "id": "signal", + "line": 1781, + "method": "POST", + "parameters": [ + { + "description": "The process id.", + "in": "path", + "name": "process", + "pointer": "/paths/~1v1~1processes~1{process}~1signal/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/processes/{process}/signal", + "pointer": "/paths/~1v1~1processes~1{process}~1signal/post", + "raw": { + "description": "Signal sends one signal to an existing process.\nAction: a signal is delivered to a running process and leaves no representation to\nreplace.", + "operationId": "signal", + "parameters": [ + { + "description": "The process id.", + "in": "path", + "name": "process", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "SignalRequest sends one signal.", + "properties": { + "signal": { + "$ref": "#/components/schemas/ProcessSignal", + "description": "signal is the signal to send.", + "not": { + "enum": [ + "unspecified" + ] + } + } + }, + "required": [ + "signal" + ], + "title": "SignalRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SignalResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Signal sends one signal to an existing process.", + "tags": [ + "Processes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "data", + "x-sbx-required-permissions": [ + "sandboxesExec" + ], + "x-sbx-serving-surface": "sandboxEndpoint" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ProcessSignal", + "url": "/reference/api/sandboxes/latest/schemas/ProcessSignal/" + }, + { + "ref": "#/components/schemas/SignalResponse", + "url": "/reference/api/sandboxes/latest/schemas/SignalResponse/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "SignalRequest sends one signal.", + "properties": { + "signal": { + "$ref": "#/components/schemas/ProcessSignal", + "description": "signal is the signal to send.", + "not": { + "enum": [ + "unspecified" + ] + } + } + }, + "required": [ + "signal" + ], + "title": "SignalRequest", + "type": "object" + }, + "security": [ + { + "sandboxBearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "url": "{endpoint}", + "variables": { + "endpoint": { + "default": "https://sandbox.invalid", + "description": "The sandbox API base URL from Sandbox.core.endpoint.uri; preserve its path prefix when appending /v1 routes. HTTP endpoints require a scoped endpoint bearer; direct Unix sockets use socket access control." + } + } + } + ], + "summary": "Signal sends one signal to an existing process.", + "tags": [ + "Processes" + ], + "url": "/reference/api/sandboxes/latest/operations/signal/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1{process}~1signal/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "SignalRequest sends one signal.", + "properties": { + "signal": { + "$ref": "#/components/schemas/ProcessSignal", + "description": "signal is the signal to send.", + "not": { + "enum": [ + "unspecified" + ] + } + } + }, + "required": [ + "signal" + ], + "title": "SignalRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1{process}~1signal/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/SignalResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1processes~1{process}~1signal/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes'", + "curlNotes": [], + "deprecated": null, + "description": "ListSandboxes lists sandboxes in the caller's owner scope.", + "id": "listSandboxes", + "line": 1843, + "method": "GET", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "pointer": "/paths/~1v1~1sandboxes/get/parameters/0", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "pointer": "/paths/~1v1~1sandboxes/get/parameters/1", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name, uid, status and agent.", + "in": "query", + "name": "filter", + "pointer": "/paths/~1v1~1sandboxes/get/parameters/2", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "pointer": "/paths/~1v1~1sandboxes/get/parameters/3", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "path": "/v1/sandboxes", + "pointer": "/paths/~1v1~1sandboxes/get", + "raw": { + "description": "ListSandboxes lists sandboxes in the caller's owner scope.", + "operationId": "listSandboxes", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name, uid, status and agent.", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListSandboxesResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "ListSandboxes lists sandboxes in the caller's owner scope.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ListSandboxesResponse", + "url": "/reference/api/sandboxes/latest/schemas/ListSandboxesResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "ListSandboxes lists sandboxes in the caller's owner scope.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/listSandboxes/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ListSandboxesResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "CreateSandbox admits a sandbox. Unknown fields at any level are rejected before\nreplay lookup, reservation, policy binding, or workload effects.", + "id": "createSandbox", + "line": 1906, + "method": "POST", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1sandboxes/post/parameters/0", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "path": "/v1/sandboxes", + "pointer": "/paths/~1v1~1sandboxes/post", + "raw": { + "description": "CreateSandbox admits a sandbox. Unknown fields at any level are rejected before\nreplay lookup, reservation, policy binding, or workload effects.", + "operationId": "createSandbox", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSandboxRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "not": { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "creating", + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + } + ] + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "202": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "creating", + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + } + } + }, + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nKit admission was refused; an available settled report describes the rejected fields.\n\nThe Idempotency-Key was already used with a different payload." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "CreateSandbox admits a sandbox.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [ + { + "permission": "mcpWrite", + "requestFieldPresent": "mcp" + } + ], + "x-sbx-error-details": { + "KitFieldOutcomeReport": { + "$ref": "#/components/schemas/KitFieldOutcomeReport" + } + }, + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "Kit admission was refused; an available settled report describes the rejected fields.", + "detailType": "docker.sandboxes.v1.KitFieldOutcomeReport" + }, + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesCreate" + ], + "x-sbx-resource-response": { + "$ref": "#/components/schemas/Sandbox" + }, + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/CreateSandboxRequest", + "url": "/reference/api/sandboxes/latest/schemas/CreateSandboxRequest/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/KitFieldOutcomeReport", + "url": "/reference/api/sandboxes/latest/schemas/KitFieldOutcomeReport/" + }, + { + "ref": "#/components/schemas/Sandbox", + "url": "/reference/api/sandboxes/latest/schemas/Sandbox/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/CreateSandboxRequest" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "CreateSandbox admits a sandbox.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/createSandbox/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/CreateSandboxRequest" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes/post/responses/201/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "not": { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "creating", + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + } + ] + }, + "status": "201" + }, + { + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes/post/responses/202/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "creating", + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + }, + "status": "202" + }, + { + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nKit admission was refused; an available settled report describes the rejected fields.\n\nThe Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "GetSandbox reads one sandbox by its resource name.", + "id": "getSandbox", + "line": 2021, + "method": "GET", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/get/parameters/1", + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/get", + "raw": { + "description": "GetSandbox reads one sandbox by its resource name.", + "operationId": "getSandbox", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Sandbox" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "304": { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body." + }, + "404": { + "content": { + "application/json": { + "examples": { + "notFound": { + "summary": "The target is absent or not visible within the caller's scope.", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target is absent or not visible within the caller's scope." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetSandbox reads one sandbox by its resource name.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "NOT_FOUND", + "description": "The target is absent or not visible within the caller's scope." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Sandbox", + "url": "/reference/api/sandboxes/latest/schemas/Sandbox/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetSandbox reads one sandbox by its resource name.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/getSandbox/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Sandbox" + }, + "status": "200" + }, + { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/get/responses/304", + "status": "304" + }, + { + "description": "The target is absent or not visible within the caller's scope.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "notFound", + "text": "{\n \"code\": \"notFound\",\n \"message\": \"The target is absent or not visible within the caller's scope.\"\n}", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request DELETE \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "DeleteSandbox returns the deleting resource while work remains, or an empty message when absent.", + "id": "deleteSandbox", + "line": 2082, + "method": "DELETE", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/parameters/1", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/parameters/2", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + }, + { + "description": "force requests deletion even when the backend would otherwise refuse the state.", + "in": "query", + "name": "force", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/parameters/3", + "required": false, + "schema": { + "title": "force", + "type": "boolean" + } + } + ], + "path": "/v1/sandboxes/{sandbox}", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete", + "raw": { + "description": "DeleteSandbox returns the deleting resource while work remains, or an empty message when absent.", + "operationId": "deleteSandbox", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + }, + { + "description": "force requests deletion even when the backend would otherwise refuse the state.", + "in": "query", + "name": "force", + "required": false, + "schema": { + "title": "force", + "type": "boolean" + } + } + ], + "responses": { + "202": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "deleting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + } + } + }, + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "204": { + "description": "Success. The response carries no body." + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The Idempotency-Key was already used with a different payload." + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "DeleteSandbox returns the deleting resource while work remains, or an empty message when absent.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesDelete" + ], + "x-sbx-resource-response": { + "$ref": "#/components/schemas/Sandbox" + }, + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Sandbox", + "url": "/reference/api/sandboxes/latest/schemas/Sandbox/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "DeleteSandbox returns the deleting resource while work remains, or an empty message when absent.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/deleteSandbox/", + "variants": [ + { + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/responses/202/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "deleting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + }, + "status": "202" + }, + { + "description": "Success. The response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/responses/204", + "status": "204" + }, + { + "description": "The Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/delete/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PATCH \\\n --header 'Idempotency-Key: \u003cIDEMPOTENCY-KEY\u003e' \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "UpdateSandbox changes only the display label under the observed etag.\nIts resource name, backing identity and child addresses remain unchanged.", + "id": "updateSandbox", + "line": 2202, + "method": "PATCH", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch/parameters/1", + "required": true, + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "minLength": 1, + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch/parameters/2", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch", + "raw": { + "description": "UpdateSandbox changes only the display label under the observed etag.\nIts resource name, backing identity and child addresses remain unchanged.", + "operationId": "updateSandbox", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "required": true, + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "minLength": 1, + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "UpdateSandboxRequest changes only the display label under the observed etag.", + "properties": { + "displayName": { + "description": "display_name must be present and retains the existing scoped label rules.", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9_-]+$", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "displayName" + ], + "title": "UpdateSandboxRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Sandbox" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The Idempotency-Key was already used with a different payload." + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "UpdateSandbox changes only the display label under the observed etag.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesRename" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Sandbox", + "url": "/reference/api/sandboxes/latest/schemas/Sandbox/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "UpdateSandboxRequest changes only the display label under the observed etag.", + "properties": { + "displayName": { + "description": "display_name must be present and retains the existing scoped label rules.", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9_-]+$", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "displayName" + ], + "title": "UpdateSandboxRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "UpdateSandbox changes only the display label under the observed etag.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/updateSandbox/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "UpdateSandboxRequest changes only the display label under the observed etag.", + "properties": { + "displayName": { + "description": "display_name must be present and retains the existing scoped label rules.", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9_-]+$", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "displayName" + ], + "title": "UpdateSandboxRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Sandbox" + }, + "status": "200" + }, + { + "description": "The Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}/patch/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/endpoint-credentials'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "CreateEndpointCredential grants short-lived access to one sandbox endpoint.\nIssuance checks current authority and never stores a token in the replay ledger.", + "id": "createEndpointCredential", + "line": 2325, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1endpoint-credentials/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/endpoint-credentials", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1endpoint-credentials/post", + "raw": { + "description": "CreateEndpointCredential grants short-lived access to one sandbox endpoint.\nIssuance checks current authority and never stores a token in the replay ledger.", + "operationId": "createEndpointCredential", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "CreateEndpointCredentialRequest requests only endpoint permissions the caller holds.", + "properties": { + "permissions": { + "description": "Allowed values: sandboxesExec, sandboxesFilesRead, sandboxesFilesWrite.", + "items": { + "$ref": "#/components/schemas/Permission", + "enum": [ + "sandboxesExec", + "sandboxesFilesRead", + "sandboxesFilesWrite" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "ttl": { + "$ref": "#/components/schemas/Duration", + "description": "ttl defaults to five minutes; supplied durations are clamped to one second through five minutes." + } + }, + "required": [ + "permissions" + ], + "title": "CreateEndpointCredentialRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EndpointCredential" + } + } + }, + "description": "Success", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + } + } + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + } + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "CreateEndpointCredential grants short-lived access to one sandbox endpoint.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesCredential" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Duration", + "url": "/reference/api/sandboxes/latest/schemas/Duration/" + }, + { + "ref": "#/components/schemas/EndpointCredential", + "url": "/reference/api/sandboxes/latest/schemas/EndpointCredential/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Permission", + "url": "/reference/api/sandboxes/latest/schemas/Permission/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "CreateEndpointCredentialRequest requests only endpoint permissions the caller holds.", + "properties": { + "permissions": { + "description": "Allowed values: sandboxesExec, sandboxesFilesRead, sandboxesFilesWrite.", + "items": { + "$ref": "#/components/schemas/Permission", + "enum": [ + "sandboxesExec", + "sandboxesFilesRead", + "sandboxesFilesWrite" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "ttl": { + "$ref": "#/components/schemas/Duration", + "description": "ttl defaults to five minutes; supplied durations are clamped to one second through five minutes." + } + }, + "required": [ + "permissions" + ], + "title": "CreateEndpointCredentialRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "CreateEndpointCredential grants short-lived access to one sandbox endpoint.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/createEndpointCredential/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1endpoint-credentials/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "CreateEndpointCredentialRequest requests only endpoint permissions the caller holds.", + "properties": { + "permissions": { + "description": "Allowed values: sandboxesExec, sandboxesFilesRead, sandboxesFilesWrite.", + "items": { + "$ref": "#/components/schemas/Permission", + "enum": [ + "sandboxesExec", + "sandboxesFilesRead", + "sandboxesFilesWrite" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "ttl": { + "$ref": "#/components/schemas/Duration", + "description": "ttl defaults to five minutes; supplied durations are clamped to one second through five minutes." + } + }, + "required": [ + "permissions" + ], + "title": "CreateEndpointCredentialRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1endpoint-credentials/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/EndpointCredential" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1endpoint-credentials/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/mcp-gateway'", + "curlNotes": [], + "deprecated": null, + "description": "GetMcpGateway reads gateway state for the sandbox.", + "id": "getMcpGateway", + "line": 2401, + "method": "GET", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/mcp-gateway", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway/get", + "raw": { + "description": "GetMcpGateway reads gateway state for the sandbox.", + "operationId": "getMcpGateway", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/McpGateway" + } + } + }, + "description": "Success" + }, + "404": { + "content": { + "application/json": { + "examples": { + "notFound": { + "summary": "The target is absent or not visible within the caller's scope.", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target is absent or not visible within the caller's scope." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetMcpGateway reads gateway state for the sandbox.", + "tags": [ + "MCP gateways" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "NOT_FOUND", + "description": "The target is absent or not visible within the caller's scope." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "mcpRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/McpGateway", + "url": "/reference/api/sandboxes/latest/schemas/McpGateway/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetMcpGateway reads gateway state for the sandbox.", + "tags": [ + "MCP gateways" + ], + "url": "/reference/api/sandboxes/latest/operations/getMcpGateway/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/McpGateway" + }, + "status": "200" + }, + { + "description": "The target is absent or not visible within the caller's scope.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "notFound", + "text": "{\n \"code\": \"notFound\",\n \"message\": \"The target is absent or not visible within the caller's scope.\"\n}", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/mcp-gateway/servers'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "AddMcpGatewayServer adds one server to an existing ready gateway.", + "id": "addMcpGatewayServer", + "line": 2451, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1servers/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/mcp-gateway/servers", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1servers/post", + "raw": { + "description": "AddMcpGatewayServer adds one server to an existing ready gateway.", + "operationId": "addMcpGatewayServer", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "AddMcpGatewayServerRequest adds one server to an existing ready gateway.", + "properties": { + "server": { + "description": "server is the external configured key; a supplied registration must define this same key.\nA mismatch refuses FAILED_PRECONDITION before changing the gateway.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "server" + ], + "title": "AddMcpGatewayServerRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddMcpGatewayServerResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "AddMcpGatewayServer adds one server to an existing ready gateway.", + "tags": [ + "MCP gateways" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "mcpWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/AddMcpGatewayServerResponse", + "url": "/reference/api/sandboxes/latest/schemas/AddMcpGatewayServerResponse/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "AddMcpGatewayServerRequest adds one server to an existing ready gateway.", + "properties": { + "server": { + "description": "server is the external configured key; a supplied registration must define this same key.\nA mismatch refuses FAILED_PRECONDITION before changing the gateway.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "server" + ], + "title": "AddMcpGatewayServerRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "AddMcpGatewayServer adds one server to an existing ready gateway.", + "tags": [ + "MCP gateways" + ], + "url": "/reference/api/sandboxes/latest/operations/addMcpGatewayServer/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1servers/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "AddMcpGatewayServerRequest adds one server to an existing ready gateway.", + "properties": { + "server": { + "description": "server is the external configured key; a supplied registration must define this same key.\nA mismatch refuses FAILED_PRECONDITION before changing the gateway.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "server" + ], + "title": "AddMcpGatewayServerRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1servers/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/AddMcpGatewayServerResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1servers/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/mcp-gateway/start'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "StartMcpGateway ensures a gateway exists for the sandbox.\nAction: a lifecycle transition is not a representation a caller can PUT.", + "id": "startMcpGateway", + "line": 2504, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1start/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/mcp-gateway/start", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1start/post", + "raw": { + "description": "StartMcpGateway ensures a gateway exists for the sandbox.\nAction: a lifecycle transition is not a representation a caller can PUT.", + "operationId": "startMcpGateway", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "StartMcpGatewayRequest ensures a sandbox gateway exists.\nservers must be empty when gateway_url is set", + "properties": { + "gatewayUrl": { + "description": "gateway_url attaches read-only to a pre-existing shareable gateway when supported.", + "format": "uri", + "type": [ + "string", + "null" + ] + }, + "servers": { + "description": "servers are initial server names for a backend-minted gateway.", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "static": { + "description": "static pins the requested server set and closes gateway-side discovery.", + "type": "boolean" + } + }, + "title": "StartMcpGatewayRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/McpGateway" + }, + { + "not": { + "properties": { + "state": { + "enum": [ + "provisioning" + ] + } + }, + "required": [ + "state" + ] + } + } + ] + } + } + }, + "description": "Success" + }, + "202": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/McpGateway" + }, + { + "properties": { + "state": { + "enum": [ + "provisioning" + ] + } + }, + "required": [ + "state" + ] + } + ] + } + } + }, + "description": "Accepted. The resource is still progressing; read it or follow its events until completion." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "StartMcpGateway ensures a gateway exists for the sandbox.", + "tags": [ + "MCP gateways" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "mcpWrite" + ], + "x-sbx-resource-response": { + "$ref": "#/components/schemas/McpGateway" + }, + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/McpGateway", + "url": "/reference/api/sandboxes/latest/schemas/McpGateway/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "StartMcpGatewayRequest ensures a sandbox gateway exists.\nservers must be empty when gateway_url is set", + "properties": { + "gatewayUrl": { + "description": "gateway_url attaches read-only to a pre-existing shareable gateway when supported.", + "format": "uri", + "type": [ + "string", + "null" + ] + }, + "servers": { + "description": "servers are initial server names for a backend-minted gateway.", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "static": { + "description": "static pins the requested server set and closes gateway-side discovery.", + "type": "boolean" + } + }, + "title": "StartMcpGatewayRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "StartMcpGateway ensures a gateway exists for the sandbox.", + "tags": [ + "MCP gateways" + ], + "url": "/reference/api/sandboxes/latest/operations/startMcpGateway/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1start/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "StartMcpGatewayRequest ensures a sandbox gateway exists.\nservers must be empty when gateway_url is set", + "properties": { + "gatewayUrl": { + "description": "gateway_url attaches read-only to a pre-existing shareable gateway when supported.", + "format": "uri", + "type": [ + "string", + "null" + ] + }, + "servers": { + "description": "servers are initial server names for a backend-minted gateway.", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "static": { + "description": "static pins the requested server set and closes gateway-side discovery.", + "type": "boolean" + } + }, + "title": "StartMcpGatewayRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1start/post/responses/200/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/McpGateway" + }, + { + "not": { + "properties": { + "state": { + "enum": [ + "provisioning" + ] + } + }, + "required": [ + "state" + ] + } + } + ] + }, + "status": "200" + }, + { + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1start/post/responses/202/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/McpGateway" + }, + { + "properties": { + "state": { + "enum": [ + "provisioning" + ] + } + }, + "required": [ + "state" + ] + } + ] + }, + "status": "202" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1start/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/mcp-gateway/stop'", + "curlNotes": [], + "deprecated": null, + "description": "StopMcpGateway stops or detaches the gateway and succeeds when already absent.\nAction: a lifecycle transition is not a representation a caller can PUT.", + "id": "stopMcpGateway", + "line": 2591, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1stop/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/mcp-gateway/stop", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1stop/post", + "raw": { + "description": "StopMcpGateway stops or detaches the gateway and succeeds when already absent.\nAction: a lifecycle transition is not a representation a caller can PUT.", + "operationId": "stopMcpGateway", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StopMcpGatewayResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "StopMcpGateway stops or detaches the gateway and succeeds when already absent.", + "tags": [ + "MCP gateways" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "mcpWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/StopMcpGatewayResponse", + "url": "/reference/api/sandboxes/latest/schemas/StopMcpGatewayResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "StopMcpGateway stops or detaches the gateway and succeeds when already absent.", + "tags": [ + "MCP gateways" + ], + "url": "/reference/api/sandboxes/latest/operations/stopMcpGateway/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1stop/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/StopMcpGatewayResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1mcp-gateway~1stop/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/network-policies'", + "curlNotes": [], + "deprecated": null, + "description": "GetNetworkPolicies returns effective and exact views of the same installed generation.", + "id": "getNetworkPolicies", + "line": 2628, + "method": "GET", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1network-policies/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/network-policies", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1network-policies/get", + "raw": { + "description": "GetNetworkPolicies returns effective and exact views of the same installed generation.", + "operationId": "getNetworkPolicies", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetNetworkPoliciesResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetNetworkPolicies returns effective and exact views of the same installed generation.", + "tags": [ + "Network policies" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "networkPoliciesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/GetNetworkPoliciesResponse", + "url": "/reference/api/sandboxes/latest/schemas/GetNetworkPoliciesResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetNetworkPolicies returns effective and exact views of the same installed generation.", + "tags": [ + "Network policies" + ], + "url": "/reference/api/sandboxes/latest/operations/getNetworkPolicies/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1network-policies/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/GetNetworkPoliciesResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1network-policies/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/policy-logs?since=2023-01-15T01%3A30%3A15.01Z\u0026until=2023-01-15T01%3A30%3A15.01Z'", + "curlNotes": [], + "deprecated": null, + "description": "ListPolicyLogEntries lists observed policy decisions.", + "id": "listPolicyLogEntries", + "line": 2663, + "method": "GET", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1policy-logs/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1policy-logs/get/parameters/1", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1policy-logs/get/parameters/2", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable field is\ndomain.", + "in": "query", + "name": "filter", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1policy-logs/get/parameters/3", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "An RFC 3339 timestamp, for example 2026-01-01T12:00:00Z. Fractional seconds may contain up to nine digits. The supported range is 0001-01-01T00:00:00Z through 9999-12-31T23:59:59.999999999Z.", + "in": "query", + "name": "since", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1policy-logs/get/parameters/4", + "required": false, + "schema": { + "examples": [ + "2023-01-15T01:30:15.01Z", + "2024-12-25T12:00:00Z" + ], + "format": "date-time", + "type": "string" + } + }, + { + "description": "An RFC 3339 timestamp, for example 2026-01-01T12:00:00Z. Fractional seconds may contain up to nine digits. The supported range is 0001-01-01T00:00:00Z through 9999-12-31T23:59:59.999999999Z.", + "in": "query", + "name": "until", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1policy-logs/get/parameters/5", + "required": false, + "schema": { + "examples": [ + "2023-01-15T01:30:15.01Z", + "2024-12-25T12:00:00Z" + ], + "format": "date-time", + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/policy-logs", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1policy-logs/get", + "raw": { + "description": "ListPolicyLogEntries lists observed policy decisions.", + "operationId": "listPolicyLogEntries", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable field is\ndomain.", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "An RFC 3339 timestamp, for example 2026-01-01T12:00:00Z. Fractional seconds may contain up to nine digits. The supported range is 0001-01-01T00:00:00Z through 9999-12-31T23:59:59.999999999Z.", + "in": "query", + "name": "since", + "required": false, + "schema": { + "examples": [ + "2023-01-15T01:30:15.01Z", + "2024-12-25T12:00:00Z" + ], + "format": "date-time", + "type": "string" + } + }, + { + "description": "An RFC 3339 timestamp, for example 2026-01-01T12:00:00Z. Fractional seconds may contain up to nine digits. The supported range is 0001-01-01T00:00:00Z through 9999-12-31T23:59:59.999999999Z.", + "in": "query", + "name": "until", + "required": false, + "schema": { + "examples": [ + "2023-01-15T01:30:15.01Z", + "2024-12-25T12:00:00Z" + ], + "format": "date-time", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPolicyLogEntriesResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "ListPolicyLogEntries lists observed policy decisions.", + "tags": [ + "Network policies" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "networkPoliciesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ListPolicyLogEntriesResponse", + "url": "/reference/api/sandboxes/latest/schemas/ListPolicyLogEntriesResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "ListPolicyLogEntries lists observed policy decisions.", + "tags": [ + "Network policies" + ], + "url": "/reference/api/sandboxes/latest/operations/listPolicyLogEntries/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1policy-logs/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ListPolicyLogEntriesResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1policy-logs/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/ports'", + "curlNotes": [], + "deprecated": null, + "description": "ListPorts lists currently published ports for one sandbox.", + "id": "listPorts", + "line": 2744, + "method": "GET", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/ports", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/get", + "raw": { + "description": "ListPorts lists currently published ports for one sandbox.", + "operationId": "listPorts", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPortsResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "ListPorts lists currently published ports for one sandbox.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ListPortsResponse", + "url": "/reference/api/sandboxes/latest/schemas/ListPortsResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "ListPorts lists currently published ports for one sandbox.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/listPorts/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ListPortsResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/ports'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "CreatePort makes one sandbox port reachable outside the sandbox.", + "id": "createPort", + "line": 2778, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/post/parameters/1", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/ports", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/post", + "raw": { + "description": "CreatePort makes one sandbox port reachable outside the sandbox.", + "operationId": "createPort", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "CreatePortRequest publishes one sandbox port.", + "properties": { + "port": { + "$ref": "#/components/schemas/CreatePortRequestPortInput", + "description": "port is the requested publication." + } + }, + "required": [ + "port" + ], + "title": "CreatePortRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Port" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "alreadyExists": { + "summary": "The sandbox already publishes this port number.", + "value": { + "code": "alreadyExists", + "message": "The sandbox already publishes this port number." + } + }, + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe sandbox already publishes this port number.\n\nThe Idempotency-Key was already used with a different payload." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "CreatePort makes one sandbox port reachable outside the sandbox.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "ALREADY_EXISTS", + "description": "The sandbox already publishes this port number." + }, + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesPorts" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/CreatePortRequestPortInput", + "url": "/reference/api/sandboxes/latest/schemas/CreatePortRequestPortInput/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Port", + "url": "/reference/api/sandboxes/latest/schemas/Port/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "CreatePortRequest publishes one sandbox port.", + "properties": { + "port": { + "$ref": "#/components/schemas/CreatePortRequestPortInput", + "description": "port is the requested publication." + } + }, + "required": [ + "port" + ], + "title": "CreatePortRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "CreatePort makes one sandbox port reachable outside the sandbox.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/createPort/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "CreatePortRequest publishes one sandbox port.", + "properties": { + "port": { + "$ref": "#/components/schemas/CreatePortRequestPortInput", + "description": "port is the requested publication." + } + }, + "required": [ + "port" + ], + "title": "CreatePortRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Port" + }, + "status": "201" + }, + { + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe sandbox already publishes this port number.\n\nThe Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "alreadyExists", + "text": "{\n \"code\": \"alreadyExists\",\n \"message\": \"The sandbox already publishes this port number.\"\n}", + "value": { + "code": "alreadyExists", + "message": "The sandbox already publishes this port number." + } + }, + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/ports/\u003cPORT\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "GetPort reads one published port by its resource name.", + "id": "getPort", + "line": 2867, + "method": "GET", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The port id.", + "in": "path", + "name": "port", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/get/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/get/parameters/2", + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/ports/{port}", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/get", + "raw": { + "description": "GetPort reads one published port by its resource name.", + "operationId": "getPort", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The port id.", + "in": "path", + "name": "port", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Port" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "304": { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body." + }, + "404": { + "content": { + "application/json": { + "examples": { + "notFound": { + "summary": "No publication exists for this port resource name.", + "value": { + "code": "notFound", + "message": "No publication exists for this port resource name." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No publication exists for this port resource name." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetPort reads one published port by its resource name.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "NOT_FOUND", + "description": "No publication exists for this port resource name." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Port", + "url": "/reference/api/sandboxes/latest/schemas/Port/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetPort reads one published port by its resource name.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/getPort/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Port" + }, + "status": "200" + }, + { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/get/responses/304", + "status": "304" + }, + { + "description": "No publication exists for this port resource name.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "notFound", + "text": "{\n \"code\": \"notFound\",\n \"message\": \"No publication exists for this port resource name.\"\n}", + "value": { + "code": "notFound", + "message": "No publication exists for this port resource name." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/ports/\u003cPORT\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "DeletePort withdraws one published port. A name that is not published\nsucceeds, so a retried delete reports the same result as the first.", + "id": "deletePort", + "line": 2934, + "method": "DELETE", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/delete/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The port id.", + "in": "path", + "name": "port", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/delete/parameters/1", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/delete/parameters/2", + "required": true, + "schema": { + "description": "etag identifies the publication version the caller intends to delete.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/ports/{port}", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/delete", + "raw": { + "description": "DeletePort withdraws one published port. A name that is not published\nsucceeds, so a retried delete reports the same result as the first.", + "operationId": "deletePort", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The port id.", + "in": "path", + "name": "port", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag identifies the publication version the caller intends to delete.", + "title": "If-Match", + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Success. The response carries no body." + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "DeletePort withdraws one published port.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesPorts" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "DeletePort withdraws one published port.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/deletePort/", + "variants": [ + { + "description": "Success. The response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/delete/responses/204", + "status": "204" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/delete/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/delete/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ports~1{port}/delete/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/renew-timeout'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "RenewSandboxTimeout sets a TTL when timeout renewal is supported. The TTL starts at acceptance, and the response returns the new expires_at with the sandbox's timeout configuration preserved.\nAction: the TTL restarts at acceptance, so the result is not a value the caller could\nPUT.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "renewSandboxTimeout", + "line": 3008, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1renew-timeout/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/renew-timeout", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1renew-timeout/post", + "raw": { + "description": "RenewSandboxTimeout sets a TTL when timeout renewal is supported. The TTL starts at acceptance, and the response returns the new expires_at with the sandbox's timeout configuration preserved.\nAction: the TTL restarts at acceptance, so the result is not a value the caller could\nPUT.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "renewSandboxTimeout", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "RenewSandboxTimeoutRequest sets a new remaining TTL.", + "properties": { + "timeout": { + "$ref": "#/components/schemas/Duration", + "description": "timeout is the new TTL relative to server acceptance time." + } + }, + "required": [ + "timeout" + ], + "title": "RenewSandboxTimeoutRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Sandbox" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "RenewSandboxTimeout sets a TTL when timeout renewal is supported.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesLifecycle" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Duration", + "url": "/reference/api/sandboxes/latest/schemas/Duration/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Sandbox", + "url": "/reference/api/sandboxes/latest/schemas/Sandbox/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "RenewSandboxTimeoutRequest sets a new remaining TTL.", + "properties": { + "timeout": { + "$ref": "#/components/schemas/Duration", + "description": "timeout is the new TTL relative to server acceptance time." + } + }, + "required": [ + "timeout" + ], + "title": "RenewSandboxTimeoutRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "RenewSandboxTimeout sets a TTL when timeout renewal is supported.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/renewSandboxTimeout/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1renew-timeout/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "RenewSandboxTimeoutRequest sets a new remaining TTL.", + "properties": { + "timeout": { + "$ref": "#/components/schemas/Duration", + "description": "timeout is the new TTL relative to server acceptance time." + } + }, + "required": [ + "timeout" + ], + "title": "RenewSandboxTimeoutRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1renew-timeout/post/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Sandbox" + }, + "status": "200" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1renew-timeout/post/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1renew-timeout/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/snapshots'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "CreateSnapshot checkpoints a running sandbox; a stopped source is rejected.", + "id": "createSnapshot", + "line": 3083, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1snapshots/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1snapshots/post/parameters/1", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/snapshots", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1snapshots/post", + "raw": { + "description": "CreateSnapshot checkpoints a running sandbox; a stopped source is rejected.", + "operationId": "createSnapshot", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "CreateSnapshotRequest captures one running sandbox.", + "properties": { + "captureMode": { + "$ref": "#/components/schemas/CaptureMode", + "description": "capture_mode selects disk-only or memory plus disk capture. A value this\nenum does not define is rejected, never coerced to a capture." + }, + "description": { + "description": "description is caller-supplied text.", + "type": "string" + }, + "displayName": { + "description": "display_name is a scoped label; the backend assigns the immutable resource ID.", + "minLength": 1, + "not": { + "enum": [ + ".", + ".." + ], + "type": "string" + }, + "pattern": "^[^/]+$", + "type": "string" + } + }, + "required": [ + "displayName" + ], + "title": "CreateSnapshotRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Snapshot" + }, + { + "not": { + "properties": { + "status": { + "enum": [ + "creating" + ] + } + }, + "required": [ + "status" + ] + } + } + ] + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "202": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Snapshot" + }, + { + "properties": { + "status": { + "enum": [ + "creating" + ] + } + }, + "required": [ + "status" + ] + } + ] + } + } + }, + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "CreateSnapshot checkpoints a running sandbox; a stopped source is rejected.", + "tags": [ + "Snapshots" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "snapshotsWrite" + ], + "x-sbx-resource-response": { + "$ref": "#/components/schemas/Snapshot" + }, + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/CaptureMode", + "url": "/reference/api/sandboxes/latest/schemas/CaptureMode/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Snapshot", + "url": "/reference/api/sandboxes/latest/schemas/Snapshot/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "CreateSnapshotRequest captures one running sandbox.", + "properties": { + "captureMode": { + "$ref": "#/components/schemas/CaptureMode", + "description": "capture_mode selects disk-only or memory plus disk capture. A value this\nenum does not define is rejected, never coerced to a capture." + }, + "description": { + "description": "description is caller-supplied text.", + "type": "string" + }, + "displayName": { + "description": "display_name is a scoped label; the backend assigns the immutable resource ID.", + "minLength": 1, + "not": { + "enum": [ + ".", + ".." + ], + "type": "string" + }, + "pattern": "^[^/]+$", + "type": "string" + } + }, + "required": [ + "displayName" + ], + "title": "CreateSnapshotRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "CreateSnapshot checkpoints a running sandbox; a stopped source is rejected.", + "tags": [ + "Snapshots" + ], + "url": "/reference/api/sandboxes/latest/operations/createSnapshot/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1snapshots/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "CreateSnapshotRequest captures one running sandbox.", + "properties": { + "captureMode": { + "$ref": "#/components/schemas/CaptureMode", + "description": "capture_mode selects disk-only or memory plus disk capture. A value this\nenum does not define is rejected, never coerced to a capture." + }, + "description": { + "description": "description is caller-supplied text.", + "type": "string" + }, + "displayName": { + "description": "display_name is a scoped label; the backend assigns the immutable resource ID.", + "minLength": 1, + "not": { + "enum": [ + ".", + ".." + ], + "type": "string" + }, + "pattern": "^[^/]+$", + "type": "string" + } + }, + "required": [ + "displayName" + ], + "title": "CreateSnapshotRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1snapshots/post/responses/201/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Snapshot" + }, + { + "not": { + "properties": { + "status": { + "enum": [ + "creating" + ] + } + }, + "required": [ + "status" + ] + } + } + ] + }, + "status": "201" + }, + { + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1snapshots/post/responses/202/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Snapshot" + }, + { + "properties": { + "status": { + "enum": [ + "creating" + ] + } + }, + "required": [ + "status" + ] + } + ] + }, + "status": "202" + }, + { + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1snapshots/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1snapshots/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/ssh-certificates'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "IssueSSHCert signs a caller-held public key for sandbox SSH access.\nA create: each call mints one certificate under the sandbox's certificate collection.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "issueSSHCert", + "line": 3206, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ssh-certificates/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/ssh-certificates", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ssh-certificates/post", + "raw": { + "description": "IssueSSHCert signs a caller-held public key for sandbox SSH access.\nA create: each call mints one certificate under the sandbox's certificate collection.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "issueSSHCert", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "IssueSSHCertRequest asks the backend to sign a caller-held public key.", + "properties": { + "publicKey": { + "description": "public_key is the caller-held SSH public key.", + "minLength": 1, + "type": "string" + }, + "ttl": { + "$ref": "#/components/schemas/Duration", + "description": "ttl is the requested certificate lifetime." + } + }, + "required": [ + "publicKey" + ], + "title": "IssueSSHCertRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IssueSSHCertResponse" + } + } + }, + "description": "Success", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + } + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service.", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + } + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + } + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "IssueSSHCert signs a caller-held public key for sandbox SSH access.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesSsh" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Duration", + "url": "/reference/api/sandboxes/latest/schemas/Duration/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/IssueSSHCertResponse", + "url": "/reference/api/sandboxes/latest/schemas/IssueSSHCertResponse/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "IssueSSHCertRequest asks the backend to sign a caller-held public key.", + "properties": { + "publicKey": { + "description": "public_key is the caller-held SSH public key.", + "minLength": 1, + "type": "string" + }, + "ttl": { + "$ref": "#/components/schemas/Duration", + "description": "ttl is the requested certificate lifetime." + } + }, + "required": [ + "publicKey" + ], + "title": "IssueSSHCertRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "IssueSSHCert signs a caller-held public key for sandbox SSH access.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/issueSSHCert/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ssh-certificates/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "IssueSSHCertRequest asks the backend to sign a caller-held public key.", + "properties": { + "publicKey": { + "description": "public_key is the caller-held SSH public key.", + "minLength": 1, + "type": "string" + }, + "ttl": { + "$ref": "#/components/schemas/Duration", + "description": "ttl is the requested certificate lifetime." + } + }, + "required": [ + "publicKey" + ], + "title": "IssueSSHCertRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "const": "no-store", + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ssh-certificates/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/IssueSSHCertResponse" + }, + "status": "201" + }, + { + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ssh-certificates/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ssh-certificates/post/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": { + "Cache-Control": { + "required": true, + "schema": { + "enum": [ + "no-store" + ], + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1ssh-certificates/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/start'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "StartSandbox starts a stopped sandbox; a backend that preserved memory resumes it.\nAction: a lifecycle transition is not a representation a caller can PUT.", + "id": "startSandbox", + "line": 3312, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/parameters/1", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/parameters/2", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/start", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post", + "raw": { + "description": "StartSandbox starts a stopped sandbox; a backend that preserved memory resumes it.\nAction: a lifecycle transition is not a representation a caller can PUT.", + "operationId": "startSandbox", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "StartSandboxRequest starts or resumes a sandbox.", + "properties": {}, + "title": "StartSandboxRequest", + "type": "object" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "not": { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + } + ] + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "202": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + } + } + }, + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The Idempotency-Key was already used with a different payload." + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "StartSandbox starts a stopped sandbox; a backend that preserved memory resumes it.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesLifecycle" + ], + "x-sbx-resource-response": { + "$ref": "#/components/schemas/Sandbox" + }, + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Sandbox", + "url": "/reference/api/sandboxes/latest/schemas/Sandbox/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "StartSandboxRequest starts or resumes a sandbox.", + "properties": {}, + "title": "StartSandboxRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "StartSandbox starts a stopped sandbox; a backend that preserved memory resumes it.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/startSandbox/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/requestBody/content/application~1json", + "required": false, + "schema": { + "additionalProperties": false, + "description": "StartSandboxRequest starts or resumes a sandbox.", + "properties": {}, + "title": "StartSandboxRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/responses/200/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "not": { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + } + ] + }, + "status": "200" + }, + { + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/responses/202/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + }, + "status": "202" + }, + { + "description": "The Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1start/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/sandboxes/\u003cSANDBOX\u003e/stop'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "StopSandbox stops a running sandbox; a backend advertising memory preservation hibernates it.\nAction: a lifecycle transition is not a representation a caller can PUT.", + "id": "stopSandbox", + "line": 3459, + "method": "POST", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/parameters/1", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/parameters/2", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/sandboxes/{sandbox}/stop", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post", + "raw": { + "description": "StopSandbox stops a running sandbox; a backend advertising memory preservation hibernates it.\nAction: a lifecycle transition is not a representation a caller can PUT.", + "operationId": "stopSandbox", + "parameters": [ + { + "description": "The sandbox id.", + "in": "path", + "name": "sandbox", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "StopSandboxRequest stops a sandbox; a backend advertising memory preservation hibernates it.", + "properties": {}, + "title": "StopSandboxRequest", + "type": "object" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "not": { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "stopping" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + } + ] + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "202": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "stopping" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + } + } + }, + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The Idempotency-Key was already used with a different payload." + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "StopSandbox stops a running sandbox; a backend advertising memory preservation hibernates it.", + "tags": [ + "Sandboxes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "sandboxesLifecycle" + ], + "x-sbx-resource-response": { + "$ref": "#/components/schemas/Sandbox" + }, + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Sandbox", + "url": "/reference/api/sandboxes/latest/schemas/Sandbox/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "StopSandboxRequest stops a sandbox; a backend advertising memory preservation hibernates it.", + "properties": {}, + "title": "StopSandboxRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "StopSandbox stops a running sandbox; a backend advertising memory preservation hibernates it.", + "tags": [ + "Sandboxes" + ], + "url": "/reference/api/sandboxes/latest/operations/stopSandbox/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/requestBody/content/application~1json", + "required": false, + "schema": { + "additionalProperties": false, + "description": "StopSandboxRequest stops a sandbox; a backend advertising memory preservation hibernates it.", + "properties": {}, + "title": "StopSandboxRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/responses/200/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "not": { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "stopping" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + } + ] + }, + "status": "200" + }, + { + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/responses/202/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "stopping" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + }, + "status": "202" + }, + { + "description": "The Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1sandboxes~1{sandbox}~1stop/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/secrets'", + "curlNotes": [], + "deprecated": null, + "description": "ListSecrets lists secret metadata in the caller's owner scope.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "listSecrets", + "line": 3606, + "method": "GET", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "pointer": "/paths/~1v1~1secrets/get/parameters/0", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "pointer": "/paths/~1v1~1secrets/get/parameters/1", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name and uid.", + "in": "query", + "name": "filter", + "pointer": "/paths/~1v1~1secrets/get/parameters/2", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "pointer": "/paths/~1v1~1secrets/get/parameters/3", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "path": "/v1/secrets", + "pointer": "/paths/~1v1~1secrets/get", + "raw": { + "description": "ListSecrets lists secret metadata in the caller's owner scope.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "listSecrets", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name and uid.", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListSecretsResponse" + } + } + }, + "description": "Success" + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "ListSecrets lists secret metadata in the caller's owner scope.", + "tags": [ + "Secrets" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "secretsRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ListSecretsResponse", + "url": "/reference/api/sandboxes/latest/schemas/ListSecretsResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "ListSecrets lists secret metadata in the caller's owner scope.", + "tags": [ + "Secrets" + ], + "url": "/reference/api/sandboxes/latest/operations/listSecrets/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ListSecretsResponse" + }, + "status": "200" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets/get/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/secrets'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "CreateSecret stores new secret material.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "createSecret", + "line": 3687, + "method": "POST", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1secrets/post/parameters/0", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "path": "/v1/secrets", + "pointer": "/paths/~1v1~1secrets/post", + "raw": { + "description": "CreateSecret stores new secret material.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "createSecret", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSecretRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Secret" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload." + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "CreateSecret stores new secret material.", + "tags": [ + "Secrets" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + }, + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "secretsWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/CreateSecretRequest", + "url": "/reference/api/sandboxes/latest/schemas/CreateSecretRequest/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Secret", + "url": "/reference/api/sandboxes/latest/schemas/Secret/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/CreateSecretRequest" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "CreateSecret stores new secret material.", + "tags": [ + "Secrets" + ], + "url": "/reference/api/sandboxes/latest/operations/createSecret/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/CreateSecretRequest" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Secret" + }, + "status": "201" + }, + { + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets/post/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/secrets/\u003cSECRET\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "GetSecret reads one secret's metadata; material is never returned.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "getSecret", + "line": 3769, + "method": "GET", + "parameters": [ + { + "description": "The secret id.", + "in": "path", + "name": "secret", + "pointer": "/paths/~1v1~1secrets~1{secret}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "pointer": "/paths/~1v1~1secrets~1{secret}/get/parameters/1", + "schema": { + "type": "string" + } + } + ], + "path": "/v1/secrets/{secret}", + "pointer": "/paths/~1v1~1secrets~1{secret}/get", + "raw": { + "description": "GetSecret reads one secret's metadata; material is never returned.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "getSecret", + "parameters": [ + { + "description": "The secret id.", + "in": "path", + "name": "secret", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Secret" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "304": { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body." + }, + "404": { + "content": { + "application/json": { + "examples": { + "notFound": { + "summary": "The target is absent or not visible within the caller's scope.", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target is absent or not visible within the caller's scope." + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetSecret reads one secret's metadata; material is never returned.", + "tags": [ + "Secrets" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "NOT_FOUND", + "description": "The target is absent or not visible within the caller's scope." + }, + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "secretsRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Secret", + "url": "/reference/api/sandboxes/latest/schemas/Secret/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetSecret reads one secret's metadata; material is never returned.", + "tags": [ + "Secrets" + ], + "url": "/reference/api/sandboxes/latest/operations/getSecret/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Secret" + }, + "status": "200" + }, + { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1secrets~1{secret}/get/responses/304", + "status": "304" + }, + { + "description": "The target is absent or not visible within the caller's scope.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "notFound", + "text": "{\n \"code\": \"notFound\",\n \"message\": \"The target is absent or not visible within the caller's scope.\"\n}", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/get/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request PUT \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/secrets/\u003cSECRET\u003e'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "UpdateSecret replaces secret metadata and material.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "updateSecret", + "line": 3847, + "method": "PUT", + "parameters": [ + { + "description": "The secret id.", + "in": "path", + "name": "secret", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/parameters/1", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/parameters/2", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/secrets/{secret}", + "pointer": "/paths/~1v1~1secrets~1{secret}/put", + "raw": { + "description": "UpdateSecret replaces secret metadata and material.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "updateSecret", + "parameters": [ + { + "description": "The secret id.", + "in": "path", + "name": "secret", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSecretBody" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Secret" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The Idempotency-Key was already used with a different payload." + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "UpdateSecret replaces secret metadata and material.", + "tags": [ + "Secrets" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + }, + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "secretsWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Secret", + "url": "/reference/api/sandboxes/latest/schemas/Secret/" + }, + { + "ref": "#/components/schemas/UpdateSecretBody", + "url": "/reference/api/sandboxes/latest/schemas/UpdateSecretBody/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/UpdateSecretBody" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "UpdateSecret replaces secret metadata and material.", + "tags": [ + "Secrets" + ], + "url": "/reference/api/sandboxes/latest/operations/updateSecret/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/UpdateSecretBody" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Secret" + }, + "status": "200" + }, + { + "description": "The Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/put/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request DELETE \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/secrets/\u003cSECRET\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "DeleteSecret deletes a secret; deleting an already absent secret succeeds.\nIts response carries the credential fence receipt, so it answers 200 with a\nbody rather than the 204 an empty-response delete declares.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "deleteSecret", + "line": 3968, + "method": "DELETE", + "parameters": [ + { + "description": "The secret id.", + "in": "path", + "name": "secret", + "pointer": "/paths/~1v1~1secrets~1{secret}/delete/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1secrets~1{secret}/delete/parameters/1", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/secrets/{secret}", + "pointer": "/paths/~1v1~1secrets~1{secret}/delete", + "raw": { + "description": "DeleteSecret deletes a secret; deleting an already absent secret succeeds.\nIts response carries the credential fence receipt, so it answers 200 with a\nbody rather than the 204 an empty-response delete declares.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "deleteSecret", + "parameters": [ + { + "description": "The secret id.", + "in": "path", + "name": "secret", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteSecretResponse" + } + } + }, + "description": "Success" + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "DeleteSecret deletes a secret; deleting an already absent secret succeeds.", + "tags": [ + "Secrets" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "secretsWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/DeleteSecretResponse", + "url": "/reference/api/sandboxes/latest/schemas/DeleteSecretResponse/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "DeleteSecret deletes a secret; deleting an already absent secret succeeds.", + "tags": [ + "Secrets" + ], + "url": "/reference/api/sandboxes/latest/operations/deleteSecret/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/delete/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/DeleteSecretResponse" + }, + "status": "200" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/delete/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/delete/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/delete/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1secrets~1{secret}/delete/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/snapshots'", + "curlNotes": [], + "deprecated": null, + "description": "ListSnapshots lists snapshots in the caller's owner scope.", + "id": "listSnapshots", + "line": 4060, + "method": "GET", + "parameters": [ + { + "description": "(OPTIONAL) sandbox is the complete resource name, in the form sandboxes/{sandbox}.", + "in": "query", + "name": "sandbox", + "pointer": "/paths/~1v1~1snapshots/get/parameters/0", + "required": false, + "schema": { + "pattern": "^(?:sandboxes/[^/]+)?$", + "title": "sandbox", + "type": "string" + } + }, + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "pointer": "/paths/~1v1~1snapshots/get/parameters/1", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "pointer": "/paths/~1v1~1snapshots/get/parameters/2", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name and uid.", + "in": "query", + "name": "filter", + "pointer": "/paths/~1v1~1snapshots/get/parameters/3", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "pointer": "/paths/~1v1~1snapshots/get/parameters/4", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "path": "/v1/snapshots", + "pointer": "/paths/~1v1~1snapshots/get", + "raw": { + "description": "ListSnapshots lists snapshots in the caller's owner scope.", + "operationId": "listSnapshots", + "parameters": [ + { + "description": "(OPTIONAL) sandbox is the complete resource name, in the form sandboxes/{sandbox}.", + "in": "query", + "name": "sandbox", + "required": false, + "schema": { + "pattern": "^(?:sandboxes/[^/]+)?$", + "title": "sandbox", + "type": "string" + } + }, + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name and uid.", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListSnapshotsResponse" + } + } + }, + "description": "Success" + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "ListSnapshots lists snapshots in the caller's owner scope.", + "tags": [ + "Snapshots" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "snapshotsRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ListSnapshotsResponse", + "url": "/reference/api/sandboxes/latest/schemas/ListSnapshotsResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "ListSnapshots lists snapshots in the caller's owner scope.", + "tags": [ + "Snapshots" + ], + "url": "/reference/api/sandboxes/latest/operations/listSnapshots/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ListSnapshotsResponse" + }, + "status": "200" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/snapshots/\u003cSNAPSHOT\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "GetSnapshot reads one snapshot by its resource name.", + "id": "getSnapshot", + "line": 4132, + "method": "GET", + "parameters": [ + { + "description": "The snapshot id.", + "in": "path", + "name": "snapshot", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/get/parameters/1", + "schema": { + "type": "string" + } + } + ], + "path": "/v1/snapshots/{snapshot}", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/get", + "raw": { + "description": "GetSnapshot reads one snapshot by its resource name.", + "operationId": "getSnapshot", + "parameters": [ + { + "description": "The snapshot id.", + "in": "path", + "name": "snapshot", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Snapshot" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "304": { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body." + }, + "404": { + "content": { + "application/json": { + "examples": { + "notFound": { + "summary": "The target is absent or not visible within the caller's scope.", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target is absent or not visible within the caller's scope." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetSnapshot reads one snapshot by its resource name.", + "tags": [ + "Snapshots" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "NOT_FOUND", + "description": "The target is absent or not visible within the caller's scope." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "snapshotsRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Snapshot", + "url": "/reference/api/sandboxes/latest/schemas/Snapshot/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetSnapshot reads one snapshot by its resource name.", + "tags": [ + "Snapshots" + ], + "url": "/reference/api/sandboxes/latest/operations/getSnapshot/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Snapshot" + }, + "status": "200" + }, + { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/get/responses/304", + "status": "304" + }, + { + "description": "The target is absent or not visible within the caller's scope.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "notFound", + "text": "{\n \"code\": \"notFound\",\n \"message\": \"The target is absent or not visible within the caller's scope.\"\n}", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://connect.docker.com/sandboxes/v1/snapshots/\u003cSNAPSHOT\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "DeleteSnapshot deletes a snapshot; deleting an already absent snapshot succeeds.", + "id": "deleteSnapshot", + "line": 4193, + "method": "DELETE", + "parameters": [ + { + "description": "The snapshot id.", + "in": "path", + "name": "snapshot", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/delete/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/delete/parameters/1", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/snapshots/{snapshot}", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/delete", + "raw": { + "description": "DeleteSnapshot deletes a snapshot; deleting an already absent snapshot succeeds.", + "operationId": "deleteSnapshot", + "parameters": [ + { + "description": "The snapshot id.", + "in": "path", + "name": "snapshot", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Success. The response carries no body." + }, + "409": { + "content": { + "application/json": { + "examples": { + "deletion_content_lease_held": { + "summary": "An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held.", + "value": { + "code": "failedPrecondition", + "message": "deletion_content_lease_held: An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held." + } + }, + "deletion_preparation_incomplete": { + "summary": "The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.", + "value": { + "code": "failedPrecondition", + "message": "deletion_preparation_incomplete: The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.\n\nAn admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held." + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "DeleteSnapshot deletes a snapshot; deleting an already absent snapshot succeeds.", + "tags": [ + "Snapshots" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.", + "reason": "deletion_preparation_incomplete" + }, + { + "code": "FAILED_PRECONDITION", + "description": "An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held.", + "reason": "deletion_content_lease_held" + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "snapshotsWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "DeleteSnapshot deletes a snapshot; deleting an already absent snapshot succeeds.", + "tags": [ + "Snapshots" + ], + "url": "/reference/api/sandboxes/latest/operations/deleteSnapshot/", + "variants": [ + { + "description": "Success. The response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/delete/responses/204", + "status": "204" + }, + { + "description": "The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.\n\nAn admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "deletion_content_lease_held", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"deletion_content_lease_held: An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "deletion_content_lease_held: An admitted consumer or live resource holds a content lease on the target; deletion is refused while any lease remains held." + } + }, + { + "language": "json", + "name": "deletion_preparation_incomplete", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"deletion_preparation_incomplete: The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "deletion_preparation_incomplete: The target's preparation, capture, or import has not finished; deletion is refused until it settles to a terminal state." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/delete/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/delete/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/delete/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}/delete/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/snapshots/\u003cSNAPSHOT\u003e/restore'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "RestoreSnapshot forks a new sandbox from a snapshot.\nAction: a restore creates a sandbox, so the snapshot in the path is the source and not\nthe created resource.", + "id": "restoreSnapshot", + "line": 4288, + "method": "POST", + "parameters": [ + { + "description": "The snapshot id.", + "in": "path", + "name": "snapshot", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}~1restore/post/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}~1restore/post/parameters/1", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "path": "/v1/snapshots/{snapshot}/restore", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}~1restore/post", + "raw": { + "description": "RestoreSnapshot forks a new sandbox from a snapshot.\nAction: a restore creates a sandbox, so the snapshot in the path is the source and not\nthe created resource.", + "operationId": "restoreSnapshot", + "parameters": [ + { + "description": "The snapshot id.", + "in": "path", + "name": "snapshot", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "description": "RestoreSnapshotRequest creates a new sandbox from one snapshot.", + "properties": { + "displayName": { + "description": "(OPTIONAL) display_name is a scoped label; the backend assigns the immutable resource ID.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]*$", + "type": "string" + } + }, + "title": "RestoreSnapshotRequest", + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "not": { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "creating", + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + } + ] + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "202": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "creating", + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + } + } + }, + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "RestoreSnapshot forks a new sandbox from a snapshot.", + "tags": [ + "Snapshots" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "snapshotsRead", + "sandboxesCreate" + ], + "x-sbx-resource-response": { + "$ref": "#/components/schemas/Sandbox" + }, + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Sandbox", + "url": "/reference/api/sandboxes/latest/schemas/Sandbox/" + } + ], + "requestSchema": { + "additionalProperties": false, + "description": "RestoreSnapshotRequest creates a new sandbox from one snapshot.", + "properties": { + "displayName": { + "description": "(OPTIONAL) display_name is a scoped label; the backend assigns the immutable resource ID.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]*$", + "type": "string" + } + }, + "title": "RestoreSnapshotRequest", + "type": "object" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "RestoreSnapshot forks a new sandbox from a snapshot.", + "tags": [ + "Snapshots" + ], + "url": "/reference/api/sandboxes/latest/operations/restoreSnapshot/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}~1restore/post/requestBody/content/application~1json", + "required": true, + "schema": { + "additionalProperties": false, + "description": "RestoreSnapshotRequest creates a new sandbox from one snapshot.", + "properties": { + "displayName": { + "description": "(OPTIONAL) display_name is a scoped label; the backend assigns the immutable resource ID.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]*$", + "type": "string" + } + }, + "title": "RestoreSnapshotRequest", + "type": "object" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}~1restore/post/responses/201/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "not": { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "creating", + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + } + ] + }, + "status": "201" + }, + { + "description": "Accepted. The resource is still progressing; read it or follow its events until completion.", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}~1restore/post/responses/202/content/application~1json", + "required": null, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Sandbox" + }, + { + "properties": { + "core": { + "properties": { + "status": { + "enum": [ + "creating", + "starting" + ] + } + }, + "required": [ + "status" + ] + } + }, + "required": [ + "core" + ] + } + ] + }, + "status": "202" + }, + { + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}~1restore/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1snapshots~1{snapshot}~1restore/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/volumes'", + "curlNotes": [], + "deprecated": null, + "description": "ListVolumes lists volumes in the caller's owner scope.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "listVolumes", + "line": 4410, + "method": "GET", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "pointer": "/paths/~1v1~1volumes/get/parameters/0", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "pointer": "/paths/~1v1~1volumes/get/parameters/1", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name and uid.", + "in": "query", + "name": "filter", + "pointer": "/paths/~1v1~1volumes/get/parameters/2", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "pointer": "/paths/~1v1~1volumes/get/parameters/3", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "path": "/v1/volumes", + "pointer": "/paths/~1v1~1volumes/get", + "raw": { + "description": "ListVolumes lists volumes in the caller's owner scope.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "listVolumes", + "parameters": [ + { + "description": "page_size is an optional page size.\n\nOmitted or zero uses the backend default. Unless the operation states otherwise, page-size limits and handling of larger requests are backend-specific; use the backend support guide. Continue with nextPageToken until it is empty.", + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "title": "page_size", + "type": "integer" + } + }, + { + "description": "page_token is an opaque continuation token.", + "in": "query", + "name": "pageToken", + "required": false, + "schema": { + "title": "page_token", + "type": "string" + } + }, + { + "description": "filter is comma-separated exact-match field=value terms; the portable fields are\nname, display_name and uid.", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "title": "filter", + "type": "string" + } + }, + { + "description": "order_by is a single order field with optional direction; the portable fields are\ncreated_at and name.", + "in": "query", + "name": "orderBy", + "required": false, + "schema": { + "title": "order_by", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListVolumesResponse" + } + } + }, + "description": "Success" + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "ListVolumes lists volumes in the caller's owner scope.", + "tags": [ + "Volumes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "volumesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/ListVolumesResponse", + "url": "/reference/api/sandboxes/latest/schemas/ListVolumesResponse/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "ListVolumes lists volumes in the caller's owner scope.", + "tags": [ + "Volumes" + ], + "url": "/reference/api/sandboxes/latest/operations/listVolumes/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/ListVolumesResponse" + }, + "status": "200" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes/get/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request POST \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-binary @request-body \\\n 'https://connect.docker.com/sandboxes/v1/volumes'", + "curlNotes": [ + "Prepare request-body using the selected media type and schema." + ], + "deprecated": null, + "description": "CreateVolume creates a persistent volume.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "createVolume", + "line": 4491, + "method": "POST", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "pointer": "/paths/~1v1~1volumes/post/parameters/0", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "path": "/v1/volumes", + "pointer": "/paths/~1v1~1volumes/post", + "raw": { + "description": "CreateVolume creates a persistent volume.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "createVolume", + "parameters": [ + { + "description": "Replay key. Reusing it with a different payload fails with failedPrecondition; accepted keys are retained for at least 24 hours.", + "in": "header", + "name": "Idempotency-Key", + "schema": { + "description": "Idempotency key. A replay returns the first result; the same key with a different payload fails with FAILED_PRECONDITION; retained at least 24 hours.", + "title": "Idempotency-Key", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateVolumeRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Volume" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "409": { + "content": { + "application/json": { + "examples": { + "failedPrecondition": { + "summary": "The Idempotency-Key was already used with a different payload.", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload." + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "CreateVolume creates a persistent volume.", + "tags": [ + "Volumes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + }, + { + "code": "FAILED_PRECONDITION", + "description": "The Idempotency-Key was already used with a different payload." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "volumesWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/CreateVolumeRequest", + "url": "/reference/api/sandboxes/latest/schemas/CreateVolumeRequest/" + }, + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Volume", + "url": "/reference/api/sandboxes/latest/schemas/Volume/" + } + ], + "requestSchema": { + "$ref": "#/components/schemas/CreateVolumeRequest" + }, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "CreateVolume creates a persistent volume.", + "tags": [ + "Volumes" + ], + "url": "/reference/api/sandboxes/latest/operations/createVolume/", + "variants": [ + { + "description": null, + "direction": "Request", + "examples": [], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes/post/requestBody/content/application~1json", + "required": true, + "schema": { + "$ref": "#/components/schemas/CreateVolumeRequest" + }, + "status": "" + }, + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes/post/responses/201/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Volume" + }, + "status": "201" + }, + { + "description": "Creation conflicts with an existing resource (ALREADY_EXISTS).\n\nThe Idempotency-Key was already used with a different payload.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "failedPrecondition", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"The Idempotency-Key was already used with a different payload.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "The Idempotency-Key was already used with a different payload." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes/post/responses/409/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "409" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes/post/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes/post/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "application/json", + "curl": "curl \\\n --request GET \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n --header 'Accept: application/json' \\\n 'https://connect.docker.com/sandboxes/v1/volumes/\u003cVOLUME\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "GetVolume reads one volume by its resource name.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "getVolume", + "line": 4573, + "method": "GET", + "parameters": [ + { + "description": "The volume id.", + "in": "path", + "name": "volume", + "pointer": "/paths/~1v1~1volumes~1{volume}/get/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "pointer": "/paths/~1v1~1volumes~1{volume}/get/parameters/1", + "schema": { + "type": "string" + } + } + ], + "path": "/v1/volumes/{volume}", + "pointer": "/paths/~1v1~1volumes~1{volume}/get", + "raw": { + "description": "GetVolume reads one volume by its resource name.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "getVolume", + "parameters": [ + { + "description": "The volume id.", + "in": "path", + "name": "volume", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "A quoted entity-tag or comma-separated list, compared weakly with the current resource etag. A match, including a weak form or wildcard *, answers 304 without a body after authorization. Malformed input is treated as no match.", + "in": "header", + "name": "If-None-Match", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Volume" + } + } + }, + "description": "Success", + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + } + }, + "304": { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body." + }, + "404": { + "content": { + "application/json": { + "examples": { + "notFound": { + "summary": "The target is absent or not visible within the caller's scope.", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The target is absent or not visible within the caller's scope." + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "GetVolume reads one volume by its resource name.", + "tags": [ + "Volumes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "NOT_FOUND", + "description": "The target is absent or not visible within the caller's scope." + }, + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "volumesRead" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "ref": "#/components/schemas/Volume", + "url": "/reference/api/sandboxes/latest/schemas/Volume/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "GetVolume reads one volume by its resource name.", + "tags": [ + "Volumes" + ], + "url": "/reference/api/sandboxes/latest/operations/getVolume/", + "variants": [ + { + "description": "Success", + "direction": "Response", + "examples": [], + "headers": { + "ETag": { + "description": "The etag of the resource this response carries, which the next mutation of it sends as If-Match.", + "schema": { + "type": "string" + } + } + }, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes~1{volume}/get/responses/200/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Volume" + }, + "status": "200" + }, + { + "description": "The resource's etag equals the If-None-Match value, so this response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1volumes~1{volume}/get/responses/304", + "status": "304" + }, + { + "description": "The target is absent or not visible within the caller's scope.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "notFound", + "text": "{\n \"code\": \"notFound\",\n \"message\": \"The target is absent or not visible within the caller's scope.\"\n}", + "value": { + "code": "notFound", + "message": "The target is absent or not visible within the caller's scope." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes~1{volume}/get/responses/404/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "404" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes~1{volume}/get/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes~1{volume}/get/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + }, + { + "acceptMedia": "", + "curl": "curl \\\n --request DELETE \\\n --header 'If-Match: \u003cIF-MATCH\u003e' \\\n --header \"Authorization: Bearer ${TOKEN}\" \\\n 'https://connect.docker.com/sandboxes/v1/volumes/\u003cVOLUME\u003e'", + "curlNotes": [], + "deprecated": null, + "description": "DeleteVolume deletes a volume; deleting an already absent volume succeeds.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "id": "deleteVolume", + "line": 4651, + "method": "DELETE", + "parameters": [ + { + "description": "The volume id.", + "in": "path", + "name": "volume", + "pointer": "/paths/~1v1~1volumes~1{volume}/delete/parameters/0", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "pointer": "/paths/~1v1~1volumes~1{volume}/delete/parameters/1", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "path": "/v1/volumes/{volume}", + "pointer": "/paths/~1v1~1volumes~1{volume}/delete", + "raw": { + "description": "DeleteVolume deletes a volume; deleting an already absent volume succeeds.\n\nReturns unimplemented when this operation is unavailable. Support does not grant permission.", + "operationId": "deleteVolume", + "parameters": [ + { + "description": "The volume id.", + "in": "path", + "name": "volume", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The complete quoted strong entity-tag observed on the resource, including its quotes. Every mutation of an existing resource requires it: an absent value answers 428 and a stale one 412, each carrying failedPrecondition in the body.", + "in": "header", + "name": "If-Match", + "required": true, + "schema": { + "description": "etag is the required precondition, the value the target's last read returned.\nAn absent one refuses etag_required and a stale one etag_mismatch.", + "title": "If-Match", + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "Success. The response carries no body." + }, + "412": { + "content": { + "application/json": { + "examples": { + "etag_mismatch": { + "summary": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + }, + "428": { + "content": { + "application/json": { + "examples": { + "etag_required": { + "summary": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required." + }, + "501": { + "content": { + "application/json": { + "examples": { + "unimplemented": { + "summary": "This operation is not available on this service.", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + }, + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "This operation is not available on this service." + }, + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "description": "The structured Error body identifies the failure with a stable code and optional typed details." + } + }, + "security": [ + { + "bearer": [] + } + ], + "summary": "DeleteVolume deletes a volume; deleting an already absent volume succeeds.", + "tags": [ + "Volumes" + ], + "x-sbx-authenticated-only": false, + "x-sbx-conditional-permissions": [], + "x-sbx-error-responses": [ + { + "code": "UNIMPLEMENTED", + "description": "This operation is not available on this service." + } + ], + "x-sbx-plane": "control", + "x-sbx-required-permissions": [ + "volumesWrite" + ], + "x-sbx-serving-surface": "management" + }, + "references": [ + { + "ref": "#/components/schemas/Error", + "url": "/reference/api/sandboxes/latest/schemas/Error/" + } + ], + "requestSchema": null, + "security": [ + { + "bearer": [] + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "summary": "DeleteVolume deletes a volume; deleting an already absent volume succeeds.", + "tags": [ + "Volumes" + ], + "url": "/reference/api/sandboxes/latest/operations/deleteVolume/", + "variants": [ + { + "description": "Success. The response carries no body.", + "direction": "Response", + "examples": [], + "headers": null, + "media": "", + "pointer": "/paths/~1v1~1volumes~1{volume}/delete/responses/204", + "status": "204" + }, + { + "description": "The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_mismatch", + "text": "{\n \"code\": \"failedPrecondition\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/docker.sandboxes.v1.EtagMismatch\",\n \"currentEtag\": \"v2\"\n }\n ],\n \"message\": \"etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value.\"\n}", + "value": { + "code": "failedPrecondition", + "details": [ + { + "@type": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "currentEtag": "v2" + } + ], + "message": "etag_mismatch: The precondition is not the resource's current etag. The body carries failedPrecondition naming etag_mismatch and an EtagMismatch detail with the current value." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes~1{volume}/delete/responses/412/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "412" + }, + { + "description": "No precondition was sent. The body carries failedPrecondition naming etag_required.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "etag_required", + "text": "{\n \"code\": \"failedPrecondition\",\n \"message\": \"etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required.\"\n}", + "value": { + "code": "failedPrecondition", + "message": "etag_required: No precondition was sent. The body carries failedPrecondition naming etag_required." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes~1{volume}/delete/responses/428/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "428" + }, + { + "description": "This operation is not available on this service.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "unimplemented", + "text": "{\n \"code\": \"unimplemented\",\n \"message\": \"This operation is not available on this service.\"\n}", + "value": { + "code": "unimplemented", + "message": "This operation is not available on this service." + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes~1{volume}/delete/responses/501/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "501" + }, + { + "description": "The structured Error body identifies the failure with a stable code and optional typed details.", + "direction": "Response", + "examples": [ + { + "language": "json", + "name": "Schema example", + "text": "{\n \"code\": \"notFound\",\n \"details\": [],\n \"message\": \"sandbox not found\"\n}", + "value": { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + } + ], + "headers": null, + "media": "application/json", + "pointer": "/paths/~1v1~1volumes~1{volume}/delete/responses/default/content/application~1json", + "required": null, + "schema": { + "$ref": "#/components/schemas/Error" + }, + "status": "default" + } + ] + } + ], + "owner": "docker/sbx-api", + "product": "sandboxes", + "schemaCount": 557, + "schemaURLs": { + "#/components/schemas/AddMcpGatewayServerResponse": "/reference/api/sandboxes/latest/schemas/AddMcpGatewayServerResponse/", + "#/components/schemas/AppliedKit": "/reference/api/sandboxes/latest/schemas/AppliedKit/", + "#/components/schemas/AttachmentMode": "/reference/api/sandboxes/latest/schemas/AttachmentMode/", + "#/components/schemas/AttributedRule": "/reference/api/sandboxes/latest/schemas/AttributedRule/", + "#/components/schemas/BadRequest": "/reference/api/sandboxes/latest/schemas/BadRequest/", + "#/components/schemas/BadRequestErrorDetail": "/reference/api/sandboxes/latest/schemas/BadRequestErrorDetail/", + "#/components/schemas/BadRequestFieldViolation": "/reference/api/sandboxes/latest/schemas/BadRequestFieldViolation/", + "#/components/schemas/CaptureMode": "/reference/api/sandboxes/latest/schemas/CaptureMode/", + "#/components/schemas/CreateImageRequest": "/reference/api/sandboxes/latest/schemas/CreateImageRequest/", + "#/components/schemas/CreatePortRequestPortInput": "/reference/api/sandboxes/latest/schemas/CreatePortRequestPortInput/", + "#/components/schemas/CreateProcessRequest": "/reference/api/sandboxes/latest/schemas/CreateProcessRequest/", + "#/components/schemas/CreateSandboxRequest": "/reference/api/sandboxes/latest/schemas/CreateSandboxRequest/", + "#/components/schemas/CreateSecretRequest": "/reference/api/sandboxes/latest/schemas/CreateSecretRequest/", + "#/components/schemas/CreateVolumeRequest": "/reference/api/sandboxes/latest/schemas/CreateVolumeRequest/", + "#/components/schemas/CredentialFenceReceipt": "/reference/api/sandboxes/latest/schemas/CredentialFenceReceipt/", + "#/components/schemas/CustomInjection": "/reference/api/sandboxes/latest/schemas/CustomInjection/", + "#/components/schemas/CustomSecretMaterial": "/reference/api/sandboxes/latest/schemas/CustomSecretMaterial/", + "#/components/schemas/DebugInfo": "/reference/api/sandboxes/latest/schemas/DebugInfo/", + "#/components/schemas/DebugInfoErrorDetail": "/reference/api/sandboxes/latest/schemas/DebugInfoErrorDetail/", + "#/components/schemas/DeleteSecretResponse": "/reference/api/sandboxes/latest/schemas/DeleteSecretResponse/", + "#/components/schemas/Duration": "/reference/api/sandboxes/latest/schemas/Duration/", + "#/components/schemas/EffectiveCoreLifecycle": "/reference/api/sandboxes/latest/schemas/EffectiveCoreLifecycle/", + "#/components/schemas/EffectiveFeatures": "/reference/api/sandboxes/latest/schemas/EffectiveFeatures/", + "#/components/schemas/EffectiveManagedVolumes": "/reference/api/sandboxes/latest/schemas/EffectiveManagedVolumes/", + "#/components/schemas/EffectiveNetworkPolicy": "/reference/api/sandboxes/latest/schemas/EffectiveNetworkPolicy/", + "#/components/schemas/EffectiveTimeouts": "/reference/api/sandboxes/latest/schemas/EffectiveTimeouts/", + "#/components/schemas/EffectiveVolumeAttachment": "/reference/api/sandboxes/latest/schemas/EffectiveVolumeAttachment/", + "#/components/schemas/EndpointAuthentication": "/reference/api/sandboxes/latest/schemas/EndpointAuthentication/", + "#/components/schemas/EndpointAuthenticationScheme": "/reference/api/sandboxes/latest/schemas/EndpointAuthenticationScheme/", + "#/components/schemas/EndpointCredential": "/reference/api/sandboxes/latest/schemas/EndpointCredential/", + "#/components/schemas/EndpointCredentialTransport": "/reference/api/sandboxes/latest/schemas/EndpointCredentialTransport/", + "#/components/schemas/Error": "/reference/api/sandboxes/latest/schemas/Error/", + "#/components/schemas/ErrorCode": "/reference/api/sandboxes/latest/schemas/ErrorCode/", + "#/components/schemas/ErrorDetail": "/reference/api/sandboxes/latest/schemas/ErrorDetail/", + "#/components/schemas/ErrorInfo": "/reference/api/sandboxes/latest/schemas/ErrorInfo/", + "#/components/schemas/ErrorInfoErrorDetail": "/reference/api/sandboxes/latest/schemas/ErrorInfoErrorDetail/", + "#/components/schemas/EtagMismatch": "/reference/api/sandboxes/latest/schemas/EtagMismatch/", + "#/components/schemas/EtagMismatchErrorDetail": "/reference/api/sandboxes/latest/schemas/EtagMismatchErrorDetail/", + "#/components/schemas/ExactDestination": "/reference/api/sandboxes/latest/schemas/ExactDestination/", + "#/components/schemas/ExactDestinationKind": "/reference/api/sandboxes/latest/schemas/ExactDestinationKind/", + "#/components/schemas/ExactNetworkPolicy": "/reference/api/sandboxes/latest/schemas/ExactNetworkPolicy/", + "#/components/schemas/ExactPolicyConstant": "/reference/api/sandboxes/latest/schemas/ExactPolicyConstant/", + "#/components/schemas/ExactPolicyNode": "/reference/api/sandboxes/latest/schemas/ExactPolicyNode/", + "#/components/schemas/ExactPolicyOperands": "/reference/api/sandboxes/latest/schemas/ExactPolicyOperands/", + "#/components/schemas/ExactPolicyOrigin": "/reference/api/sandboxes/latest/schemas/ExactPolicyOrigin/", + "#/components/schemas/ExactPolicySource": "/reference/api/sandboxes/latest/schemas/ExactPolicySource/", + "#/components/schemas/ExchangeCompositionCredentialResponse": "/reference/api/sandboxes/latest/schemas/ExchangeCompositionCredentialResponse/", + "#/components/schemas/ExecRequest": "/reference/api/sandboxes/latest/schemas/ExecRequest/", + "#/components/schemas/ExecResponse": "/reference/api/sandboxes/latest/schemas/ExecResponse/", + "#/components/schemas/FeatureOptions": "/reference/api/sandboxes/latest/schemas/FeatureOptions/", + "#/components/schemas/FileError": "/reference/api/sandboxes/latest/schemas/FileError/", + "#/components/schemas/FileHeader": "/reference/api/sandboxes/latest/schemas/FileHeader/", + "#/components/schemas/FileInfo": "/reference/api/sandboxes/latest/schemas/FileInfo/", + "#/components/schemas/FileType": "/reference/api/sandboxes/latest/schemas/FileType/", + "#/components/schemas/FilesDownloadRequest": "/reference/api/sandboxes/latest/schemas/FilesDownloadRequest/", + "#/components/schemas/FilesDownloadResponse": "/reference/api/sandboxes/latest/schemas/FilesDownloadResponse/", + "#/components/schemas/FilesListResponse": "/reference/api/sandboxes/latest/schemas/FilesListResponse/", + "#/components/schemas/FilesMkdirRequest": "/reference/api/sandboxes/latest/schemas/FilesMkdirRequest/", + "#/components/schemas/FilesMkdirResponse": "/reference/api/sandboxes/latest/schemas/FilesMkdirResponse/", + "#/components/schemas/FilesMoveRequest": "/reference/api/sandboxes/latest/schemas/FilesMoveRequest/", + "#/components/schemas/FilesMoveResponse": "/reference/api/sandboxes/latest/schemas/FilesMoveResponse/", + "#/components/schemas/FilesReadFileRequest": "/reference/api/sandboxes/latest/schemas/FilesReadFileRequest/", + "#/components/schemas/FilesReadFileResponse": "/reference/api/sandboxes/latest/schemas/FilesReadFileResponse/", + "#/components/schemas/FilesRemoveResponse": "/reference/api/sandboxes/latest/schemas/FilesRemoveResponse/", + "#/components/schemas/FilesStatResponse": "/reference/api/sandboxes/latest/schemas/FilesStatResponse/", + "#/components/schemas/FilesUploadRequest": "/reference/api/sandboxes/latest/schemas/FilesUploadRequest/", + "#/components/schemas/FilesUploadResponse": "/reference/api/sandboxes/latest/schemas/FilesUploadResponse/", + "#/components/schemas/FilesWriteFileRequest": "/reference/api/sandboxes/latest/schemas/FilesWriteFileRequest/", + "#/components/schemas/FilesWriteFileResponse": "/reference/api/sandboxes/latest/schemas/FilesWriteFileResponse/", + "#/components/schemas/GetNetworkPoliciesResponse": "/reference/api/sandboxes/latest/schemas/GetNetworkPoliciesResponse/", + "#/components/schemas/Help": "/reference/api/sandboxes/latest/schemas/Help/", + "#/components/schemas/HelpErrorDetail": "/reference/api/sandboxes/latest/schemas/HelpErrorDetail/", + "#/components/schemas/HelpLink": "/reference/api/sandboxes/latest/schemas/HelpLink/", + "#/components/schemas/IdentityExchangeServiceExchangeDockerCredentialRequest": "/reference/api/sandboxes/latest/schemas/IdentityExchangeServiceExchangeDockerCredentialRequest/", + "#/components/schemas/Image": "/reference/api/sandboxes/latest/schemas/Image/", + "#/components/schemas/ImageBlobRef": "/reference/api/sandboxes/latest/schemas/ImageBlobRef/", + "#/components/schemas/ImageFromImage": "/reference/api/sandboxes/latest/schemas/ImageFromImage/", + "#/components/schemas/ImagePullSpec": "/reference/api/sandboxes/latest/schemas/ImagePullSpec/", + "#/components/schemas/ImagePushTarget": "/reference/api/sandboxes/latest/schemas/ImagePushTarget/", + "#/components/schemas/ImageSource": "/reference/api/sandboxes/latest/schemas/ImageSource/", + "#/components/schemas/ImageStatus": "/reference/api/sandboxes/latest/schemas/ImageStatus/", + "#/components/schemas/ImageSummary": "/reference/api/sandboxes/latest/schemas/ImageSummary/", + "#/components/schemas/InteractRequest": "/reference/api/sandboxes/latest/schemas/InteractRequest/", + "#/components/schemas/IssueSSHCertResponse": "/reference/api/sandboxes/latest/schemas/IssueSSHCertResponse/", + "#/components/schemas/KitArtifactInput": "/reference/api/sandboxes/latest/schemas/KitArtifactInput/", + "#/components/schemas/KitFieldDisposition": "/reference/api/sandboxes/latest/schemas/KitFieldDisposition/", + "#/components/schemas/KitFieldOutcome": "/reference/api/sandboxes/latest/schemas/KitFieldOutcome/", + "#/components/schemas/KitFieldOutcomeReport": "/reference/api/sandboxes/latest/schemas/KitFieldOutcomeReport/", + "#/components/schemas/KitFieldOutcomeReportErrorDetail": "/reference/api/sandboxes/latest/schemas/KitFieldOutcomeReportErrorDetail/", + "#/components/schemas/KitFieldReason": "/reference/api/sandboxes/latest/schemas/KitFieldReason/", + "#/components/schemas/KitInput": "/reference/api/sandboxes/latest/schemas/KitInput/", + "#/components/schemas/KitRef": "/reference/api/sandboxes/latest/schemas/KitRef/", + "#/components/schemas/KitStartup": "/reference/api/sandboxes/latest/schemas/KitStartup/", + "#/components/schemas/KitStartupCommand": "/reference/api/sandboxes/latest/schemas/KitStartupCommand/", + "#/components/schemas/ListImagesResponse": "/reference/api/sandboxes/latest/schemas/ListImagesResponse/", + "#/components/schemas/ListPolicyLogEntriesResponse": "/reference/api/sandboxes/latest/schemas/ListPolicyLogEntriesResponse/", + "#/components/schemas/ListPortsResponse": "/reference/api/sandboxes/latest/schemas/ListPortsResponse/", + "#/components/schemas/ListProcessesResponse": "/reference/api/sandboxes/latest/schemas/ListProcessesResponse/", + "#/components/schemas/ListSandboxesResponse": "/reference/api/sandboxes/latest/schemas/ListSandboxesResponse/", + "#/components/schemas/ListSecretsResponse": "/reference/api/sandboxes/latest/schemas/ListSecretsResponse/", + "#/components/schemas/ListSnapshotsResponse": "/reference/api/sandboxes/latest/schemas/ListSnapshotsResponse/", + "#/components/schemas/ListVolumesResponse": "/reference/api/sandboxes/latest/schemas/ListVolumesResponse/", + "#/components/schemas/LocalizedMessage": "/reference/api/sandboxes/latest/schemas/LocalizedMessage/", + "#/components/schemas/LocalizedMessageErrorDetail": "/reference/api/sandboxes/latest/schemas/LocalizedMessageErrorDetail/", + "#/components/schemas/ManagedVolumeOptions": "/reference/api/sandboxes/latest/schemas/ManagedVolumeOptions/", + "#/components/schemas/McpAuthorization": "/reference/api/sandboxes/latest/schemas/McpAuthorization/", + "#/components/schemas/McpAuthorizationStatus": "/reference/api/sandboxes/latest/schemas/McpAuthorizationStatus/", + "#/components/schemas/McpConfigurationMode": "/reference/api/sandboxes/latest/schemas/McpConfigurationMode/", + "#/components/schemas/McpConfigurationOutcome": "/reference/api/sandboxes/latest/schemas/McpConfigurationOutcome/", + "#/components/schemas/McpConfigurationReport": "/reference/api/sandboxes/latest/schemas/McpConfigurationReport/", + "#/components/schemas/McpConfigurationReportErrorDetail": "/reference/api/sandboxes/latest/schemas/McpConfigurationReportErrorDetail/", + "#/components/schemas/McpConfiguredServer": "/reference/api/sandboxes/latest/schemas/McpConfiguredServer/", + "#/components/schemas/McpCreateSpec": "/reference/api/sandboxes/latest/schemas/McpCreateSpec/", + "#/components/schemas/McpGateway": "/reference/api/sandboxes/latest/schemas/McpGateway/", + "#/components/schemas/McpGatewayState": "/reference/api/sandboxes/latest/schemas/McpGatewayState/", + "#/components/schemas/McpServer": "/reference/api/sandboxes/latest/schemas/McpServer/", + "#/components/schemas/McpServerType": "/reference/api/sandboxes/latest/schemas/McpServerType/", + "#/components/schemas/NetworkPolicy": "/reference/api/sandboxes/latest/schemas/NetworkPolicy/", + "#/components/schemas/NetworkPolicyMode": "/reference/api/sandboxes/latest/schemas/NetworkPolicyMode/", + "#/components/schemas/OAuthConfig": "/reference/api/sandboxes/latest/schemas/OAuthConfig/", + "#/components/schemas/OAuthRefreshMaterial": "/reference/api/sandboxes/latest/schemas/OAuthRefreshMaterial/", + "#/components/schemas/OutputRetention": "/reference/api/sandboxes/latest/schemas/OutputRetention/", + "#/components/schemas/Permission": "/reference/api/sandboxes/latest/schemas/Permission/", + "#/components/schemas/Platform": "/reference/api/sandboxes/latest/schemas/Platform/", + "#/components/schemas/PolicyDecision": "/reference/api/sandboxes/latest/schemas/PolicyDecision/", + "#/components/schemas/PolicyDomain": "/reference/api/sandboxes/latest/schemas/PolicyDomain/", + "#/components/schemas/PolicyLayer": "/reference/api/sandboxes/latest/schemas/PolicyLayer/", + "#/components/schemas/PolicyLogEntry": "/reference/api/sandboxes/latest/schemas/PolicyLogEntry/", + "#/components/schemas/Port": "/reference/api/sandboxes/latest/schemas/Port/", + "#/components/schemas/PreconditionFailure": "/reference/api/sandboxes/latest/schemas/PreconditionFailure/", + "#/components/schemas/PreconditionFailureErrorDetail": "/reference/api/sandboxes/latest/schemas/PreconditionFailureErrorDetail/", + "#/components/schemas/PreconditionFailureViolation": "/reference/api/sandboxes/latest/schemas/PreconditionFailureViolation/", + "#/components/schemas/Process": "/reference/api/sandboxes/latest/schemas/Process/", + "#/components/schemas/ProcessAttach": "/reference/api/sandboxes/latest/schemas/ProcessAttach/", + "#/components/schemas/ProcessChunk": "/reference/api/sandboxes/latest/schemas/ProcessChunk/", + "#/components/schemas/ProcessExited": "/reference/api/sandboxes/latest/schemas/ProcessExited/", + "#/components/schemas/ProcessHeartbeat": "/reference/api/sandboxes/latest/schemas/ProcessHeartbeat/", + "#/components/schemas/ProcessOutput": "/reference/api/sandboxes/latest/schemas/ProcessOutput/", + "#/components/schemas/ProcessSignal": "/reference/api/sandboxes/latest/schemas/ProcessSignal/", + "#/components/schemas/ProcessState": "/reference/api/sandboxes/latest/schemas/ProcessState/", + "#/components/schemas/Protocol": "/reference/api/sandboxes/latest/schemas/Protocol/", + "#/components/schemas/PtyConfig": "/reference/api/sandboxes/latest/schemas/PtyConfig/", + "#/components/schemas/PublishedPort": "/reference/api/sandboxes/latest/schemas/PublishedPort/", + "#/components/schemas/QuotaFailure": "/reference/api/sandboxes/latest/schemas/QuotaFailure/", + "#/components/schemas/QuotaFailureErrorDetail": "/reference/api/sandboxes/latest/schemas/QuotaFailureErrorDetail/", + "#/components/schemas/QuotaFailureViolation": "/reference/api/sandboxes/latest/schemas/QuotaFailureViolation/", + "#/components/schemas/RawImageStartup": "/reference/api/sandboxes/latest/schemas/RawImageStartup/", + "#/components/schemas/ReadOutputResponse": "/reference/api/sandboxes/latest/schemas/ReadOutputResponse/", + "#/components/schemas/ReceiptKind": "/reference/api/sandboxes/latest/schemas/ReceiptKind/", + "#/components/schemas/RequestInfo": "/reference/api/sandboxes/latest/schemas/RequestInfo/", + "#/components/schemas/RequestInfoErrorDetail": "/reference/api/sandboxes/latest/schemas/RequestInfoErrorDetail/", + "#/components/schemas/ResourceInfo": "/reference/api/sandboxes/latest/schemas/ResourceInfo/", + "#/components/schemas/ResourceInfoErrorDetail": "/reference/api/sandboxes/latest/schemas/ResourceInfoErrorDetail/", + "#/components/schemas/Resources": "/reference/api/sandboxes/latest/schemas/Resources/", + "#/components/schemas/RetryInfo": "/reference/api/sandboxes/latest/schemas/RetryInfo/", + "#/components/schemas/RetryInfoErrorDetail": "/reference/api/sandboxes/latest/schemas/RetryInfoErrorDetail/", + "#/components/schemas/Sandbox": "/reference/api/sandboxes/latest/schemas/Sandbox/", + "#/components/schemas/SandboxCore": "/reference/api/sandboxes/latest/schemas/SandboxCore/", + "#/components/schemas/SandboxEndpoint": "/reference/api/sandboxes/latest/schemas/SandboxEndpoint/", + "#/components/schemas/SandboxEndpointProtocol": "/reference/api/sandboxes/latest/schemas/SandboxEndpointProtocol/", + "#/components/schemas/SandboxStatus": "/reference/api/sandboxes/latest/schemas/SandboxStatus/", + "#/components/schemas/Secret": "/reference/api/sandboxes/latest/schemas/Secret/", + "#/components/schemas/SecretType": "/reference/api/sandboxes/latest/schemas/SecretType/", + "#/components/schemas/SignalResponse": "/reference/api/sandboxes/latest/schemas/SignalResponse/", + "#/components/schemas/Snapshot": "/reference/api/sandboxes/latest/schemas/Snapshot/", + "#/components/schemas/SnapshotStatus": "/reference/api/sandboxes/latest/schemas/SnapshotStatus/", + "#/components/schemas/SnapshotSummary": "/reference/api/sandboxes/latest/schemas/SnapshotSummary/", + "#/components/schemas/StartupArgv": "/reference/api/sandboxes/latest/schemas/StartupArgv/", + "#/components/schemas/StartupExecution": "/reference/api/sandboxes/latest/schemas/StartupExecution/", + "#/components/schemas/StopMcpGatewayResponse": "/reference/api/sandboxes/latest/schemas/StopMcpGatewayResponse/", + "#/components/schemas/StopMemoryOutcome": "/reference/api/sandboxes/latest/schemas/StopMemoryOutcome/", + "#/components/schemas/StoredSecretOptions": "/reference/api/sandboxes/latest/schemas/StoredSecretOptions/", + "#/components/schemas/StreamType": "/reference/api/sandboxes/latest/schemas/StreamType/", + "#/components/schemas/TerminalSize": "/reference/api/sandboxes/latest/schemas/TerminalSize/", + "#/components/schemas/TimeoutAction": "/reference/api/sandboxes/latest/schemas/TimeoutAction/", + "#/components/schemas/TimeoutOptions": "/reference/api/sandboxes/latest/schemas/TimeoutOptions/", + "#/components/schemas/Timestamp": "/reference/api/sandboxes/latest/schemas/Timestamp/", + "#/components/schemas/TokenSecretMaterial": "/reference/api/sandboxes/latest/schemas/TokenSecretMaterial/", + "#/components/schemas/UnknownErrorDetail": "/reference/api/sandboxes/latest/schemas/UnknownErrorDetail/", + "#/components/schemas/UpdateSecretBody": "/reference/api/sandboxes/latest/schemas/UpdateSecretBody/", + "#/components/schemas/ValidationFieldPath": "/reference/api/sandboxes/latest/schemas/ValidationFieldPath/", + "#/components/schemas/ValidationFieldPathElement": "/reference/api/sandboxes/latest/schemas/ValidationFieldPathElement/", + "#/components/schemas/ValidationFieldType": "/reference/api/sandboxes/latest/schemas/ValidationFieldType/", + "#/components/schemas/ValidationViolation": "/reference/api/sandboxes/latest/schemas/ValidationViolation/", + "#/components/schemas/ValidationViolations": "/reference/api/sandboxes/latest/schemas/ValidationViolations/", + "#/components/schemas/ValidationViolationsErrorDetail": "/reference/api/sandboxes/latest/schemas/ValidationViolationsErrorDetail/", + "#/components/schemas/Volume": "/reference/api/sandboxes/latest/schemas/Volume/", + "#/components/schemas/VolumeAttachment": "/reference/api/sandboxes/latest/schemas/VolumeAttachment/" + }, + "schemas": [ + { + "name": "AddMcpGatewayServerResponse", + "pointer": "/components/schemas/AddMcpGatewayServerResponse", + "schema": { + "description": "AddMcpGatewayServerResponse returns the added or already-present server.", + "properties": { + "server": { + "$ref": "#/components/schemas/McpServer", + "description": "server is the gateway server." + } + }, + "title": "AddMcpGatewayServerResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/AddMcpGatewayServerResponse/" + }, + { + "name": "AppliedKit", + "pointer": "/components/schemas/AppliedKit", + "schema": { + "description": "AppliedKit records kit content that was applied to a sandbox.", + "properties": { + "appliedAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "applied_at is when the kit became active." + }, + "digest": { + "description": "digest identifies the exact applied content.", + "type": "string" + }, + "kind": { + "description": "kind is normalized to \"sandbox\" or \"mixin\".", + "enum": [ + "sandbox", + "mixin" + ], + "type": "string" + }, + "ref": { + "description": "ref is the kit reference supplied or resolved by the backend.", + "type": "string" + } + }, + "required": [ + "kind" + ], + "title": "AppliedKit", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/AppliedKit/" + }, + { + "name": "AttachmentMode", + "pointer": "/components/schemas/AttachmentMode", + "schema": { + "description": "AttachmentMode fixes attachment ownership independently of backend placement.\n\nValues:\nunspecified: unspecified selects exclusive read-write attachment.\nexclusive: exclusive permits one sandbox to attach the volume read-write.", + "enum": [ + "unspecified", + "exclusive" + ], + "title": "AttachmentMode", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/AttachmentMode/" + }, + { + "name": "AttributedRule", + "pointer": "/components/schemas/AttributedRule", + "schema": { + "description": "AttributedRule reports a rule and the layer that supplied it.", + "properties": { + "layer": { + "$ref": "#/components/schemas/PolicyLayer", + "description": "layer identifies where the rule came from." + }, + "network": { + "description": "network is the network name or CIDR.", + "type": "string" + } + }, + "title": "AttributedRule", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/AttributedRule/" + }, + { + "name": "BadRequest", + "pointer": "/components/schemas/BadRequest", + "schema": { + "description": "Describes violations in a client request. This error type focuses on the\nsyntactic aspects of the request.", + "properties": { + "fieldViolations": { + "description": "Describes all violations in a client request.", + "items": { + "$ref": "#/components/schemas/BadRequestFieldViolation" + }, + "type": "array" + } + }, + "title": "BadRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/BadRequest/" + }, + { + "name": "BadRequestErrorDetail", + "pointer": "/components/schemas/BadRequestErrorDetail", + "schema": { + "description": "Describes violations in a client request. This error type focuses on the\nsyntactic aspects of the request.", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.BadRequest", + "type": "string" + }, + "fieldViolations": { + "description": "Describes all violations in a client request.", + "items": { + "$ref": "#/components/schemas/BadRequestFieldViolation" + }, + "type": "array" + } + }, + "required": [ + "@type" + ], + "title": "BadRequestErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/BadRequestErrorDetail/" + }, + { + "name": "BadRequestFieldViolation", + "pointer": "/components/schemas/BadRequestFieldViolation", + "schema": { + "description": "A message type used to describe a single bad request field.", + "properties": { + "description": { + "description": "A description of why the request element is bad.", + "type": "string" + }, + "field": { + "description": "A path that leads to a field in the request body. The value will be a\nsequence of dot-separated identifiers that identify a protocol buffer\nfield.\n\nConsider the following:\n\nmessage CreateContactRequest {\nmessage EmailAddress {\nenum Type {\nTYPE_UNSPECIFIED = 0;\nHOME = 1;\nWORK = 2;\n}\n\noptional string email = 1;\nrepeated EmailType type = 2;\n}\n\nstring full_name = 1;\nrepeated EmailAddress email_addresses = 2;\n}\n\nIn this example, in proto `field` could take one of the following values:\n\n* `full_name` for a violation in the `full_name` value\n* `email_addresses[0].email` for a violation in the `email` field of the\nfirst `email_addresses` message\n* `email_addresses[2].type[1]` for a violation in the second `type`\nvalue in the third `email_addresses` message.\n\nIn JSON, the same values are represented as:\n\n* `fullName` for a violation in the `fullName` value\n* `emailAddresses[0].email` for a violation in the `email` field of the\nfirst `emailAddresses` message\n* `emailAddresses[2].type[1]` for a violation in the second `type`\nvalue in the third `emailAddresses` message.", + "type": "string" + }, + "localizedMessage": { + "$ref": "#/components/schemas/LocalizedMessage", + "description": "Provides a localized error message for field-level errors that is safe to\nreturn to the API consumer." + }, + "reason": { + "description": "The reason of the field-level error. This is a constant value that\nidentifies the proximate cause of the field-level error. It should\nuniquely identify the type of the FieldViolation within the scope of the\nErrorInfo.domain. This should be at most 63\ncharacters and match a regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`,\nwhich represents UPPER_SNAKE_CASE.", + "type": "string" + } + }, + "title": "FieldViolation", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/BadRequestFieldViolation/" + }, + { + "name": "CaptureMode", + "pointer": "/components/schemas/CaptureMode", + "schema": { + "description": "CaptureMode selects whether captured images include memory.\n\nValues:\nunspecified: unspecified means disk-only capture.\nall: all captures memory and disk and requires memory-capture support.\ndisk: disk captures disk only.", + "enum": [ + "unspecified", + "all", + "disk" + ], + "title": "CaptureMode", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/CaptureMode/" + }, + { + "name": "CreateImageRequest", + "pointer": "/components/schemas/CreateImageRequest", + "schema": { + "allOf": [ + { + "properties": { + "description": { + "description": "description is caller-supplied text.", + "type": "string" + }, + "displayName": { + "description": "display_name is a scoped label; the backend assigns the immutable resource ID.", + "minLength": 1, + "not": { + "enum": [ + ".", + ".." + ], + "type": "string" + }, + "pattern": "^[^/]+$", + "type": "string" + }, + "readyCmd": { + "description": "ready_cmd is used to determine readiness for raw image sandboxes.", + "items": { + "type": "string" + }, + "type": "array" + }, + "startCmd": { + "description": "start_cmd is used when the image is launched as a raw image sandbox.", + "items": { + "type": "string" + }, + "type": "array" + } + } + }, + { + "oneOf": [ + { + "properties": { + "fromImage": { + "$ref": "#/components/schemas/ImageFromImage", + "description": "from_image registers an entry that will receive pushed OCI content." + } + }, + "required": [ + "fromImage" + ], + "title": "from_image", + "type": "object" + } + ] + } + ], + "description": "CreateImageRequest creates a managed image.", + "required": [ + "displayName" + ], + "title": "CreateImageRequest", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/CreateImageRequest/" + }, + { + "name": "CreatePortRequestPortInput", + "pointer": "/components/schemas/CreatePortRequestPortInput", + "schema": { + "additionalProperties": false, + "properties": { + "number": { + "description": "(IMMUTABLE) number is immutable and unique within the sandbox; duplicates refuse ALREADY_EXISTS.", + "format": "int32", + "maximum": 65535, + "minimum": 1, + "type": "integer" + }, + "protocol": { + "description": "(IMMUTABLE) protocol defaults to TCP when unspecified.", + "enum": [ + "unspecified", + "tcp" + ], + "title": "PortInputProtocol", + "type": "string" + } + }, + "required": [ + "number" + ], + "title": "PortInput", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/CreatePortRequestPortInput/" + }, + { + "name": "CreateProcessRequest", + "pointer": "/components/schemas/CreateProcessRequest", + "schema": { + "additionalProperties": false, + "description": "CreateProcessRequest starts an interactive process.", + "properties": { + "cmd": { + "description": "cmd is the argv vector.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "env": { + "additionalProperties": { + "title": "value", + "type": "string" + }, + "description": "env adds environment variables.", + "type": "object" + }, + "label": { + "description": "(OPTIONAL) label is unique within the sandbox; omission retains the server-generated default.", + "minLength": 1, + "type": [ + "string", + "null" + ] + }, + "pty": { + "$ref": "#/components/schemas/PtyConfig", + "description": "pty requests a pseudo-terminal; absence uses separate stdin/stdout/stderr pipes." + }, + "session": { + "description": "session is an optional opaque session tag stored verbatim; empty means untagged.", + "type": "string" + }, + "user": { + "description": "user is the user to run as.", + "type": "string" + }, + "workingDir": { + "description": "working_dir is the process working directory.", + "type": "string" + } + }, + "required": [ + "cmd" + ], + "title": "CreateProcessRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/CreateProcessRequest/" + }, + { + "name": "CreateSandboxRequest", + "pointer": "/components/schemas/CreateSandboxRequest", + "schema": { + "allOf": [ + { + "properties": { + "agent": { + "description": "agent names an optional agent profile; unsupported profiles fail explicitly.", + "type": "string" + }, + "displayName": { + "description": "(OPTIONAL) display_name is a scoped label; the backend assigns the immutable resource ID.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]*$", + "type": "string" + }, + "displayNamePrefix": { + "description": "(OPTIONAL) display_name_prefix requests a generated label and excludes display_name.", + "type": "string" + }, + "environment": { + "additionalProperties": { + "title": "value", + "type": "string" + }, + "description": "environment is non-secret environment metadata.", + "type": "object" + }, + "features": { + "$ref": "#/components/schemas/FeatureOptions", + "description": "features carries typed inputs validated before admission can have effects." + }, + "kits": { + "description": "kits are the kit inputs to apply before readiness, in composition order.", + "items": { + "$ref": "#/components/schemas/KitInput" + }, + "type": "array" + }, + "labels": { + "additionalProperties": { + "description": "", + "title": "value", + "type": "string" + }, + "description": "labels are non-secret caller-assigned key/value metadata recorded at admission.\nThis contract has no verb that changes labels afterwards.", + "maxProperties": 64, + "type": "object" + }, + "mcp": { + "$ref": "#/components/schemas/McpCreateSpec", + "description": "mcp requests an MCP gateway wired before the workload starts." + }, + "networkPolicies": { + "description": "network_policies are inline policies materialized in governance and enforced before the first guest process.\nOmission or an empty list requests no inline policies; unsupported policies fail before create effects.", + "items": { + "$ref": "#/components/schemas/NetworkPolicy" + }, + "type": "array" + }, + "platform": { + "$ref": "#/components/schemas/Platform", + "description": "platform selects an exact supported, image-compatible tuple when present.\nexplicit platform requires OS and architecture" + }, + "policyIds": { + "description": "policy_ids names existing governance policies, never raw policy content.", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "pullPolicy": { + "description": "pull_policy retains shared image-pull semantics and explicit support errors.", + "enum": [ + "unspecified", + "always" + ], + "title": "CreateSandboxRequestPullPolicy", + "type": "string" + }, + "resources": { + "$ref": "#/components/schemas/Resources", + "description": "resources requests CPU and memory within the selected placement's limits." + }, + "startupExecution": { + "$ref": "#/components/schemas/StartupExecution", + "description": "startup_execution is ordinary create input and persists for\nthe sandbox lifetime." + } + } + }, + { + "dependentSchemas": { + "image": { + "not": { + "anyOf": [ + { + "required": [ + "imageRef" + ] + } + ] + } + }, + "imageRef": { + "not": { + "anyOf": [ + { + "required": [ + "image" + ] + } + ] + } + } + }, + "properties": { + "image": { + "description": "image is the managed Image resource name.", + "pattern": "^images/[^/]+$", + "type": "string" + }, + "imageRef": { + "description": "image_ref is an external OCI reference, with the existing backend validation.", + "type": "string" + } + } + } + ], + "description": "CreateSandboxRequest validates typed composition intent before replay and\npersists accepted guarantees, distinct enough from legacy create that old\nservers cannot silently drop it.\ndisplay_name and display_name_prefix are mutually exclusive At most one of image, imageRef is set.", + "title": "CreateSandboxRequest", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/CreateSandboxRequest/" + }, + { + "name": "CreateSecretRequest", + "pointer": "/components/schemas/CreateSecretRequest", + "schema": { + "allOf": [ + { + "properties": { + "displayName": { + "description": "display_name is a scoped label; the backend assigns the immutable resource ID.", + "minLength": 1, + "not": { + "enum": [ + ".", + ".." + ], + "type": "string" + }, + "pattern": "^[^/]+$", + "type": "string" + }, + "serviceType": { + "description": "service_type identifies the consuming service.", + "type": "string" + } + } + }, + { + "oneOf": [ + { + "properties": { + "custom": { + "$ref": "#/components/schemas/CustomSecretMaterial", + "description": "custom stores an opaque value with caller-authored injection metadata.\nCreateSecretRequest.service_type is server-assigned for custom\nmaterial; leave it empty." + } + }, + "required": [ + "custom" + ], + "title": "custom", + "type": "object" + }, + { + "properties": { + "oauth": { + "$ref": "#/components/schemas/OAuthRefreshMaterial", + "description": "oauth stores OAuth refresh material." + } + }, + "required": [ + "oauth" + ], + "title": "oauth", + "type": "object" + }, + { + "properties": { + "token": { + "$ref": "#/components/schemas/TokenSecretMaterial", + "description": "token stores opaque token material." + } + }, + "required": [ + "token" + ], + "title": "token", + "type": "object" + } + ] + } + ], + "description": "CreateSecretRequest stores new secret material.\nservice_type must be empty for custom material (server-assigned)", + "required": [ + "displayName" + ], + "title": "CreateSecretRequest", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/CreateSecretRequest/" + }, + { + "name": "CreateVolumeRequest", + "pointer": "/components/schemas/CreateVolumeRequest", + "schema": { + "additionalProperties": false, + "description": "CreateVolumeRequest creates one volume.", + "properties": { + "displayName": { + "description": "display_name is a scoped label; the backend assigns the immutable resource ID.", + "minLength": 1, + "not": { + "enum": [ + ".", + ".." + ], + "type": "string" + }, + "pattern": "^[^/]+$", + "type": "string" + } + }, + "required": [ + "displayName" + ], + "title": "CreateVolumeRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/CreateVolumeRequest/" + }, + { + "name": "CredentialFenceReceipt", + "pointer": "/components/schemas/CredentialFenceReceipt", + "schema": { + "description": "CredentialFenceReceipt acknowledges one completed generation without granting current use.", + "properties": { + "generation": { + "description": "generation increases for each accepted material/rule replacement on that target.", + "exclusiveMinimum": 0, + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "target": { + "description": "target is the complete Sandbox or Secret resource name bound to this receipt.", + "pattern": "^(sandboxes|secrets)/[^/]+$", + "type": "string" + } + }, + "required": [ + "target", + "generation" + ], + "title": "CredentialFenceReceipt", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/CredentialFenceReceipt/" + }, + { + "name": "CustomInjection", + "pointer": "/components/schemas/CustomInjection", + "schema": { + "additionalProperties": false, + "description": "CustomInjection is caller-authored, non-secret metadata for a custom\nsecret: which exact hosts receive the value, in which header and format,\nand how the placeholder is shaped and delivered. Unlike secret material,\nreads return it.", + "properties": { + "envVar": { + "description": "env_var optionally names a sandbox environment variable that carries the\nsecret's placeholder (never the value) as a delivery convenience.", + "type": "string" + }, + "format": { + "description": "format renders the value with exactly one %s; %% escapes a literal\npercent, and any other % sequence is rejected. Empty means \"%s\".", + "type": "string" + }, + "header": { + "description": "header is the HTTP header the value is written to. Routing, framing,\nand cookie headers are rejected.", + "minLength": 1, + "type": "string" + }, + "hosts": { + "description": "hosts are exact lowercase DNS names. Wildcards, IP literals, ports,\nschemes, paths, and hosts a managed integration already serves are\nrejected.", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + }, + "placeholderTemplate": { + "description": "placeholder_template optionally shapes the placeholder for clients that\nvalidate credential shape before sending (e.g. \"sk-corp-{rand}\"). Each\n{rand} token is expanded server-side; {rand} is the only token. Empty\nuses the backend default (\"sbx-cs-{rand}\").", + "type": "string" + } + }, + "required": [ + "hosts", + "header" + ], + "title": "CustomInjection", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/CustomInjection/" + }, + { + "name": "CustomSecretMaterial", + "pointer": "/components/schemas/CustomSecretMaterial", + "schema": { + "additionalProperties": false, + "description": "CustomSecretMaterial is an opaque secret value plus its injection routing.", + "properties": { + "injection": { + "$ref": "#/components/schemas/CustomInjection", + "description": "injection is the caller-authored routing." + }, + "value": { + "description": "value is the secret value.", + "minLength": 1, + "type": "string", + "writeOnly": true + } + }, + "required": [ + "value", + "injection" + ], + "title": "CustomSecretMaterial", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/CustomSecretMaterial/" + }, + { + "name": "DebugInfo", + "pointer": "/components/schemas/DebugInfo", + "schema": { + "description": "Describes additional debugging info.", + "properties": { + "detail": { + "description": "Additional debugging information provided by the server.", + "type": "string" + }, + "stackEntries": { + "description": "The stack trace entries indicating where the error occurred.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "title": "DebugInfo", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/DebugInfo/" + }, + { + "name": "DebugInfoErrorDetail", + "pointer": "/components/schemas/DebugInfoErrorDetail", + "schema": { + "description": "Describes additional debugging info.", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.DebugInfo", + "type": "string" + }, + "detail": { + "description": "Additional debugging information provided by the server.", + "type": "string" + }, + "stackEntries": { + "description": "The stack trace entries indicating where the error occurred.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "@type" + ], + "title": "DebugInfoErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/DebugInfoErrorDetail/" + }, + { + "name": "DeleteSecretResponse", + "pointer": "/components/schemas/DeleteSecretResponse", + "schema": { + "description": "DeleteSecretResponse acknowledges deletion and optional consumer fencing.", + "properties": { + "credentialFence": { + "$ref": "#/components/schemas/CredentialFenceReceipt", + "description": "credential_fence remains the original historical receipt after deletion or name reuse." + } + }, + "title": "DeleteSecretResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/DeleteSecretResponse/" + }, + { + "name": "Duration", + "pointer": "/components/schemas/Duration", + "schema": { + "description": "Seconds with a trailing s, for example 30s or 1.5s.", + "examples": [ + "30s", + "1.5s" + ], + "pattern": "^-?\\d+(\\.\\d{1,9})?s$", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/Duration/" + }, + { + "name": "EffectiveCoreLifecycle", + "pointer": "/components/schemas/EffectiveCoreLifecycle", + "schema": { + "description": "EffectiveCoreLifecycle is persisted at admission and cannot silently degrade.", + "properties": { + "canCaptureMemory": { + "description": "can_capture_memory is this sandbox's ALL snapshot support, independently set.", + "type": "boolean" + }, + "stopMemoryOutcome": { + "$ref": "#/components/schemas/StopMemoryOutcome", + "description": "stop_memory_outcome is the selected stop/start guarantee for this sandbox.", + "not": { + "enum": [ + "unspecified" + ] + } + } + }, + "required": [ + "stopMemoryOutcome" + ], + "title": "EffectiveCoreLifecycle", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EffectiveCoreLifecycle/" + }, + { + "name": "EffectiveFeatures", + "pointer": "/components/schemas/EffectiveFeatures", + "schema": { + "description": "EffectiveFeatures is emitted only through the composition representation.", + "properties": { + "lifecycle": { + "$ref": "#/components/schemas/EffectiveCoreLifecycle", + "description": "lifecycle is required even when no optional feature is selected." + }, + "managedVolumes": { + "$ref": "#/components/schemas/EffectiveManagedVolumes", + "description": "managed_volumes records stable volume identities and concrete attachment modes." + }, + "outputRetention": { + "$ref": "#/components/schemas/OutputRetention", + "description": "output_retention is the persisted per-process reconnect guarantee." + }, + "timeouts": { + "$ref": "#/components/schemas/EffectiveTimeouts", + "description": "timeouts records frozen defaults and the currently armed deadline, if any." + } + }, + "required": [ + "lifecycle", + "outputRetention" + ], + "title": "EffectiveFeatures", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EffectiveFeatures/" + }, + { + "name": "EffectiveManagedVolumes", + "pointer": "/components/schemas/EffectiveManagedVolumes", + "schema": { + "description": "EffectiveManagedVolumes records storage that is not deleted with the sandbox.", + "properties": { + "attachments": { + "description": "attachments retains admission order and stable volume identities.", + "items": { + "$ref": "#/components/schemas/EffectiveVolumeAttachment" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "attachments" + ], + "title": "EffectiveManagedVolumes", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EffectiveManagedVolumes/" + }, + { + "name": "EffectiveNetworkPolicy", + "pointer": "/components/schemas/EffectiveNetworkPolicy", + "schema": { + "description": "EffectiveNetworkPolicy is the policy after layering and fail-closed defaults.", + "properties": { + "allowNetworks": { + "description": "allow_networks are effective allowed rules with attribution.", + "items": { + "$ref": "#/components/schemas/AttributedRule" + }, + "type": "array" + }, + "denyNetworks": { + "description": "deny_networks are effective denied rules with attribution.", + "items": { + "$ref": "#/components/schemas/AttributedRule" + }, + "type": "array" + }, + "mode": { + "$ref": "#/components/schemas/NetworkPolicyMode", + "description": "mode is the effective mode and is always concrete in conforming responses.", + "not": { + "enum": [ + "unspecified" + ] + } + } + }, + "required": [ + "mode" + ], + "title": "EffectiveNetworkPolicy", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EffectiveNetworkPolicy/" + }, + { + "name": "EffectiveTimeouts", + "pointer": "/components/schemas/EffectiveTimeouts", + "schema": { + "description": "EffectiveTimeouts retains the selected behavior and current action deadline.\nDELETE and STOP retain a resume timeout; RESTART (and its deprecated alias KEEP) does not use one", + "properties": { + "autoResume": { + "description": "auto_resume is explicit; endpoint authorization still precedes any wake-up.", + "type": "boolean" + }, + "expiresAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "expires_at is present only while a deadline is armed, not before first readiness or while stopped." + }, + "initialTimeout": { + "$ref": "#/components/schemas/Duration", + "description": "Records the accepted initial TTL, not the recurring interval for RESTART or KEEP." + }, + "onTimeout": { + "$ref": "#/components/schemas/TimeoutAction", + "description": "on_timeout remains the accepted disposition through renewal and restart.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "resumeTimeout": { + "$ref": "#/components/schemas/Duration", + "description": "Freezes the action's default for later starts; RESTART and KEEP manage their own interval." + } + }, + "required": [ + "onTimeout", + "initialTimeout" + ], + "title": "EffectiveTimeouts", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EffectiveTimeouts/" + }, + { + "name": "EffectiveVolumeAttachment", + "pointer": "/components/schemas/EffectiveVolumeAttachment", + "schema": { + "description": "EffectiveVolumeAttachment retains the identity, not a reusable name lookup.", + "properties": { + "mode": { + "$ref": "#/components/schemas/AttachmentMode", + "description": "mode is explicit and survives sandbox stop/start and backend restart.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "target": { + "description": "target is the accepted normalized absolute guest path.", + "minLength": 1, + "type": "string" + }, + "volume": { + "description": "volume is the resource name recorded for this reference.", + "type": "string" + }, + "volumeUid": { + "description": "volume_uid retains the observed backing incarnation when the backend provides one.", + "readOnly": true, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "target", + "mode" + ], + "title": "EffectiveVolumeAttachment", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EffectiveVolumeAttachment/" + }, + { + "name": "EndpointAuthentication", + "pointer": "/components/schemas/EndpointAuthentication", + "schema": { + "dependentSchemas": { + "credentialTransports": { + "allOf": [ + { + "if": { + "properties": { + "scheme": { + "const": "localSocket" + } + } + }, + "then": { + "properties": { + "credentialTransports": { + "maxItems": 0 + } + } + } + } + ] + }, + "scheme": { + "allOf": [ + { + "oneOf": [ + { + "properties": { + "defaultTtl": { + "pattern": "^300([.]0{1,9})?s$" + }, + "maxTtl": { + "pattern": "^300([.]0{1,9})?s$" + }, + "scheme": { + "const": "scopedBearer" + } + }, + "required": [ + "defaultTtl", + "maxTtl" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "defaultTtl" + ] + }, + { + "required": [ + "maxTtl" + ] + } + ] + }, + "properties": { + "scheme": { + "const": "localSocket" + } + } + } + ] + } + ] + } + }, + "description": "EndpointAuthentication describes credential issuance without publishing a token.\nlocal sockets cannot advertise bearer credential transports\nscoped bearer discovery states the five-minute credential lifetime; local sockets carry no token lifetime", + "properties": { + "credentialTransports": { + "description": "Omission retains Authorization-header clients; browsers require an explicit subprotocol offer.", + "items": { + "$ref": "#/components/schemas/EndpointCredentialTransport" + }, + "type": "array", + "uniqueItems": true + }, + "defaultTtl": { + "$ref": "#/components/schemas/Duration", + "description": "default_ttl and max_ttl describe CreateEndpointCredential's provider policy." + }, + "maxTtl": { + "$ref": "#/components/schemas/Duration" + }, + "scheme": { + "$ref": "#/components/schemas/EndpointAuthenticationScheme", + "not": { + "enum": [ + "unspecified" + ] + } + } + }, + "required": [ + "scheme" + ], + "title": "EndpointAuthentication", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EndpointAuthentication/" + }, + { + "name": "EndpointAuthenticationScheme", + "pointer": "/components/schemas/EndpointAuthenticationScheme", + "schema": { + "description": "Values:\nunspecified\nscopedBearer\nlocalSocket", + "enum": [ + "unspecified", + "scopedBearer", + "localSocket" + ], + "title": "EndpointAuthenticationScheme", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/EndpointAuthenticationScheme/" + }, + { + "name": "EndpointCredential", + "pointer": "/components/schemas/EndpointCredential", + "schema": { + "description": "EndpointCredential is returned once with Cache-Control: no-store; never log its token.", + "properties": { + "audience": { + "minLength": 1, + "type": "string" + }, + "expireTime": { + "$ref": "#/components/schemas/Timestamp" + }, + "permissions": { + "description": "Allowed values: sandboxesExec, sandboxesFilesRead, sandboxesFilesWrite.", + "items": { + "$ref": "#/components/schemas/Permission", + "enum": [ + "sandboxesExec", + "sandboxesFilesRead", + "sandboxesFilesWrite" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "sandbox": { + "pattern": "^sandboxes/[^/]+$", + "type": "string" + }, + "token": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "token", + "expireTime", + "permissions", + "sandbox", + "audience" + ], + "title": "EndpointCredential", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EndpointCredential/" + }, + { + "name": "EndpointCredentialTransport", + "pointer": "/components/schemas/EndpointCredentialTransport", + "schema": { + "description": "Values:\nunspecified\nauthorizationHeader\nwebSocketSubprotocol", + "enum": [ + "unspecified", + "authorizationHeader", + "webSocketSubprotocol" + ], + "title": "EndpointCredentialTransport", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/EndpointCredentialTransport/" + }, + { + "name": "Error", + "pointer": "/components/schemas/Error", + "schema": { + "description": "An HTTP refusal, resource failure, or terminal stream error. Clients preserve unknown codes and structured details.", + "examples": [ + { + "code": "notFound", + "details": [], + "message": "sandbox not found" + } + ], + "properties": { + "code": { + "anyOf": [ + { + "$ref": "#/components/schemas/ErrorCode" + }, + { + "type": "string" + } + ] + }, + "details": { + "items": { + "$ref": "#/components/schemas/ErrorDetail" + }, + "type": "array" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code" + ], + "title": "Error", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Error/" + }, + { + "name": "ErrorCode", + "pointer": "/components/schemas/ErrorCode", + "schema": { + "description": "Known public failure categories. Error.code also accepts future strings.", + "enum": [ + "canceled", + "unknown", + "invalidArgument", + "deadlineExceeded", + "notFound", + "alreadyExists", + "permissionDenied", + "resourceExhausted", + "failedPrecondition", + "aborted", + "outOfRange", + "unimplemented", + "internal", + "unavailable", + "dataLoss", + "unauthenticated" + ], + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ErrorCode/" + }, + { + "name": "ErrorDetail", + "pointer": "/components/schemas/ErrorDetail", + "schema": { + "discriminator": { + "mapping": { + "type.googleapis.com/buf.validate.Violations": "#/components/schemas/ValidationViolationsErrorDetail", + "type.googleapis.com/docker.sandboxes.v1.EtagMismatch": "#/components/schemas/EtagMismatchErrorDetail", + "type.googleapis.com/docker.sandboxes.v1.KitFieldOutcomeReport": "#/components/schemas/KitFieldOutcomeReportErrorDetail", + "type.googleapis.com/docker.sandboxes.v1.McpConfigurationReport": "#/components/schemas/McpConfigurationReportErrorDetail", + "type.googleapis.com/google.rpc.BadRequest": "#/components/schemas/BadRequestErrorDetail", + "type.googleapis.com/google.rpc.DebugInfo": "#/components/schemas/DebugInfoErrorDetail", + "type.googleapis.com/google.rpc.ErrorInfo": "#/components/schemas/ErrorInfoErrorDetail", + "type.googleapis.com/google.rpc.Help": "#/components/schemas/HelpErrorDetail", + "type.googleapis.com/google.rpc.LocalizedMessage": "#/components/schemas/LocalizedMessageErrorDetail", + "type.googleapis.com/google.rpc.PreconditionFailure": "#/components/schemas/PreconditionFailureErrorDetail", + "type.googleapis.com/google.rpc.QuotaFailure": "#/components/schemas/QuotaFailureErrorDetail", + "type.googleapis.com/google.rpc.RequestInfo": "#/components/schemas/RequestInfoErrorDetail", + "type.googleapis.com/google.rpc.ResourceInfo": "#/components/schemas/ResourceInfoErrorDetail", + "type.googleapis.com/google.rpc.RetryInfo": "#/components/schemas/RetryInfoErrorDetail" + }, + "propertyName": "@type" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/BadRequestErrorDetail" + }, + { + "$ref": "#/components/schemas/DebugInfoErrorDetail" + }, + { + "$ref": "#/components/schemas/ErrorInfoErrorDetail" + }, + { + "$ref": "#/components/schemas/HelpErrorDetail" + }, + { + "$ref": "#/components/schemas/LocalizedMessageErrorDetail" + }, + { + "$ref": "#/components/schemas/PreconditionFailureErrorDetail" + }, + { + "$ref": "#/components/schemas/QuotaFailureErrorDetail" + }, + { + "$ref": "#/components/schemas/RequestInfoErrorDetail" + }, + { + "$ref": "#/components/schemas/ResourceInfoErrorDetail" + }, + { + "$ref": "#/components/schemas/RetryInfoErrorDetail" + }, + { + "$ref": "#/components/schemas/ValidationViolationsErrorDetail" + }, + { + "$ref": "#/components/schemas/EtagMismatchErrorDetail" + }, + { + "$ref": "#/components/schemas/KitFieldOutcomeReportErrorDetail" + }, + { + "$ref": "#/components/schemas/McpConfigurationReportErrorDetail" + }, + { + "$ref": "#/components/schemas/UnknownErrorDetail" + } + ] + }, + "url": "/reference/api/sandboxes/latest/schemas/ErrorDetail/" + }, + { + "name": "ErrorInfo", + "pointer": "/components/schemas/ErrorInfo", + "schema": { + "description": "Describes the cause of the error with structured details.\n\nExample of an error when contacting the \"pubsub.googleapis.com\" API when it\nis not enabled:\n\n{ \"reason\": \"API_DISABLED\"\n\"domain\": \"googleapis.com\"\n\"metadata\": {\n\"resource\": \"projects/123\",\n\"service\": \"pubsub.googleapis.com\"\n}\n}\n\nThis response indicates that the pubsub.googleapis.com API is not enabled.\n\nExample of an error that is returned when attempting to create a Spanner\ninstance in a region that is out of stock:\n\n{ \"reason\": \"STOCKOUT\"\n\"domain\": \"spanner.googleapis.com\",\n\"metadata\": {\n\"availableRegions\": \"us-central1,us-east2\"\n}\n}", + "properties": { + "domain": { + "description": "The logical grouping to which the \"reason\" belongs. The error domain\nis typically the registered service name of the tool or product that\ngenerates the error. Example: \"pubsub.googleapis.com\". If the error is\ngenerated by some common infrastructure, the error domain must be a\nglobally unique value that identifies the infrastructure. For Google API\ninfrastructure, the error domain is \"googleapis.com\".", + "type": "string" + }, + "metadata": { + "additionalProperties": { + "title": "value", + "type": "string" + }, + "description": "Additional structured details about this error.\n\nKeys must match a regular expression of `[a-z][a-zA-Z0-9-_]+` but should\nideally be lowerCamelCase. Also, they must be limited to 64 characters in\nlength. When identifying the current value of an exceeded limit, the units\nshould be contained in the key, not the value. For example, rather than\n`{\"instanceLimit\": \"100/request\"}`, should be returned as,\n`{\"instanceLimitPerRequest\": \"100\"}`, if the client exceeds the number of\ninstances that can be created in a single (batch) request.", + "type": "object" + }, + "reason": { + "description": "The reason of the error. This is a constant value that identifies the\nproximate cause of the error. Error reasons are unique within a particular\ndomain of errors. This should be at most 63 characters and match a\nregular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents\nUPPER_SNAKE_CASE.", + "type": "string" + } + }, + "title": "ErrorInfo", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ErrorInfo/" + }, + { + "name": "ErrorInfoErrorDetail", + "pointer": "/components/schemas/ErrorInfoErrorDetail", + "schema": { + "description": "Describes the cause of the error with structured details.\n\nExample of an error when contacting the \"pubsub.googleapis.com\" API when it\nis not enabled:\n\n{ \"reason\": \"API_DISABLED\"\n\"domain\": \"googleapis.com\"\n\"metadata\": {\n\"resource\": \"projects/123\",\n\"service\": \"pubsub.googleapis.com\"\n}\n}\n\nThis response indicates that the pubsub.googleapis.com API is not enabled.\n\nExample of an error that is returned when attempting to create a Spanner\ninstance in a region that is out of stock:\n\n{ \"reason\": \"STOCKOUT\"\n\"domain\": \"spanner.googleapis.com\",\n\"metadata\": {\n\"availableRegions\": \"us-central1,us-east2\"\n}\n}", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.ErrorInfo", + "type": "string" + }, + "domain": { + "description": "The logical grouping to which the \"reason\" belongs. The error domain\nis typically the registered service name of the tool or product that\ngenerates the error. Example: \"pubsub.googleapis.com\". If the error is\ngenerated by some common infrastructure, the error domain must be a\nglobally unique value that identifies the infrastructure. For Google API\ninfrastructure, the error domain is \"googleapis.com\".", + "type": "string" + }, + "metadata": { + "additionalProperties": { + "title": "value", + "type": "string" + }, + "description": "Additional structured details about this error.\n\nKeys must match a regular expression of `[a-z][a-zA-Z0-9-_]+` but should\nideally be lowerCamelCase. Also, they must be limited to 64 characters in\nlength. When identifying the current value of an exceeded limit, the units\nshould be contained in the key, not the value. For example, rather than\n`{\"instanceLimit\": \"100/request\"}`, should be returned as,\n`{\"instanceLimitPerRequest\": \"100\"}`, if the client exceeds the number of\ninstances that can be created in a single (batch) request.", + "type": "object" + }, + "reason": { + "description": "The reason of the error. This is a constant value that identifies the\nproximate cause of the error. Error reasons are unique within a particular\ndomain of errors. This should be at most 63 characters and match a\nregular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents\nUPPER_SNAKE_CASE.", + "type": "string" + } + }, + "required": [ + "@type" + ], + "title": "ErrorInfoErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ErrorInfoErrorDetail/" + }, + { + "name": "EtagMismatch", + "pointer": "/components/schemas/EtagMismatch", + "schema": { + "description": "EtagMismatch is the status detail a stale precondition carries, so a client learns the\ncurrent version for an explicit conflict-resolution decision.", + "properties": { + "currentEtag": { + "description": "current_etag is informational; clients must not silently retry with it.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "currentEtag" + ], + "title": "EtagMismatch", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EtagMismatch/" + }, + { + "name": "EtagMismatchErrorDetail", + "pointer": "/components/schemas/EtagMismatchErrorDetail", + "schema": { + "description": "EtagMismatch is the status detail a stale precondition carries, so a client learns the\ncurrent version for an explicit conflict-resolution decision.", + "properties": { + "@type": { + "const": "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "type": "string" + }, + "currentEtag": { + "description": "current_etag is informational; clients must not silently retry with it.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "currentEtag", + "@type" + ], + "title": "EtagMismatchErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/EtagMismatchErrorDetail/" + }, + { + "name": "ExactDestination", + "pointer": "/components/schemas/ExactDestination", + "schema": { + "description": "ExactDestination uses destination.v1 canonical selector values, never legacy glob syntax.", + "properties": { + "kind": { + "$ref": "#/components/schemas/ExactDestinationKind", + "description": "kind selects a destination.v1 matching rule.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "port": { + "description": "An absent port matches all numeric ports; zero is invalid when present.", + "maximum": 65535, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "value": { + "description": "value is canonical for its kind and contains no legacy selector syntax.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "ExactDestination", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExactDestination/" + }, + { + "name": "ExactDestinationKind", + "pointer": "/components/schemas/ExactDestinationKind", + "schema": { + "description": "ExactDestinationKind keeps DNS and IP-literal decisions distinct.\n\nValues:\nunspecified\ndns\ndnsLabel\ndnsSubtree\nip\ncidr", + "enum": [ + "unspecified", + "dns", + "dnsLabel", + "dnsSubtree", + "ip", + "cidr" + ], + "title": "ExactDestinationKind", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExactDestinationKind/" + }, + { + "name": "ExactNetworkPolicy", + "pointer": "/components/schemas/ExactNetworkPolicy", + "schema": { + "description": "ExactNetworkPolicy is a complete consumer-installed generation; its last node is the root.", + "properties": { + "nodes": { + "description": "nodes are complete and topologically ordered; the final node is the root.", + "items": { + "$ref": "#/components/schemas/ExactPolicyNode" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "revision": { + "description": "revision binds authority, configuration and resolved conditions to the installed generation.", + "minLength": 1, + "type": "string" + }, + "selectorVersion": { + "const": "destination.v1", + "description": "selector_version fixes matching semantics across implementations.", + "type": "string" + } + }, + "required": [ + "revision", + "selectorVersion", + "nodes" + ], + "title": "ExactNetworkPolicy", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExactNetworkPolicy/" + }, + { + "name": "ExactPolicyConstant", + "pointer": "/components/schemas/ExactPolicyConstant", + "schema": { + "description": "ExactPolicyConstant makes both Boolean identities explicit.\n\nValues:\nunspecified\ntrue\nfalse", + "enum": [ + "unspecified", + "true", + "false" + ], + "title": "ExactPolicyConstant", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExactPolicyConstant/" + }, + { + "name": "ExactPolicyNode", + "pointer": "/components/schemas/ExactPolicyNode", + "schema": { + "allOf": [ + { + "properties": { + "source": { + "$ref": "#/components/schemas/ExactPolicySource", + "description": "source is required on constants and destinations and absent on Boolean operators." + } + } + }, + { + "oneOf": [ + { + "properties": { + "all": { + "$ref": "#/components/schemas/ExactPolicyOperands", + "description": "all intersects every operand." + } + }, + "required": [ + "all" + ], + "title": "all", + "type": "object" + }, + { + "properties": { + "any": { + "$ref": "#/components/schemas/ExactPolicyOperands", + "description": "any unions its operands without discarding enclosing ceilings." + } + }, + "required": [ + "any" + ], + "title": "any", + "type": "object" + }, + { + "properties": { + "constant": { + "$ref": "#/components/schemas/ExactPolicyConstant", + "description": "constant explicitly allows or denies independently of the destination.", + "not": { + "enum": [ + "unspecified" + ] + } + } + }, + "required": [ + "constant" + ], + "title": "constant", + "type": "object" + }, + { + "properties": { + "destination": { + "$ref": "#/components/schemas/ExactDestination", + "description": "destination matches only its declared DNS or IP kind." + } + }, + "required": [ + "destination" + ], + "title": "destination", + "type": "object" + }, + { + "properties": { + "not": { + "description": "not negates one earlier node.", + "type": "integer" + } + }, + "required": [ + "not" + ], + "title": "not", + "type": "object" + } + ] + } + ], + "description": "ExactPolicyNode is topologically ordered; references must precede this node.", + "title": "ExactPolicyNode", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExactPolicyNode/" + }, + { + "name": "ExactPolicyOperands", + "pointer": "/components/schemas/ExactPolicyOperands", + "schema": { + "description": "ExactPolicyOperands contains earlier node indexes; empty Boolean groups are invalid.", + "properties": { + "nodes": { + "description": "nodes must all precede the enclosing operator.", + "items": { + "type": "integer" + }, + "maxItems": 64, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "nodes" + ], + "title": "ExactPolicyOperands", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExactPolicyOperands/" + }, + { + "name": "ExactPolicyOrigin", + "pointer": "/components/schemas/ExactPolicyOrigin", + "schema": { + "description": "ExactPolicyOrigin separates governance from attached and runtime-owned permissions.\n\nValues:\nunspecified\norganization\nowner\nattached\nkit\ngateway\ndefault", + "enum": [ + "unspecified", + "organization", + "owner", + "attached", + "kit", + "gateway", + "default" + ], + "title": "ExactPolicyOrigin", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExactPolicyOrigin/" + }, + { + "name": "ExactPolicySource", + "pointer": "/components/schemas/ExactPolicySource", + "schema": { + "description": "ExactPolicySource identifies the nonsecret authority of a leaf expression.", + "properties": { + "id": { + "description": "id identifies that source without exposing credentials or policy content.", + "minLength": 1, + "type": "string" + }, + "origin": { + "$ref": "#/components/schemas/ExactPolicyOrigin", + "description": "origin distinguishes the authority that supplied this leaf.", + "not": { + "enum": [ + "unspecified" + ] + } + } + }, + "required": [ + "origin", + "id" + ], + "title": "ExactPolicySource", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExactPolicySource/" + }, + { + "name": "ExchangeCompositionCredentialResponse", + "pointer": "/components/schemas/ExchangeCompositionCredentialResponse", + "schema": { + "title": "ExchangeCompositionCredentialResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExchangeCompositionCredentialResponse/" + }, + { + "name": "ExecRequest", + "pointer": "/components/schemas/ExecRequest", + "schema": { + "additionalProperties": false, + "description": "ExecRequest runs a command to completion.", + "properties": { + "cmd": { + "description": "cmd is the argv vector.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "env": { + "additionalProperties": { + "title": "value", + "type": "string" + }, + "description": "env adds environment variables.", + "type": "object" + }, + "user": { + "description": "user is the user to run as.", + "type": "string" + }, + "workingDir": { + "description": "working_dir is the process working directory.", + "type": "string" + } + }, + "required": [ + "cmd" + ], + "title": "ExecRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExecRequest/" + }, + { + "name": "ExecResponse", + "pointer": "/components/schemas/ExecResponse", + "schema": { + "description": "ExecResponse returns process output after the command exits.", + "properties": { + "exitCode": { + "description": "exit_code is the process exit code.", + "format": "int32", + "type": "integer" + }, + "incomplete": { + "description": "incomplete is true when the combined capture limit forced stdout and/or\nstderr to discard some of the command's real output; false whenever\nevery byte the command produced was retained, even if that total lands\nexactly at the limit. exit_code is still the real, final exit code: the\ncommand ran to completion, only its captured output was capped. A retry\nwould rerun the command, so this stays a normal successful response\nrather than an error a client might retry.", + "type": "boolean" + }, + "stderr": { + "description": "stderr is captured stderr, up to the capture limit when incomplete.", + "format": "byte", + "type": "string" + }, + "stdout": { + "description": "stdout is captured stdout, up to the capture limit when incomplete.", + "format": "byte", + "type": "string" + } + }, + "title": "ExecResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ExecResponse/" + }, + { + "name": "FeatureOptions", + "pointer": "/components/schemas/FeatureOptions", + "schema": { + "additionalProperties": false, + "description": "FeatureOptions carries typed admission intent; unknown fields are refused.", + "properties": { + "managedVolumes": { + "$ref": "#/components/schemas/ManagedVolumeOptions", + "description": "managed_volumes selects persistent resources and guest targets." + }, + "storedSecrets": { + "$ref": "#/components/schemas/StoredSecretOptions", + "description": "stored_secrets selects authorized stored references, never raw material." + }, + "timeouts": { + "$ref": "#/components/schemas/TimeoutOptions", + "description": "timeouts enables an explicit deadline; omission enables none." + } + }, + "title": "FeatureOptions", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FeatureOptions/" + }, + { + "name": "FileError", + "pointer": "/components/schemas/FileError", + "schema": { + "description": "FileError reports a path-level file error.", + "properties": { + "failure": { + "$ref": "#/components/schemas/Error", + "description": "failure retains the shared typed code and details for this path." + }, + "path": { + "description": "path is the path that failed.", + "type": "string" + } + }, + "required": [ + "failure" + ], + "title": "FileError", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FileError/" + }, + { + "name": "FileHeader", + "pointer": "/components/schemas/FileHeader", + "schema": { + "additionalProperties": false, + "description": "FileHeader starts a file in an upload or download stream.", + "properties": { + "mode": { + "description": "mode carries Unix permission bits. Upload applies mode \u0026 0777, or 0644 when\nthat value is zero, without subtracting umask; Download reports stored bits.", + "type": "integer" + }, + "path": { + "description": "path is the sandbox path.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "title": "FileHeader", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FileHeader/" + }, + { + "name": "FileInfo", + "pointer": "/components/schemas/FileInfo", + "schema": { + "description": "FileInfo is file metadata.", + "properties": { + "isDir": { + "description": "is_dir reports whether the path is a directory and stays populated on\nevery backend and every caller. type is the richer authority, and\ntype == directory iff is_dir.", + "type": "boolean" + }, + "linkTarget": { + "description": "link_target is the literal readlink() text when type is symlink,\nsince that is the only case where nothing else lets the caller learn what\nthe link names; empty otherwise.", + "type": "string" + }, + "mode": { + "description": "mode is the stored Unix permission bits (0777), without type or special bits.", + "type": "integer" + }, + "path": { + "description": "path is the sandbox path.", + "type": "string" + }, + "size": { + "description": "size is the file size in bytes.", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "type": { + "$ref": "#/components/schemas/FileType", + "description": "type classifies the object, and Stat and List populate it for every\ncaller. Stat and List resolve an in-jail symlink and report\nthe resolved target's type; a link that cannot be resolved in-jail\n(dangling, looping, or escaping) reports symlink for itself\nrather than disclosing an out-of-jail target." + } + }, + "title": "FileInfo", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FileInfo/" + }, + { + "name": "FileType", + "pointer": "/components/schemas/FileType", + "schema": { + "description": "FileType classifies the object at a path.\n\nValues:\nunspecified: unspecified means the backend has not classified the object. Stat and List always classify it.\nregular: regular is a regular file.\ndirectory: directory is a directory.\nsymlink: symlink is a symbolic link that could not be resolved to a target inside the jail.\nother: other is a socket, FIFO, device, or other non-regular, non-directory, non-symlink object.", + "enum": [ + "unspecified", + "regular", + "directory", + "symlink", + "other" + ], + "title": "FileType", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/FileType/" + }, + { + "name": "FilesDownloadRequest", + "pointer": "/components/schemas/FilesDownloadRequest", + "schema": { + "additionalProperties": false, + "description": "DownloadRequest asks for one or more paths.", + "properties": { + "paths": { + "description": "paths naming stable regular files or absent entries at canonical absolute paths\nyield contiguous results in request order, including duplicates.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "paths" + ], + "title": "DownloadRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesDownloadRequest/" + }, + { + "name": "FilesDownloadResponse", + "pointer": "/components/schemas/FilesDownloadResponse", + "schema": { + "dependentSchemas": { + "data": { + "not": { + "anyOf": [ + { + "required": [ + "error" + ] + }, + { + "required": [ + "header" + ] + } + ] + } + }, + "error": { + "not": { + "anyOf": [ + { + "required": [ + "data" + ] + }, + { + "required": [ + "header" + ] + } + ] + } + }, + "header": { + "not": { + "anyOf": [ + { + "required": [ + "data" + ] + }, + { + "required": [ + "error" + ] + } + ] + } + } + }, + "description": "DownloadResponse is one frame in a download stream. At most one of data, error, header is set.", + "properties": { + "data": { + "description": "data carries bytes for the current file.", + "format": "byte", + "type": "string" + }, + "error": { + "$ref": "#/components/schemas/FileError", + "description": "error reports a path-level failure without aborting the whole stream." + }, + "header": { + "$ref": "#/components/schemas/FileHeader", + "description": "header starts a downloaded file." + } + }, + "title": "DownloadResponse", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesDownloadResponse/" + }, + { + "name": "FilesListResponse", + "pointer": "/components/schemas/FilesListResponse", + "schema": { + "description": "ListResponse returns directory entries and a next-page token.", + "properties": { + "entries": { + "description": "entries is the current page.", + "items": { + "$ref": "#/components/schemas/FileInfo" + }, + "type": "array" + }, + "nextPageToken": { + "description": "next_page_token is empty when there are no more pages.", + "type": "string" + } + }, + "title": "ListResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesListResponse/" + }, + { + "name": "FilesMkdirRequest", + "pointer": "/components/schemas/FilesMkdirRequest", + "schema": { + "additionalProperties": false, + "description": "MkdirRequest creates a directory.", + "properties": { + "mode": { + "description": "mode supplies the new leaf's Unix permission bits: mode \u0026 0777, or 0755\nwhen that value is zero, without subtracting umask.", + "type": "integer" + }, + "parents": { + "description": "parents creates missing parents when true.", + "type": "boolean" + }, + "path": { + "description": "path is the directory path.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "title": "MkdirRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesMkdirRequest/" + }, + { + "name": "FilesMkdirResponse", + "pointer": "/components/schemas/FilesMkdirResponse", + "schema": { + "description": "MkdirResponse has no fields.", + "title": "MkdirResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesMkdirResponse/" + }, + { + "name": "FilesMoveRequest", + "pointer": "/components/schemas/FilesMoveRequest", + "schema": { + "additionalProperties": false, + "description": "MoveRequest moves or renames a path.", + "properties": { + "from": { + "description": "from is the source path.", + "minLength": 1, + "type": "string" + }, + "to": { + "description": "to is the exact destination path.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "title": "MoveRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesMoveRequest/" + }, + { + "name": "FilesMoveResponse", + "pointer": "/components/schemas/FilesMoveResponse", + "schema": { + "description": "MoveResponse has no fields.", + "title": "MoveResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesMoveResponse/" + }, + { + "name": "FilesReadFileRequest", + "pointer": "/components/schemas/FilesReadFileRequest", + "schema": { + "additionalProperties": false, + "description": "ReadFileRequest names one regular file.", + "properties": { + "path": { + "description": "path is the sandbox path of a regular file.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "title": "ReadFileRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesReadFileRequest/" + }, + { + "name": "FilesReadFileResponse", + "pointer": "/components/schemas/FilesReadFileResponse", + "schema": { + "additionalProperties": false, + "description": "ReadFileResponse carries the whole file; HTTP selects data as its raw response body.", + "properties": { + "data": { + "description": "data is the complete content; a file above the message cap is refused.", + "format": "byte", + "type": "string" + }, + "info": { + "$ref": "#/components/schemas/FileInfo", + "description": "info remains available to the internal adapter; HTTP clients use Stat for metadata." + } + }, + "required": [ + "info" + ], + "title": "ReadFileResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesReadFileResponse/" + }, + { + "name": "FilesRemoveResponse", + "pointer": "/components/schemas/FilesRemoveResponse", + "schema": { + "description": "RemoveResponse reports partial recursive progress to every caller: check failed_path,\nnot the operation status, when Remove stops partway. Effects are never rolled back.", + "properties": { + "completedCount": { + "description": "completed_count is the total number of paths removed, which may exceed\nlen(completed_paths).", + "type": "integer" + }, + "completedPaths": { + "description": "completed_paths lists removed paths in traversal order, bounded to the\nfirst 1000; completed_count carries the\ntrue total when it exceeds that bound.", + "items": { + "type": "string" + }, + "type": "array" + }, + "failedPath": { + "description": "failed_path is the path where a recursive removal stopped; empty on full\nsuccess. Every path in completed_paths was removed before this one.", + "type": "string" + } + }, + "title": "RemoveResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesRemoveResponse/" + }, + { + "name": "FilesStatResponse", + "pointer": "/components/schemas/FilesStatResponse", + "schema": { + "description": "StatResponse returns file metadata.", + "properties": { + "info": { + "$ref": "#/components/schemas/FileInfo", + "description": "info is metadata for the path." + } + }, + "title": "StatResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesStatResponse/" + }, + { + "name": "FilesUploadRequest", + "pointer": "/components/schemas/FilesUploadRequest", + "schema": { + "description": "UploadRequest is one frame in an upload stream.", + "oneOf": [ + { + "properties": { + "data": { + "description": "data appends bytes to the current file.", + "format": "byte", + "type": "string" + } + }, + "required": [ + "data" + ], + "title": "data", + "type": "object" + }, + { + "properties": { + "header": { + "$ref": "#/components/schemas/FileHeader", + "description": "header starts a new file. The first frame, and the first frame after each\ncompleted file, must be this arm." + } + }, + "required": [ + "header" + ], + "title": "header", + "type": "object" + } + ], + "title": "UploadRequest", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesUploadRequest/" + }, + { + "name": "FilesUploadResponse", + "pointer": "/components/schemas/FilesUploadResponse", + "schema": { + "description": "UploadResponse reports completed file writes.", + "properties": { + "filesWritten": { + "description": "files_written is the number of files successfully written.", + "type": "integer" + } + }, + "title": "UploadResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesUploadResponse/" + }, + { + "name": "FilesWriteFileRequest", + "pointer": "/components/schemas/FilesWriteFileRequest", + "schema": { + "additionalProperties": false, + "description": "WriteFileRequest replaces one file.", + "properties": { + "data": { + "description": "data is the complete new content; empty writes an empty file.", + "format": "byte", + "type": "string" + }, + "header": { + "$ref": "#/components/schemas/FileHeader", + "description": "header names the path and mode, as an Upload header does." + } + }, + "required": [ + "header" + ], + "title": "WriteFileRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesWriteFileRequest/" + }, + { + "name": "FilesWriteFileResponse", + "pointer": "/components/schemas/FilesWriteFileResponse", + "schema": { + "description": "WriteFileResponse reports the written file.", + "properties": { + "info": { + "$ref": "#/components/schemas/FileInfo", + "description": "info is the file's metadata after the write." + } + }, + "required": [ + "info" + ], + "title": "WriteFileResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/FilesWriteFileResponse/" + }, + { + "name": "GetNetworkPoliciesResponse", + "pointer": "/components/schemas/GetNetworkPoliciesResponse", + "schema": { + "description": "GetNetworkPoliciesResponse binds both views to exact.revision; a partial read fails.", + "properties": { + "effective": { + "$ref": "#/components/schemas/EffectiveNetworkPolicy" + }, + "exact": { + "$ref": "#/components/schemas/ExactNetworkPolicy" + } + }, + "required": [ + "effective", + "exact" + ], + "title": "GetNetworkPoliciesResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/GetNetworkPoliciesResponse/" + }, + { + "name": "Help", + "pointer": "/components/schemas/Help", + "schema": { + "description": "Provides links to documentation or for performing an out of band action.\n\nFor example, if a quota check failed with an error indicating the calling\nproject hasn't enabled the accessed service, this can contain a URL pointing\ndirectly to the right place in the developer console to flip the bit.", + "properties": { + "links": { + "description": "URL(s) pointing to additional information on handling the current error.", + "items": { + "$ref": "#/components/schemas/HelpLink" + }, + "type": "array" + } + }, + "title": "Help", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Help/" + }, + { + "name": "HelpErrorDetail", + "pointer": "/components/schemas/HelpErrorDetail", + "schema": { + "description": "Provides links to documentation or for performing an out of band action.\n\nFor example, if a quota check failed with an error indicating the calling\nproject hasn't enabled the accessed service, this can contain a URL pointing\ndirectly to the right place in the developer console to flip the bit.", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.Help", + "type": "string" + }, + "links": { + "description": "URL(s) pointing to additional information on handling the current error.", + "items": { + "$ref": "#/components/schemas/HelpLink" + }, + "type": "array" + } + }, + "required": [ + "@type" + ], + "title": "HelpErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/HelpErrorDetail/" + }, + { + "name": "HelpLink", + "pointer": "/components/schemas/HelpLink", + "schema": { + "description": "Describes a URL link.", + "properties": { + "description": { + "description": "Describes what the link offers.", + "type": "string" + }, + "url": { + "description": "The URL of the link.", + "type": "string" + } + }, + "title": "Link", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/HelpLink/" + }, + { + "name": "IdentityExchangeServiceExchangeDockerCredentialRequest", + "pointer": "/components/schemas/IdentityExchangeServiceExchangeDockerCredentialRequest", + "schema": { + "additionalProperties": false, + "properties": { + "idToken": { + "description": "id_token is single-use identity material, never an owner selector.", + "minLength": 1, + "type": "string", + "writeOnly": true + } + }, + "required": [ + "idToken" + ], + "title": "IdentityExchangeServiceExchangeDockerCredentialRequest", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/IdentityExchangeServiceExchangeDockerCredentialRequest/" + }, + { + "name": "Image", + "pointer": "/components/schemas/Image", + "schema": { + "description": "Image is the detailed managed image view.\nuid must equal the immutable resource ID in name", + "properties": { + "captureMode": { + "$ref": "#/components/schemas/CaptureMode", + "description": "capture_mode records whether captured content includes memory." + }, + "createdAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "created_at is the creation timestamp." + }, + "description": { + "description": "description is caller-supplied text.", + "type": "string" + }, + "displayName": { + "description": "display_name is a scoped label and never selects the resource.", + "type": "string" + }, + "etag": { + "description": "etag identifies the observed version of this resource. It is opaque and strong,\nchanges on every visible change, and is what a mutation sends as its precondition.", + "minLength": 1, + "pattern": "^\"[^\"\\x00-\\x20\\x7f]*\"$", + "readOnly": true, + "type": "string" + }, + "failure": { + "$ref": "#/components/schemas/Error", + "description": "failure is set when status is FAILED." + }, + "imageDigest": { + "description": "image_digest is the content digest when known.", + "type": "string" + }, + "imageRef": { + "description": "image_ref is the registry or backend image reference when available.", + "type": "string" + }, + "name": { + "description": "(IDENTIFIER) name ends in the immutable backing ID and never changes with display_name.", + "pattern": "^images/[^/]+$", + "type": "string" + }, + "platform": { + "$ref": "#/components/schemas/Platform", + "description": "platform is the image platform." + }, + "pushTarget": { + "$ref": "#/components/schemas/ImagePushTarget", + "description": "push_target appears only in from_image create responses awaiting upload, never reads.", + "readOnly": true + }, + "readyCmd": { + "description": "ready_cmd is the readiness command used by raw image sandboxes.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resources": { + "$ref": "#/components/schemas/Resources", + "description": "resources describes the image's preferred runtime resources." + }, + "source": { + "$ref": "#/components/schemas/ImageSource", + "description": "source records how the image was created." + }, + "startCmd": { + "description": "start_cmd is the command used by raw image sandboxes.", + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "$ref": "#/components/schemas/ImageStatus", + "description": "status is the image readiness state.", + "not": { + "enum": [ + "unspecified" + ] + }, + "readOnly": true + }, + "totalSizeBytes": { + "description": "total_size_bytes is the approximate stored image size.", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing backing ID, equal to the resource name's terminal segment.", + "minLength": 1, + "readOnly": true, + "type": [ + "string" + ] + }, + "updatedAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "updated_at is the last update timestamp." + } + }, + "required": [ + "uid", + "name", + "status", + "createdAt", + "updatedAt", + "etag" + ], + "title": "Image", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Image/" + }, + { + "name": "ImageBlobRef", + "pointer": "/components/schemas/ImageBlobRef", + "schema": { + "description": "ImageBlobRef describes one pullable blob.", + "properties": { + "digest": { + "description": "digest is the content digest.", + "type": "string" + }, + "mediaType": { + "description": "media_type is the OCI media type.", + "type": "string" + }, + "size": { + "description": "size is the blob size in bytes.", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "url": { + "description": "url is a short-lived pull URL.", + "type": "string" + } + }, + "title": "ImageBlobRef", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ImageBlobRef/" + }, + { + "name": "ImageFromImage", + "pointer": "/components/schemas/ImageFromImage", + "schema": { + "additionalProperties": false, + "description": "ImageFromImage registers a target for pushed OCI content.", + "properties": { + "captureMode": { + "description": "capture_mode must be unspecified or disk; pushed OCI content cannot include memory.", + "enum": [ + "unspecified", + "disk" + ], + "not": { + "enum": [ + "all" + ] + }, + "title": "ImageFromImageCaptureMode", + "type": "string" + }, + "kitStartup": { + "$ref": "#/components/schemas/KitStartup", + "description": "Startup commands copied from the source sandbox. Services with startup replay run these commands when a sandbox created from the image boots. Services without startup replay accept valid commands without running them." + }, + "platform": { + "$ref": "#/components/schemas/Platform", + "description": "platform is the platform for the pushed content." + }, + "platformHint": { + "$ref": "#/components/schemas/Platform", + "description": "platform_hint picks among a multi-platform push when platform is absent.\nA hint the backend cannot honor is ignored, never an error." + }, + "resources": { + "$ref": "#/components/schemas/Resources", + "description": "resources describes preferred runtime resources for the resulting image." + } + }, + "title": "ImageFromImage", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ImageFromImage/" + }, + { + "name": "ImagePullSpec", + "pointer": "/components/schemas/ImagePullSpec", + "schema": { + "description": "ImagePullSpec describes short-lived pull material for placement.", + "properties": { + "config": { + "$ref": "#/components/schemas/ImageBlobRef", + "description": "config is the image config blob." + }, + "expiresAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "expires_at is when the pull material expires." + }, + "layers": { + "description": "layers are the image layer blobs.", + "items": { + "$ref": "#/components/schemas/ImageBlobRef" + }, + "type": "array" + }, + "manifestDigest": { + "description": "manifest_digest is the manifest digest.", + "type": "string" + }, + "manifestMediaType": { + "description": "manifest_media_type is the manifest media type.", + "type": "string" + } + }, + "title": "ImagePullSpec", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ImagePullSpec/" + }, + { + "name": "ImagePushTarget", + "pointer": "/components/schemas/ImagePushTarget", + "schema": { + "description": "ImagePushTarget carries short-lived upload credentials.", + "properties": { + "accessToken": { + "description": "access_token is the short-lived push credential.", + "type": "string" + }, + "accessTokenExpiresAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "access_token_expires_at is the token expiry." + }, + "imageRef": { + "description": "image_ref is the registry reference to push.", + "type": "string" + } + }, + "title": "ImagePushTarget", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ImagePushTarget/" + }, + { + "name": "ImageSource", + "pointer": "/components/schemas/ImageSource", + "schema": { + "description": "ImageSource records how the image was created.\n\nValues:\nunspecified: unspecified means the source is unknown or not reported.\nimage: image means the image came from pushed or imported image bytes.\nsandbox: sandbox means the image came from a sandbox capture.", + "enum": [ + "unspecified", + "image", + "sandbox" + ], + "title": "ImageSource", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ImageSource/" + }, + { + "name": "ImageStatus", + "pointer": "/components/schemas/ImageStatus", + "schema": { + "description": "ImageStatus is the image readiness state.\n\nValues:\nunspecified: unspecified is never a concrete known state.\npending: pending means an asynchronous build has not started or reported progress.\nwaitingForPush: waitingForPush means the backend is waiting for OCI content upload.\npreparing: preparing means the backend is preparing pushed or captured content.\ncompleted: completed means the image is ready to use.\nfailed: failed means image preparation reached a terminal failure.\ndeleted: deleted means the backend exposes a retained delete tombstone.", + "enum": [ + "unspecified", + "pending", + "waitingForPush", + "preparing", + "completed", + "failed", + "deleted" + ], + "title": "ImageStatus", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ImageStatus/" + }, + { + "name": "ImageSummary", + "pointer": "/components/schemas/ImageSummary", + "schema": { + "description": "ImageSummary is the list view of an image.\nuid must equal the immutable resource ID in name", + "properties": { + "captureMode": { + "$ref": "#/components/schemas/CaptureMode", + "description": "capture_mode records whether captured content includes memory." + }, + "createdAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "created_at is the creation timestamp." + }, + "displayName": { + "description": "display_name is a scoped label and never selects the resource.", + "type": "string" + }, + "imageDigest": { + "description": "image_digest is the content digest when known.", + "type": "string" + }, + "imageRef": { + "description": "image_ref is the registry or backend image reference when available.", + "type": "string" + }, + "name": { + "description": "name ends in the immutable backing ID and never changes with display_name.", + "pattern": "^images/[^/]+$", + "type": "string" + }, + "platform": { + "$ref": "#/components/schemas/Platform", + "description": "platform is the image platform." + }, + "source": { + "$ref": "#/components/schemas/ImageSource", + "description": "source records how the image was created." + }, + "status": { + "$ref": "#/components/schemas/ImageStatus", + "description": "status is the image readiness state.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "totalSizeBytes": { + "description": "total_size_bytes is the approximate stored image size.", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing backing ID, equal to the resource name's terminal segment.", + "minLength": 1, + "readOnly": true, + "type": [ + "string" + ] + }, + "updatedAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "updated_at is the last update timestamp." + } + }, + "required": [ + "uid", + "name", + "status", + "createdAt", + "updatedAt" + ], + "title": "ImageSummary", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ImageSummary/" + }, + { + "name": "InteractRequest", + "pointer": "/components/schemas/InteractRequest", + "schema": { + "description": "InteractRequest is one frame on the bidirectional interaction stream.", + "oneOf": [ + { + "properties": { + "attach": { + "$ref": "#/components/schemas/ProcessAttach", + "description": "attach opens or resumes the interaction." + } + }, + "required": [ + "attach" + ], + "title": "attach", + "type": "object" + }, + { + "properties": { + "closeStdin": { + "description": "close_stdin closes standard input when true; false has no effect, including on a PTY.\nOn a PTY, true delivers the terminal's VEOF input through the line discipline and\ndoes not close the PTY master; subsequent stdin frames remain valid. Terminal mode\nowns interpretation: canonical mode treats VEOF as marking the end of input, while\nraw mode delivers it as an ordinary input byte, so this promises delivery, never\ninterpretation. Each true frame on a PTY delivers exactly one VEOF input; unlike the\npipe path, repeated frames are not a no-op.", + "type": "boolean" + } + }, + "required": [ + "closeStdin" + ], + "title": "close_stdin", + "type": "object" + }, + { + "properties": { + "resize": { + "$ref": "#/components/schemas/TerminalSize", + "description": "resize changes terminal size; portable-range dimensions on a running process without a PTY return FAILED_PRECONDITION." + } + }, + "required": [ + "resize" + ], + "title": "resize", + "type": "object" + }, + { + "properties": { + "stdin": { + "description": "stdin writes process standard input.", + "format": "byte", + "type": "string" + } + }, + "required": [ + "stdin" + ], + "title": "stdin", + "type": "object" + } + ], + "title": "InteractRequest", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/InteractRequest/" + }, + { + "name": "IssueSSHCertResponse", + "pointer": "/components/schemas/IssueSSHCertResponse", + "schema": { + "description": "IssueSSHCertResponse returns signed SSH client material, never a private key.", + "properties": { + "certificate": { + "description": "certificate is the signed SSH certificate.", + "type": "string" + }, + "expiresAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "expires_at is the instant after which the certificate is invalid." + }, + "host": { + "description": "host is the SSH endpoint host to connect to.", + "type": "string" + }, + "knownHosts": { + "description": "known_hosts is host key material that authenticates the SSH endpoint.", + "type": "string" + }, + "port": { + "description": "port is the SSH endpoint port to connect to.", + "type": "integer" + }, + "sshConfig": { + "description": "ssh_config optionally renders the connection fields as OpenSSH client\nconfiguration; the structured fields are canonical.", + "type": "string" + }, + "username": { + "description": "username is the SSH username to present; it carries no authorization.", + "type": "string" + } + }, + "title": "IssueSSHCertResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/IssueSSHCertResponse/" + }, + { + "name": "KitArtifactInput", + "pointer": "/components/schemas/KitArtifactInput", + "schema": { + "allOf": [ + { + "properties": { + "ref": { + "$ref": "#/components/schemas/KitRef" + } + } + }, + { + "oneOf": [ + { + "properties": { + "inline": { + "description": "inline is the artifact in the pinned JSON encoding.", + "format": "byte", + "type": "string" + } + }, + "required": [ + "inline" + ], + "title": "inline", + "type": "object" + } + ] + } + ], + "description": "KitArtifactInput carries a v2 artifact inline or by staged digest.", + "required": [ + "ref" + ], + "title": "KitArtifactInput", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/KitArtifactInput/" + }, + { + "name": "KitFieldDisposition", + "pointer": "/components/schemas/KitFieldDisposition", + "schema": { + "description": "KitFieldDisposition describes a declaration that was not applied.\n\nValues:\nunspecified: unspecified is invalid in a report.\nskipped: skipped identifies a contract-permitted optional skip.\nrefused: refused prevents guest or kit effects.", + "enum": [ + "unspecified", + "skipped", + "refused" + ], + "title": "KitFieldDisposition", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/KitFieldDisposition/" + }, + { + "name": "KitFieldOutcome", + "pointer": "/components/schemas/KitFieldOutcome", + "schema": { + "description": "KitFieldOutcome identifies one non-applied declaration without exposing its value.", + "properties": { + "digest": { + "description": "digest is the resolved content identity when resolution succeeded.", + "type": "string" + }, + "disposition": { + "$ref": "#/components/schemas/KitFieldDisposition", + "description": "disposition never claims that an accepted declaration has executed.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "fieldPath": { + "description": "field_path is an RFC 6901 pointer into the pinned JSON artifact.", + "type": "string" + }, + "kitIndex": { + "description": "kit_index is the zero-based position in the originating request's kits.", + "exclusiveMaximum": 64, + "type": "integer" + }, + "reason": { + "$ref": "#/components/schemas/KitFieldReason", + "description": "reason is a bounded category, not caller-controlled diagnostic content.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "reasonText": { + "description": "reason_text contains nonsecret explanatory text, never values or command content.", + "type": "string" + }, + "ref": { + "description": "ref preserves the exact requested kit reference.", + "type": "string" + } + }, + "required": [ + "ref", + "fieldPath", + "disposition", + "reason" + ], + "title": "KitFieldOutcome", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/KitFieldOutcome/" + }, + { + "name": "KitFieldOutcomeReport", + "pointer": "/components/schemas/KitFieldOutcomeReport", + "schema": { + "description": "KitFieldOutcomeReport records settled diagnostics on a sandbox or an admission refusal.", + "properties": { + "complete": { + "description": "complete means every refused or skipped declaration is accounted for; absence proves nothing.", + "type": "boolean" + }, + "outcomes": { + "description": "outcomes follow request index then UTF-8 field-path order and are never truncated.", + "items": { + "$ref": "#/components/schemas/KitFieldOutcome" + }, + "maxItems": 256, + "type": "array" + } + }, + "title": "KitFieldOutcomeReport", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/KitFieldOutcomeReport/" + }, + { + "name": "KitFieldOutcomeReportErrorDetail", + "pointer": "/components/schemas/KitFieldOutcomeReportErrorDetail", + "schema": { + "description": "KitFieldOutcomeReport records settled diagnostics on a sandbox or an admission refusal.", + "properties": { + "@type": { + "const": "type.googleapis.com/docker.sandboxes.v1.KitFieldOutcomeReport", + "type": "string" + }, + "complete": { + "description": "complete means every refused or skipped declaration is accounted for; absence proves nothing.", + "type": "boolean" + }, + "outcomes": { + "description": "outcomes follow request index then UTF-8 field-path order and are never truncated.", + "items": { + "$ref": "#/components/schemas/KitFieldOutcome" + }, + "maxItems": 256, + "type": "array" + } + }, + "required": [ + "@type" + ], + "title": "KitFieldOutcomeReportErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/KitFieldOutcomeReportErrorDetail/" + }, + { + "name": "KitFieldReason", + "pointer": "/components/schemas/KitFieldReason", + "schema": { + "description": "KitFieldReason provides stable, nonsecret diagnostic categories.\n\nValues:\nunspecified: unspecified is invalid in a report.\nunsupported: unsupported means the backend cannot honor the declaration.\nunknownField: unknownField means the pinned schema does not recognize the declaration.\ncredentialUnavailable: credentialUnavailable means the declared credential cannot be injected.", + "enum": [ + "unspecified", + "unsupported", + "unknownField", + "credentialUnavailable" + ], + "title": "KitFieldReason", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/KitFieldReason/" + }, + { + "name": "KitInput", + "pointer": "/components/schemas/KitInput", + "schema": { + "description": "KitInput is one kit in either shape.", + "oneOf": [ + { + "properties": { + "artifact": { + "$ref": "#/components/schemas/KitArtifactInput" + } + }, + "required": [ + "artifact" + ], + "title": "artifact", + "type": "object" + } + ], + "title": "KitInput", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/KitInput/" + }, + { + "name": "KitRef", + "pointer": "/components/schemas/KitRef", + "schema": { + "additionalProperties": false, + "description": "KitRef names a kit to apply.", + "properties": { + "kind": { + "description": "kind is \"sandbox\", \"mixin\", or empty to defer to the kit's own manifest.", + "enum": [ + "", + "sandbox", + "mixin" + ], + "type": "string" + }, + "ref": { + "description": "ref names the kit source.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "ref" + ], + "title": "KitRef", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/KitRef/" + }, + { + "name": "KitStartup", + "pointer": "/components/schemas/KitStartup", + "schema": { + "additionalProperties": false, + "description": "Startup commands retained when creating an image. Services with startup replay run them at each boot; services without it accept valid commands without running them.", + "properties": { + "commands": { + "description": "commands run in order at sandbox boot, on a backend that replays them.", + "items": { + "$ref": "#/components/schemas/KitStartupCommand" + }, + "minItems": 1, + "type": "array" + }, + "kits": { + "description": "kits names the kit identities the commands derive from, in composition\norder. Required.", + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "kits", + "commands" + ], + "title": "KitStartup", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/KitStartup/" + }, + { + "name": "KitStartupCommand", + "pointer": "/components/schemas/KitStartupCommand", + "schema": { + "additionalProperties": false, + "description": "KitStartupCommand is one startup command in a KitStartup set, run in order\nby a backend that replays it at sandbox boot.", + "properties": { + "argv": { + "description": "argv is the command and its arguments, exec-style. An argument other than\nthe executable itself may be empty (an intentional empty string, as in\n`printf %s \"\"`); only the vector itself is required non-empty.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "background": { + "description": "background launches the command detached instead of waiting for it.", + "type": "boolean" + }, + "user": { + "description": "user runs the command as this user; empty means the backend default.", + "type": "string" + } + }, + "required": [ + "argv" + ], + "title": "KitStartupCommand", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/KitStartupCommand/" + }, + { + "name": "ListImagesResponse", + "pointer": "/components/schemas/ListImagesResponse", + "schema": { + "description": "ListImagesResponse returns image results and a next-page token.", + "properties": { + "images": { + "description": "images is the current page.", + "items": { + "$ref": "#/components/schemas/ImageSummary" + }, + "type": "array" + }, + "nextPageToken": { + "description": "next_page_token is empty when there are no more pages.", + "type": "string" + } + }, + "title": "ListImagesResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ListImagesResponse/" + }, + { + "name": "ListPolicyLogEntriesResponse", + "pointer": "/components/schemas/ListPolicyLogEntriesResponse", + "schema": { + "description": "ListPolicyLogEntriesResponse returns policy log entries and a next-page token.", + "properties": { + "entries": { + "description": "entries is the current page.", + "items": { + "$ref": "#/components/schemas/PolicyLogEntry" + }, + "type": "array" + }, + "nextPageToken": { + "description": "next_page_token is empty when there are no more pages.", + "type": "string" + } + }, + "title": "ListPolicyLogEntriesResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ListPolicyLogEntriesResponse/" + }, + { + "name": "ListPortsResponse", + "pointer": "/components/schemas/ListPortsResponse", + "schema": { + "description": "ListPortsResponse returns currently published ports.", + "properties": { + "published": { + "description": "published is ordered by number ascending.", + "items": { + "$ref": "#/components/schemas/Port" + }, + "type": "array" + } + }, + "title": "ListPortsResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ListPortsResponse/" + }, + { + "name": "ListProcessesResponse", + "pointer": "/components/schemas/ListProcessesResponse", + "schema": { + "description": "ListProcessesResponse returns processes and a next-page token.", + "properties": { + "nextPageToken": { + "description": "next_page_token is empty when there are no more pages.", + "type": "string" + }, + "processes": { + "description": "processes is the current page.", + "items": { + "$ref": "#/components/schemas/Process" + }, + "type": "array" + } + }, + "title": "ListProcessesResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ListProcessesResponse/" + }, + { + "name": "ListSandboxesResponse", + "pointer": "/components/schemas/ListSandboxesResponse", + "schema": { + "description": "ListSandboxesResponse returns sandbox results and a next-page token.", + "properties": { + "nextPageToken": { + "description": "next_page_token is empty when there are no more pages.", + "type": "string" + }, + "sandboxes": { + "description": "sandboxes is the current page.", + "items": { + "$ref": "#/components/schemas/Sandbox" + }, + "type": "array" + } + }, + "title": "ListSandboxesResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ListSandboxesResponse/" + }, + { + "name": "ListSecretsResponse", + "pointer": "/components/schemas/ListSecretsResponse", + "schema": { + "description": "ListSecretsResponse returns secrets and a next-page token.", + "properties": { + "nextPageToken": { + "description": "next_page_token is empty when there are no more pages.", + "type": "string" + }, + "secrets": { + "description": "secrets is the current page.", + "items": { + "$ref": "#/components/schemas/Secret" + }, + "type": "array" + } + }, + "title": "ListSecretsResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ListSecretsResponse/" + }, + { + "name": "ListSnapshotsResponse", + "pointer": "/components/schemas/ListSnapshotsResponse", + "schema": { + "description": "ListSnapshotsResponse returns snapshot results and a next-page token.", + "properties": { + "nextPageToken": { + "description": "next_page_token is empty when there are no more pages.", + "type": "string" + }, + "snapshots": { + "description": "snapshots is the current page.", + "items": { + "$ref": "#/components/schemas/SnapshotSummary" + }, + "type": "array" + } + }, + "title": "ListSnapshotsResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ListSnapshotsResponse/" + }, + { + "name": "ListVolumesResponse", + "pointer": "/components/schemas/ListVolumesResponse", + "schema": { + "description": "ListVolumesResponse returns volumes and a next-page token.", + "properties": { + "nextPageToken": { + "description": "next_page_token is empty when there are no more pages.", + "type": "string" + }, + "volumes": { + "description": "volumes is the current page.", + "items": { + "$ref": "#/components/schemas/Volume" + }, + "type": "array" + } + }, + "title": "ListVolumesResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ListVolumesResponse/" + }, + { + "name": "LocalizedMessage", + "pointer": "/components/schemas/LocalizedMessage", + "schema": { + "description": "Provides a localized error message that is safe to return to the user\nwhich can be attached to an operation error.", + "properties": { + "locale": { + "description": "The locale used following the specification defined at\nhttps://www.rfc-editor.org/rfc/bcp/bcp47.txt.\nExamples are: \"en-US\", \"fr-CH\", \"es-MX\"", + "type": "string" + }, + "message": { + "description": "The localized error message in the above locale.", + "type": "string" + } + }, + "title": "LocalizedMessage", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/LocalizedMessage/" + }, + { + "name": "LocalizedMessageErrorDetail", + "pointer": "/components/schemas/LocalizedMessageErrorDetail", + "schema": { + "description": "Provides a localized error message that is safe to return to the user\nwhich can be attached to an operation error.", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.LocalizedMessage", + "type": "string" + }, + "locale": { + "description": "The locale used following the specification defined at\nhttps://www.rfc-editor.org/rfc/bcp/bcp47.txt.\nExamples are: \"en-US\", \"fr-CH\", \"es-MX\"", + "type": "string" + }, + "message": { + "description": "The localized error message in the above locale.", + "type": "string" + } + }, + "required": [ + "@type" + ], + "title": "LocalizedMessageErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/LocalizedMessageErrorDetail/" + }, + { + "name": "ManagedVolumeOptions", + "pointer": "/components/schemas/ManagedVolumeOptions", + "schema": { + "additionalProperties": false, + "description": "ManagedVolumeOptions selects existing volumes; it does not create storage.", + "properties": { + "attachments": { + "description": "attachments cannot repeat a volume identity or overlap another mount target.", + "items": { + "$ref": "#/components/schemas/VolumeAttachment" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "attachments" + ], + "title": "ManagedVolumeOptions", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ManagedVolumeOptions/" + }, + { + "name": "McpAuthorization", + "pointer": "/components/schemas/McpAuthorization", + "schema": { + "description": "McpAuthorization is the current authorization incarnation for one named upstream.", + "properties": { + "authorizationUrl": { + "description": "authorization_url is present only while interaction is pending.", + "readOnly": true, + "type": "string" + }, + "createdAt": { + "$ref": "#/components/schemas/Timestamp", + "readOnly": true + }, + "etag": { + "description": "etag identifies this incarnation and changes with every visible authorization update.", + "readOnly": true, + "type": "string" + }, + "expiresAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "expires_at bounds the pending flow; expiry records FAILED on this incarnation.", + "readOnly": true + }, + "failure": { + "$ref": "#/components/schemas/Error", + "readOnly": true + }, + "name": { + "description": "(IDENTIFIER) name is the complete singleton resource name.", + "type": "string" + }, + "server": { + "description": "(OPTIONAL) server is the complete resource name, in the form mcp-servers/{server}.", + "pattern": "^(?:mcp-servers/[^/]+)?$", + "type": "string" + }, + "status": { + "$ref": "#/components/schemas/McpAuthorizationStatus", + "readOnly": true + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing immutable backing identity, omitted when none is available.", + "readOnly": true, + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "$ref": "#/components/schemas/Timestamp", + "readOnly": true + } + }, + "title": "McpAuthorization", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpAuthorization/" + }, + { + "name": "McpAuthorizationStatus", + "pointer": "/components/schemas/McpAuthorizationStatus", + "schema": { + "description": "McpAuthorizationStatus reports the current upstream authorization outcome.\n\nValues:\nunspecified\npending\nauthorized\nfailed", + "enum": [ + "unspecified", + "pending", + "authorized", + "failed" + ], + "title": "McpAuthorizationStatus", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpAuthorizationStatus/" + }, + { + "name": "McpConfigurationMode", + "pointer": "/components/schemas/McpConfigurationMode", + "schema": { + "description": "McpConfigurationMode identifies desired hosting ownership and discovery behavior.\n\nValues:\nunspecified: unspecified is not a concrete report mode.\ndynamic: dynamic uses a backend-minted gateway with discovery.\nstatic: static uses a backend-minted gateway without discovery.\nattached: attached retains a read-only external binding.", + "enum": [ + "unspecified", + "dynamic", + "static", + "attached" + ], + "title": "McpConfigurationMode", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpConfigurationMode/" + }, + { + "name": "McpConfigurationOutcome", + "pointer": "/components/schemas/McpConfigurationOutcome", + "schema": { + "description": "McpConfigurationOutcome describes one requested server in the reported generation.\n\nValues:\nunspecified: unspecified is not a concrete outcome.\npending: pending has not settled and cannot establish completeness.\napplied: applied is confirmed membership, not upstream authorization.\nskipped: skipped requires an explicitly applicable compatibility rule.\nfailed: failed retains intent that could not be provisioned.", + "enum": [ + "unspecified", + "pending", + "applied", + "skipped", + "failed" + ], + "title": "McpConfigurationOutcome", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpConfigurationOutcome/" + }, + { + "name": "McpConfigurationReport", + "pointer": "/components/schemas/McpConfigurationReport", + "schema": { + "description": "McpConfigurationReport is also returned in Error.details on accepted provisioning failure.", + "properties": { + "complete": { + "description": "complete means every active requested server is applied or explicitly permitted to skip.", + "type": "boolean" + }, + "dormantServers": { + "description": "dormant_servers retains earlier minted intent while attached; it is empty in minted modes.", + "items": { + "$ref": "#/components/schemas/McpServer" + }, + "maxItems": 256, + "type": "array" + }, + "generation": { + "description": "generation is an opaque durable fence, never ordered or synthesized by callers.", + "type": "string" + }, + "mode": { + "$ref": "#/components/schemas/McpConfigurationMode", + "description": "mode separates minted discovery behavior from read-only attachment.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "servers": { + "description": "servers is the complete active requested set; together with dormant_servers it matches McpGateway.servers.", + "items": { + "$ref": "#/components/schemas/McpConfiguredServer" + }, + "maxItems": 256, + "type": "array" + } + }, + "required": [ + "generation", + "mode" + ], + "title": "McpConfigurationReport", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpConfigurationReport/" + }, + { + "name": "McpConfigurationReportErrorDetail", + "pointer": "/components/schemas/McpConfigurationReportErrorDetail", + "schema": { + "description": "McpConfigurationReport is also returned in Error.details on accepted provisioning failure.", + "properties": { + "@type": { + "const": "type.googleapis.com/docker.sandboxes.v1.McpConfigurationReport", + "type": "string" + }, + "complete": { + "description": "complete means every active requested server is applied or explicitly permitted to skip.", + "type": "boolean" + }, + "dormantServers": { + "description": "dormant_servers retains earlier minted intent while attached; it is empty in minted modes.", + "items": { + "$ref": "#/components/schemas/McpServer" + }, + "maxItems": 256, + "type": "array" + }, + "generation": { + "description": "generation is an opaque durable fence, never ordered or synthesized by callers.", + "type": "string" + }, + "mode": { + "$ref": "#/components/schemas/McpConfigurationMode", + "description": "mode separates minted discovery behavior from read-only attachment.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "servers": { + "description": "servers is the complete active requested set; together with dormant_servers it matches McpGateway.servers.", + "items": { + "$ref": "#/components/schemas/McpConfiguredServer" + }, + "maxItems": 256, + "type": "array" + } + }, + "required": [ + "generation", + "mode", + "@type" + ], + "title": "McpConfigurationReportErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpConfigurationReportErrorDetail/" + }, + { + "name": "McpConfiguredServer", + "pointer": "/components/schemas/McpConfiguredServer", + "schema": { + "description": "McpConfiguredServer preserves one canonical requested identity and its provisioning outcome.", + "properties": { + "outcome": { + "$ref": "#/components/schemas/McpConfigurationOutcome", + "description": "outcome is concrete even when the gateway remains ready after a failed add.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "reason": { + "description": "reason is nonsecret context and never carries credentials or credential-bearing URLs.", + "type": "string" + }, + "server": { + "$ref": "#/components/schemas/McpServer", + "description": "server is the resolved requested server; its type cannot silently change within retained intent." + } + }, + "required": [ + "server", + "outcome" + ], + "title": "McpConfiguredServer", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpConfiguredServer/" + }, + { + "name": "McpCreateSpec", + "pointer": "/components/schemas/McpCreateSpec", + "schema": { + "additionalProperties": false, + "description": "McpCreateSpec is CreateSandboxRequest's MCP block: the StartMcpGateway\nfields without the sandbox ref, wired before the workload starts.\nservers must be empty when gateway_url is set", + "properties": { + "gatewayUrl": { + "description": "gateway_url attaches read-only to a pre-existing shareable gateway when supported.", + "format": "uri", + "type": [ + "string", + "null" + ] + }, + "servers": { + "description": "servers are initial server names for a backend-minted gateway.", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "static": { + "description": "static pins the requested server set and closes gateway-side discovery.", + "type": "boolean" + } + }, + "title": "McpCreateSpec", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpCreateSpec/" + }, + { + "name": "McpGateway", + "pointer": "/components/schemas/McpGateway", + "schema": { + "description": "McpGateway is gateway state for one sandbox.", + "properties": { + "name": { + "description": "(IDENTIFIER) name is the complete singleton resource name.", + "type": "string" + }, + "reused": { + "description": "reused is true when the response reused an existing gateway.", + "type": "boolean" + }, + "servers": { + "description": "servers is the accumulated requested set, not live gateway truth.", + "items": { + "$ref": "#/components/schemas/McpServer" + }, + "type": "array" + }, + "state": { + "$ref": "#/components/schemas/McpGatewayState", + "description": "state is the gateway readiness state." + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing immutable backing identity, omitted when none is available.", + "readOnly": true, + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "url is the gateway endpoint.", + "type": "string" + } + }, + "title": "McpGateway", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpGateway/" + }, + { + "name": "McpGatewayState", + "pointer": "/components/schemas/McpGatewayState", + "schema": { + "description": "McpGatewayState reports gateway readiness.\n\nValues:\nunspecified: unspecified is never a concrete known state.\nprovisioning: provisioning means the gateway is starting.\nready: ready means the gateway can accept server operations.\nfailed: failed means gateway setup failed.", + "enum": [ + "unspecified", + "provisioning", + "ready", + "failed" + ], + "title": "McpGatewayState", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpGatewayState/" + }, + { + "name": "McpServer", + "pointer": "/components/schemas/McpServer", + "schema": { + "description": "McpServer projects one external server key configured on a gateway.", + "properties": { + "name": { + "description": "name is the external configured server key, not an API resource name.", + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/McpServerType", + "description": "type is the configured server type." + } + }, + "title": "McpServer", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpServer/" + }, + { + "name": "McpServerType", + "pointer": "/components/schemas/McpServerType", + "schema": { + "description": "McpServerType identifies a gateway server integration style.\n\nValues:\nunspecified: unspecified is not a concrete server type.\nremote: remote is an HTTP remote MCP server.\ncontainer: container is a container-backed MCP server.\nstdio: stdio is a stdio-backed MCP server.", + "enum": [ + "unspecified", + "remote", + "container", + "stdio" + ], + "title": "McpServerType", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/McpServerType/" + }, + { + "name": "NetworkPolicy", + "pointer": "/components/schemas/NetworkPolicy", + "schema": { + "additionalProperties": false, + "description": "NetworkPolicy is an inline policy request materialized in the governance plane.", + "properties": { + "allowNetworks": { + "description": "allow_networks are exact network names or CIDRs allowed by this document.", + "items": { + "type": "string" + }, + "type": "array" + }, + "denyNetworks": { + "description": "deny_networks are exact network names or CIDRs denied by this document.", + "items": { + "type": "string" + }, + "type": "array" + }, + "mode": { + "description": "mode is required and cannot be UNSPECIFIED.", + "enum": [ + "denyAll" + ], + "not": { + "enum": [ + "unspecified" + ] + }, + "title": "NetworkPolicyMode", + "type": "string" + } + }, + "required": [ + "mode" + ], + "title": "NetworkPolicy", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/NetworkPolicy/" + }, + { + "name": "NetworkPolicyMode", + "pointer": "/components/schemas/NetworkPolicyMode", + "schema": { + "description": "NetworkPolicyMode is the top-level egress disposition.\n\nValues:\nunspecified: unspecified is invalid in policy documents and in conforming responses.\nallowAll: allowAll allows egress unless denied by a narrower rule.\ndenyAll: denyAll denies egress unless allowed by a narrower rule.", + "enum": [ + "unspecified", + "allowAll", + "denyAll" + ], + "title": "NetworkPolicyMode", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/NetworkPolicyMode/" + }, + { + "name": "OAuthConfig", + "pointer": "/components/schemas/OAuthConfig", + "schema": { + "description": "OAuthConfig is non-secret OAuth metadata returned on reads.", + "properties": { + "clientId": { + "description": "client_id is the OAuth client id.", + "type": "string" + }, + "tokenEndpoint": { + "description": "token_endpoint is the OAuth token endpoint.", + "type": "string" + } + }, + "title": "OAuthConfig", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/OAuthConfig/" + }, + { + "name": "OAuthRefreshMaterial", + "pointer": "/components/schemas/OAuthRefreshMaterial", + "schema": { + "additionalProperties": false, + "description": "OAuthRefreshMaterial is OAuth secret material. Unlike OAuthRefreshMaterialV2 it pairs\nno bootstrap token with an expiry and stores client_id as the caller supplied it.", + "properties": { + "clientId": { + "description": "client_id is the OAuth client id.", + "type": "string" + }, + "expiresAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "expires_at is the access token expiry when supplied." + }, + "idToken": { + "description": "id_token is an optional OpenID Connect id token.", + "type": "string", + "writeOnly": true + }, + "initialAccessToken": { + "description": "initial_access_token is an optional bootstrap access token.", + "type": "string", + "writeOnly": true + }, + "providerAccountId": { + "description": "provider_account_id identifies the provider account.", + "type": "string" + }, + "refreshToken": { + "description": "refresh_token is the OAuth refresh token.", + "minLength": 1, + "type": "string", + "writeOnly": true + }, + "scopes": { + "description": "scopes are requested OAuth scopes.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "refreshToken" + ], + "title": "OAuthRefreshMaterial", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/OAuthRefreshMaterial/" + }, + { + "name": "OutputRetention", + "pointer": "/components/schemas/OutputRetention", + "schema": { + "description": "OutputRetention records minimum reconnect coverage independently of location.\noutput retention requires a duration or byte floor", + "properties": { + "minBytes": { + "description": "min_bytes retains at least this many recent bytes per process when nonzero.\na byte retention floor must be zero or at least 64 KiB", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "minDuration": { + "$ref": "#/components/schemas/Duration", + "description": "min_duration retains each process's output for at least this age when set." + } + }, + "title": "OutputRetention", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/OutputRetention/" + }, + { + "name": "Permission", + "pointer": "/components/schemas/Permission", + "schema": { + "description": "The actions a credential is allowed to perform. Each operation declares its required permissions; service support does not grant permission.", + "enum": [ + "unspecified", + "sandboxesRead", + "sandboxesCreate", + "sandboxesExec", + "sandboxesFilesRead", + "sandboxesFilesWrite", + "imagesPull", + "secretsWrite", + "sandboxesDelete", + "sandboxesLifecycle", + "sandboxesKits", + "sandboxesPorts", + "sandboxesCredential", + "sandboxesSsh", + "imagesRead", + "imagesWrite", + "secretsRead", + "networkPoliciesRead", + "volumesRead", + "volumesWrite", + "snapshotsRead", + "snapshotsWrite", + "mcpRead", + "mcpWrite", + "credentialsExchange", + "sandboxesRename", + "secretsResolve", + "operator" + ], + "title": "Permission", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/Permission/" + }, + { + "name": "Platform", + "pointer": "/components/schemas/Platform", + "schema": { + "additionalProperties": false, + "description": "Platform is the OCI platform tuple.", + "properties": { + "architecture": { + "description": "architecture is the CPU architecture, for example \"amd64\" or \"arm64\".", + "type": "string" + }, + "os": { + "description": "os is the operating system, for example \"linux\".", + "type": "string" + } + }, + "title": "Platform", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Platform/" + }, + { + "name": "PolicyDecision", + "pointer": "/components/schemas/PolicyDecision", + "schema": { + "description": "PolicyDecision is the outcome of an evaluated access attempt.\n\nValues:\nunspecified: unspecified means the decision is unknown or not reported.\nallowed: allowed means the attempt was allowed.\nblocked: blocked means the attempt was blocked.", + "enum": [ + "unspecified", + "allowed", + "blocked" + ], + "title": "PolicyDecision", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/PolicyDecision/" + }, + { + "name": "PolicyDomain", + "pointer": "/components/schemas/PolicyDomain", + "schema": { + "description": "PolicyDomain identifies a policy subsystem.\n\nValues:\nunspecified: unspecified is not a concrete policy domain.\nnetwork: network is network egress policy.", + "enum": [ + "unspecified", + "network" + ], + "title": "PolicyDomain", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/PolicyDomain/" + }, + { + "name": "PolicyLayer", + "pointer": "/components/schemas/PolicyLayer", + "schema": { + "description": "PolicyLayer identifies where an effective rule came from. ORG and OWNER are\nthe two governance scopes; exactly one governs a caller, so a conforming effective view never mixes them.\n\nValues:\nunspecified: unspecified means the layer is unknown or not reported.\norg: org is org-level governance policy.\nowner: owner is owner-level governance policy.\nkit: kit is the sandbox-scoped policy a kit contributes.\nattached: attached is a governance policy bound to the sandbox: an inline document or a referenced policy id, materialized and bound by the governance plane at create.\ngateway: gateway is an enforced runtime-owned gateway policy contribution, not a backend service-route exemption.\ndefault: default is an explicit installed default-policy contribution, not a substitute for unknown provenance or an owner-level policy.", + "enum": [ + "unspecified", + "org", + "owner", + "kit", + "attached", + "gateway", + "default" + ], + "title": "PolicyLayer", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/PolicyLayer/" + }, + { + "name": "PolicyLogEntry", + "pointer": "/components/schemas/PolicyLogEntry", + "schema": { + "description": "PolicyLogEntry is an aggregated observed policy decision.", + "properties": { + "count": { + "description": "count is the number of coalesced observations.", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "decision": { + "$ref": "#/components/schemas/PolicyDecision", + "description": "decision is the observed allow or block outcome." + }, + "domain": { + "$ref": "#/components/schemas/PolicyDomain", + "description": "domain is the policy domain that emitted the entry." + }, + "firstSeen": { + "$ref": "#/components/schemas/Timestamp", + "description": "first_seen is the first observation timestamp." + }, + "lastSeen": { + "$ref": "#/components/schemas/Timestamp", + "description": "last_seen is the most recent observation timestamp." + }, + "proxyType": { + "description": "proxy_type is the proxy or enforcement path that observed the decision.", + "type": "string" + }, + "reason": { + "description": "reason is backend-readable context.", + "type": "string" + }, + "resource": { + "description": "resource is the requested destination or resource.", + "type": "string" + }, + "rule": { + "description": "rule is the matching rule when available.", + "type": "string" + }, + "sandbox": { + "description": "sandbox is the resource name recorded for this reference.", + "type": "string" + }, + "sandboxUid": { + "description": "sandbox_uid retains the observed backing incarnation when the backend provides one.", + "readOnly": true, + "type": [ + "string", + "null" + ] + } + }, + "title": "PolicyLogEntry", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/PolicyLogEntry/" + }, + { + "name": "Port", + "pointer": "/components/schemas/Port", + "schema": { + "description": "Port is one sandbox port made reachable from outside the sandbox. The same\nfacts appear inline on SandboxCore.ports for a caller reading the sandbox.", + "properties": { + "etag": { + "description": "etag identifies the observed version of this port.", + "readOnly": true, + "type": "string" + }, + "name": { + "description": "(IDENTIFIER) name identifies the published port number under its sandbox resource name.", + "type": "string" + }, + "number": { + "description": "(IMMUTABLE) number is immutable and unique within the sandbox; duplicates refuse ALREADY_EXISTS.", + "format": "int32", + "maximum": 65535, + "minimum": 1, + "type": "integer" + }, + "protocol": { + "$ref": "#/components/schemas/Protocol", + "description": "(IMMUTABLE) protocol defaults to TCP when unspecified." + }, + "uid": { + "description": "(IMMUTABLE) uid is the durable publication incarnation when the backend provides one.", + "readOnly": true, + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "url is the required externally reachable address, including host-local addresses.", + "readOnly": true, + "type": "string" + } + }, + "required": [ + "number" + ], + "title": "Port", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Port/" + }, + { + "name": "PreconditionFailure", + "pointer": "/components/schemas/PreconditionFailure", + "schema": { + "description": "Describes what preconditions have failed.\n\nFor example, if an operation failed because it required the Terms of Service to be\nacknowledged, it could list the terms of service violation in the\nPreconditionFailure message.", + "properties": { + "violations": { + "description": "Describes all precondition violations.", + "items": { + "$ref": "#/components/schemas/PreconditionFailureViolation" + }, + "type": "array" + } + }, + "title": "PreconditionFailure", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/PreconditionFailure/" + }, + { + "name": "PreconditionFailureErrorDetail", + "pointer": "/components/schemas/PreconditionFailureErrorDetail", + "schema": { + "description": "Describes what preconditions have failed.\n\nFor example, if an operation failed because it required the Terms of Service to be\nacknowledged, it could list the terms of service violation in the\nPreconditionFailure message.", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.PreconditionFailure", + "type": "string" + }, + "violations": { + "description": "Describes all precondition violations.", + "items": { + "$ref": "#/components/schemas/PreconditionFailureViolation" + }, + "type": "array" + } + }, + "required": [ + "@type" + ], + "title": "PreconditionFailureErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/PreconditionFailureErrorDetail/" + }, + { + "name": "PreconditionFailureViolation", + "pointer": "/components/schemas/PreconditionFailureViolation", + "schema": { + "description": "A message type used to describe a single precondition failure.", + "properties": { + "description": { + "description": "A description of how the precondition failed. Developers can use this\ndescription to understand how to fix the failure.\n\nFor example: \"Terms of service not accepted\".", + "type": "string" + }, + "subject": { + "description": "The subject, relative to the type, that failed.\nFor example, \"google.com/cloud\" relative to the \"TOS\" type would indicate\nwhich terms of service is being referenced.", + "type": "string" + }, + "type": { + "description": "The type of PreconditionFailure. We recommend using a service-specific\nenum type to define the supported precondition violation subjects. For\nexample, \"TOS\" for \"Terms of Service violation\".", + "type": "string" + } + }, + "title": "Violation", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/PreconditionFailureViolation/" + }, + { + "name": "Process", + "pointer": "/components/schemas/Process", + "schema": { + "description": "Process is the handle returned before interaction begins.", + "properties": { + "exitCode": { + "description": "exit_code is the process exit code, set only when state is exited and absent otherwise.", + "format": "int32", + "type": [ + "integer", + "null" + ] + }, + "label": { + "description": "(IMMUTABLE) label retains the unique, immutable process label and its generated default.", + "minLength": 1, + "type": "string" + }, + "lastStreamSequence": { + "description": "last_stream_sequence is the highest stream_sequence emitted for the process when this report was assembled; 0 before any output.", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "name": { + "description": "(IDENTIFIER) name is scoped to the discovered sandbox endpoint API base.", + "type": "string" + }, + "pid": { + "description": "pid is the process id inside the sandbox when available.", + "format": "int32", + "type": "integer" + }, + "receiptKind": { + "$ref": "#/components/schemas/ReceiptKind", + "description": "receipt_kind classifies this response on CreateProcess; every other operation\nreturning a Process, including ListProcesses, always reports unspecified." + }, + "session": { + "description": "session is the session tag from the create, empty when untagged.", + "type": "string" + }, + "state": { + "$ref": "#/components/schemas/ProcessState", + "description": "state is the process state, concrete in conforming responses." + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing process incarnation, also used as the resource name terminal.", + "readOnly": true, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "label" + ], + "title": "Process", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Process/" + }, + { + "name": "ProcessAttach", + "pointer": "/components/schemas/ProcessAttach", + "schema": { + "additionalProperties": false, + "description": "Attach selects the process and output resume point.", + "properties": { + "name": { + "description": "name is the complete resource name, in the form processes/{process}.", + "pattern": "^processes/[^/]+$", + "type": "string" + }, + "resumeFrom": { + "description": "resume_from resumes after a received or published stream_sequence; 0 means from the start. Missing output after this point fails with FAILED_PRECONDITION.", + "format": "int64", + "type": [ + "integer", + "string" + ] + } + }, + "required": [ + "name" + ], + "title": "Attach", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ProcessAttach/" + }, + { + "name": "ProcessChunk", + "pointer": "/components/schemas/ProcessChunk", + "schema": { + "description": "Chunk carries process output.", + "properties": { + "data": { + "description": "data is output bytes.", + "format": "byte", + "type": "string" + }, + "stream": { + "$ref": "#/components/schemas/StreamType", + "description": "stream identifies stdout, stderr, or PTY output." + }, + "streamSequence": { + "description": "stream_sequence is one-based and strictly increases per process output stream.", + "format": "int64", + "type": [ + "integer", + "string" + ] + } + }, + "title": "Chunk", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ProcessChunk/" + }, + { + "name": "ProcessExited", + "pointer": "/components/schemas/ProcessExited", + "schema": { + "description": "Exited reports process completion.", + "properties": { + "exitCode": { + "description": "exit_code is the process exit code.", + "format": "int32", + "type": "integer" + }, + "reason": { + "description": "reason is backend-readable exit context.", + "type": "string" + } + }, + "title": "Exited", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ProcessExited/" + }, + { + "name": "ProcessHeartbeat", + "pointer": "/components/schemas/ProcessHeartbeat", + "schema": { + "additionalProperties": false, + "description": "Heartbeat is an idle keepalive frame.", + "title": "Heartbeat", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ProcessHeartbeat/" + }, + { + "name": "ProcessOutput", + "pointer": "/components/schemas/ProcessOutput", + "schema": { + "dependentSchemas": { + "chunk": { + "not": { + "anyOf": [ + { + "required": [ + "exited" + ] + }, + { + "required": [ + "heartbeat" + ] + } + ] + } + }, + "exited": { + "not": { + "anyOf": [ + { + "required": [ + "chunk" + ] + }, + { + "required": [ + "heartbeat" + ] + } + ] + } + }, + "heartbeat": { + "not": { + "anyOf": [ + { + "required": [ + "chunk" + ] + }, + { + "required": [ + "exited" + ] + } + ] + } + } + }, + "description": "Output is one server frame on an interaction stream. At most one of chunk, exited, heartbeat is set.", + "properties": { + "chunk": { + "$ref": "#/components/schemas/ProcessChunk", + "description": "chunk carries ordered process output." + }, + "exited": { + "$ref": "#/components/schemas/ProcessExited", + "description": "exited reports process completion." + }, + "heartbeat": { + "$ref": "#/components/schemas/ProcessHeartbeat", + "description": "heartbeat keeps an idle stream alive and carries no resume position." + } + }, + "title": "Output", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/ProcessOutput/" + }, + { + "name": "ProcessSignal", + "pointer": "/components/schemas/ProcessSignal", + "schema": { + "description": "Signal is a process signal.\n\nValues:\nunspecified: unspecified is invalid.\nterm: term requests graceful termination.\nkill: kill requests immediate termination.\nint: int requests interrupt.\nhup: hup requests hangup.\nquit: quit requests quit.\nusr1: usr1 requests user signal 1.\nusr2: usr2 requests user signal 2.", + "enum": [ + "unspecified", + "term", + "kill", + "int", + "hup", + "quit", + "usr1", + "usr2" + ], + "title": "Signal", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ProcessSignal/" + }, + { + "name": "ProcessState", + "pointer": "/components/schemas/ProcessState", + "schema": { + "description": "ProcessState is the coarse process lifecycle a process report carries.\n\nValues:\nunspecified: unspecified is not a concrete state; conforming responses never use it.\nrunning: running means the process has not exited.\nexited: exited means the process has exited.", + "enum": [ + "unspecified", + "running", + "exited" + ], + "title": "ProcessState", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ProcessState/" + }, + { + "name": "Protocol", + "pointer": "/components/schemas/Protocol", + "schema": { + "description": "Protocol names the transport protocol for a published port.\n\nValues:\nunspecified: unspecified means the backend default, TCP.\ntcp: tcp publishes TCP traffic.\nudp: udp publishes UDP traffic.\ntcp4: tcp4 publishes IPv4 TCP traffic.\ntcp6: tcp6 publishes IPv6 TCP traffic.\nudp4: udp4 publishes IPv4 UDP traffic.\nudp6: udp6 publishes IPv6 UDP traffic.", + "enum": [ + "unspecified", + "tcp", + "udp", + "tcp4", + "tcp6", + "udp4", + "udp6" + ], + "title": "Protocol", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/Protocol/" + }, + { + "name": "PtyConfig", + "pointer": "/components/schemas/PtyConfig", + "schema": { + "additionalProperties": false, + "description": "PtyConfig configures pseudo-terminal creation.", + "properties": { + "initialSize": { + "$ref": "#/components/schemas/TerminalSize", + "description": "initial_size requests an initial terminal size; absence selects a backend-defined size." + } + }, + "title": "PtyConfig", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/PtyConfig/" + }, + { + "name": "PublishedPort", + "pointer": "/components/schemas/PublishedPort", + "schema": { + "description": "PublishedPort reports external reachability for one sandbox port.", + "properties": { + "hostIp": { + "description": "host_ip is the local host bind address when relevant.", + "type": "string" + }, + "hostPort": { + "description": "host_port is the local host port when relevant.", + "type": "integer" + }, + "protocol": { + "$ref": "#/components/schemas/Protocol", + "description": "protocol is the published protocol." + }, + "sandboxPort": { + "description": "sandbox_port is the port inside the sandbox.", + "type": "integer" + }, + "url": { + "description": "url is the required externally reachable address, including host-local addresses.", + "type": "string" + } + }, + "title": "PublishedPort", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/PublishedPort/" + }, + { + "name": "QuotaFailure", + "pointer": "/components/schemas/QuotaFailure", + "schema": { + "description": "Describes how a quota check failed.\n\nFor example if a daily limit was exceeded for the calling project,\na service could respond with a QuotaFailure detail containing the project\nid and the description of the quota limit that was exceeded. If the\ncalling project hasn't enabled the service in the developer console, then\na service could respond with the project id and set `service_disabled`\nto true.\n\nAlso see RetryInfo and Help types for other details about handling a\nquota failure.", + "properties": { + "violations": { + "description": "Describes all quota violations.", + "items": { + "$ref": "#/components/schemas/QuotaFailureViolation" + }, + "type": "array" + } + }, + "title": "QuotaFailure", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/QuotaFailure/" + }, + { + "name": "QuotaFailureErrorDetail", + "pointer": "/components/schemas/QuotaFailureErrorDetail", + "schema": { + "description": "Describes how a quota check failed.\n\nFor example if a daily limit was exceeded for the calling project,\na service could respond with a QuotaFailure detail containing the project\nid and the description of the quota limit that was exceeded. If the\ncalling project hasn't enabled the service in the developer console, then\na service could respond with the project id and set `service_disabled`\nto true.\n\nAlso see RetryInfo and Help types for other details about handling a\nquota failure.", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.QuotaFailure", + "type": "string" + }, + "violations": { + "description": "Describes all quota violations.", + "items": { + "$ref": "#/components/schemas/QuotaFailureViolation" + }, + "type": "array" + } + }, + "required": [ + "@type" + ], + "title": "QuotaFailureErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/QuotaFailureErrorDetail/" + }, + { + "name": "QuotaFailureViolation", + "pointer": "/components/schemas/QuotaFailureViolation", + "schema": { + "description": "A message type used to describe a single quota violation. For example, a\ndaily quota or a custom quota that was exceeded.", + "properties": { + "apiService": { + "description": "The API Service from which the `QuotaFailure.Violation` orginates. In\nsome cases, Quota issues originate from an API Service other than the one\nthat was called. In other words, a dependency of the called API Service\ncould be the cause of the `QuotaFailure`, and this field would have the\ndependency API service name.\n\nFor example, if the called API is Kubernetes Engine API\n(container.googleapis.com), and a quota violation occurs in the\nKubernetes Engine API itself, this field would be\n\"container.googleapis.com\". On the other hand, if the quota violation\noccurs when the Kubernetes Engine API creates VMs in the Compute Engine\nAPI (compute.googleapis.com), this field would be\n\"compute.googleapis.com\".", + "type": "string" + }, + "description": { + "description": "A description of how the quota check failed. Clients can use this\ndescription to find more about the quota configuration in the service's\npublic documentation, or find the relevant quota limit to adjust through\ndeveloper console.\n\nFor example: \"Service disabled\" or \"Daily Limit for read operations\nexceeded\".", + "type": "string" + }, + "futureQuotaValue": { + "description": "The new quota value being rolled out at the time of the violation. At the\ncompletion of the rollout, this value will be enforced in place of\nquota_value. If no rollout is in progress at the time of the violation,\nthis field is not set.\n\nFor example, if at the time of the violation a rollout is in progress\nchanging the number of CPUs quota from 10 to 20, 20 would be the value of\nthis field.", + "format": "int64", + "type": [ + "integer", + "string", + "null" + ] + }, + "quotaDimensions": { + "additionalProperties": { + "title": "value", + "type": "string" + }, + "description": "The dimensions of the violated quota. Every non-global quota is enforced\non a set of dimensions. While quota metric defines what to count, the\ndimensions specify for what aspects the counter should be increased.\n\nFor example, the quota \"CPUs per region per VM family\" enforces a limit\non the metric \"compute.googleapis.com/cpus_per_vm_family\" on dimensions\n\"region\" and \"vm_family\". And if the violation occurred in region\n\"us-central1\" and for VM family \"n1\", the quota_dimensions would be,\n\n{\n\"region\": \"us-central1\",\n\"vm_family\": \"n1\",\n}\n\nWhen a quota is enforced globally, the quota_dimensions would always be\nempty.", + "type": "object" + }, + "quotaId": { + "description": "The id of the violated quota. Also know as \"limit name\", this is the\nunique identifier of a quota in the context of an API service.\n\nFor example, \"CPUS-PER-VM-FAMILY-per-project-region\".", + "type": "string" + }, + "quotaMetric": { + "description": "The metric of the violated quota. A quota metric is a named counter to\nmeasure usage, such as API requests or CPUs. When an activity occurs in a\nservice, such as Virtual Machine allocation, one or more quota metrics\nmay be affected.\n\nFor example, \"compute.googleapis.com/cpus_per_vm_family\",\n\"storage.googleapis.com/internet_egress_bandwidth\".", + "type": "string" + }, + "quotaValue": { + "description": "The enforced quota value at the time of the `QuotaFailure`.\n\nFor example, if the enforced quota value at the time of the\n`QuotaFailure` on the number of CPUs is \"10\", then the value of this\nfield would reflect this quantity.", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "subject": { + "description": "The subject on which the quota check failed.\nFor example, \"clientip:\u003cip address of client\u003e\" or \"project:\u003cGoogle\ndeveloper project id\u003e\".", + "type": "string" + } + }, + "title": "Violation", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/QuotaFailureViolation/" + }, + { + "name": "RawImageStartup", + "pointer": "/components/schemas/RawImageStartup", + "schema": { + "additionalProperties": false, + "description": "RawImageStartup resolves identity and working directory from the pinned image.", + "properties": { + "start": { + "$ref": "#/components/schemas/StartupArgv", + "description": "start replaces the complete launch argv; omission uses the image command." + } + }, + "title": "RawImageStartup", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/RawImageStartup/" + }, + { + "name": "ReadOutputResponse", + "pointer": "/components/schemas/ReadOutputResponse", + "schema": { + "description": "ReadOutputResponse is one page of ordered output.", + "properties": { + "chunks": { + "description": "chunks is retained output in stream_sequence order, possibly empty.", + "items": { + "$ref": "#/components/schemas/ProcessChunk" + }, + "type": "array" + }, + "exited": { + "$ref": "#/components/schemas/ProcessExited", + "description": "exited is set once the process has exited and no retained bytes follow next_resume_from." + }, + "nextResumeFrom": { + "description": "next_resume_from is the stream_sequence to pass next; equal to resume_from\nwhen nothing new was retained.", + "format": "int64", + "type": [ + "integer", + "string" + ] + } + }, + "title": "ReadOutputResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ReadOutputResponse/" + }, + { + "name": "ReceiptKind", + "pointer": "/components/schemas/ReceiptKind", + "schema": { + "description": "ReceiptKind classifies whether a CreateProcess response was freshly assembled or\nis the retained receipt of an earlier accepted request.\n\nValues:\nunspecified: unspecified is not a concrete classification; a backend or a client generated before this field existed reports or reads this. It asserts neither freshness nor replay.\nfresh: fresh means this Process was assembled for this specific accepted request; last_stream_sequence reflects live state as of that acceptance.\nreplay: replay means the backend returned the retained result of an earlier accepted request under the synchronous mutation replay rule; last_stream_sequence is frozen at the value observed during that original acceptance.", + "enum": [ + "unspecified", + "fresh", + "replay" + ], + "title": "ReceiptKind", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ReceiptKind/" + }, + { + "name": "RequestInfo", + "pointer": "/components/schemas/RequestInfo", + "schema": { + "description": "Contains metadata about the request that clients can attach when filing a bug\nor providing other forms of feedback.", + "properties": { + "requestId": { + "description": "An opaque string that should only be interpreted by the service generating\nit. For example, it can be used to identify requests in the service's logs.", + "type": "string" + }, + "servingData": { + "description": "Any data that was used to serve this request. For example, an encrypted\nstack trace that can be sent back to the service provider for debugging.", + "type": "string" + } + }, + "title": "RequestInfo", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/RequestInfo/" + }, + { + "name": "RequestInfoErrorDetail", + "pointer": "/components/schemas/RequestInfoErrorDetail", + "schema": { + "description": "Contains metadata about the request that clients can attach when filing a bug\nor providing other forms of feedback.", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.RequestInfo", + "type": "string" + }, + "requestId": { + "description": "An opaque string that should only be interpreted by the service generating\nit. For example, it can be used to identify requests in the service's logs.", + "type": "string" + }, + "servingData": { + "description": "Any data that was used to serve this request. For example, an encrypted\nstack trace that can be sent back to the service provider for debugging.", + "type": "string" + } + }, + "required": [ + "@type" + ], + "title": "RequestInfoErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/RequestInfoErrorDetail/" + }, + { + "name": "ResourceInfo", + "pointer": "/components/schemas/ResourceInfo", + "schema": { + "description": "Describes the resource that is being accessed.", + "properties": { + "description": { + "description": "Describes what error is encountered when accessing this resource.\nFor example, updating a cloud project may require the `writer` permission\non the developer console project.", + "type": "string" + }, + "owner": { + "description": "The owner of the resource (optional).\nFor example, \"user:\u003cowner email\u003e\" or \"project:\u003cGoogle developer project\nid\u003e\".", + "type": "string" + }, + "resourceName": { + "description": "The name of the resource being accessed. For example, a shared calendar\nname: \"example.com_4fghdhgsrgh@group.calendar.google.com\", if the current\nerror is\n[CodePERMISSION_DENIED][CodePERMISSION_DENIED].", + "type": "string" + }, + "resourceType": { + "description": "A name for the type of resource being accessed, e.g. \"sql table\",\n\"cloud storage bucket\", \"file\", \"Google calendar\"; or the type URL\nof the resource: e.g. \"type.googleapis.com/google.pubsub.v1.Topic\".", + "type": "string" + } + }, + "title": "ResourceInfo", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ResourceInfo/" + }, + { + "name": "ResourceInfoErrorDetail", + "pointer": "/components/schemas/ResourceInfoErrorDetail", + "schema": { + "description": "Describes the resource that is being accessed.", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.ResourceInfo", + "type": "string" + }, + "description": { + "description": "Describes what error is encountered when accessing this resource.\nFor example, updating a cloud project may require the `writer` permission\non the developer console project.", + "type": "string" + }, + "owner": { + "description": "The owner of the resource (optional).\nFor example, \"user:\u003cowner email\u003e\" or \"project:\u003cGoogle developer project\nid\u003e\".", + "type": "string" + }, + "resourceName": { + "description": "The name of the resource being accessed. For example, a shared calendar\nname: \"example.com_4fghdhgsrgh@group.calendar.google.com\", if the current\nerror is\n[CodePERMISSION_DENIED][CodePERMISSION_DENIED].", + "type": "string" + }, + "resourceType": { + "description": "A name for the type of resource being accessed, e.g. \"sql table\",\n\"cloud storage bucket\", \"file\", \"Google calendar\"; or the type URL\nof the resource: e.g. \"type.googleapis.com/google.pubsub.v1.Topic\".", + "type": "string" + } + }, + "required": [ + "@type" + ], + "title": "ResourceInfoErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ResourceInfoErrorDetail/" + }, + { + "name": "Resources", + "pointer": "/components/schemas/Resources", + "schema": { + "additionalProperties": false, + "description": "Resources describes sandbox CPU and memory allocation.", + "properties": { + "cpus": { + "description": "cpus is present only when the caller or backend chooses a CPU count.", + "type": [ + "integer", + "null" + ] + }, + "memoryMib": { + "description": "memory_mib is present only when the caller or backend chooses memory.", + "format": "int64", + "type": [ + "integer", + "string", + "null" + ] + } + }, + "title": "Resources", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Resources/" + }, + { + "name": "RetryInfo", + "pointer": "/components/schemas/RetryInfo", + "schema": { + "description": "Describes when the clients can retry a failed request. Clients could ignore\nthe recommendation here or retry when this information is missing from error\nresponses.\n\nIt's always recommended that clients should use exponential backoff when\nretrying.\n\nClients should wait until `retry_delay` amount of time has passed since\nreceiving the error response before retrying. If retrying requests also\nfail, clients should use an exponential backoff scheme to gradually increase\nthe delay between retries based on `retry_delay`, until either a maximum\nnumber of retries have been reached or a maximum retry delay cap has been\nreached.", + "properties": { + "retryDelay": { + "$ref": "#/components/schemas/Duration", + "description": "Clients should wait at least this long between retrying the same request." + } + }, + "title": "RetryInfo", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/RetryInfo/" + }, + { + "name": "RetryInfoErrorDetail", + "pointer": "/components/schemas/RetryInfoErrorDetail", + "schema": { + "description": "Describes when the clients can retry a failed request. Clients could ignore\nthe recommendation here or retry when this information is missing from error\nresponses.\n\nIt's always recommended that clients should use exponential backoff when\nretrying.\n\nClients should wait until `retry_delay` amount of time has passed since\nreceiving the error response before retrying. If retrying requests also\nfail, clients should use an exponential backoff scheme to gradually increase\nthe delay between retries based on `retry_delay`, until either a maximum\nnumber of retries have been reached or a maximum retry delay cap has been\nreached.", + "properties": { + "@type": { + "const": "type.googleapis.com/google.rpc.RetryInfo", + "type": "string" + }, + "retryDelay": { + "$ref": "#/components/schemas/Duration", + "description": "Clients should wait at least this long between retrying the same request." + } + }, + "required": [ + "@type" + ], + "title": "RetryInfoErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/RetryInfoErrorDetail/" + }, + { + "name": "Sandbox", + "pointer": "/components/schemas/Sandbox", + "schema": { + "description": "Sandbox carries shared core state and the effective state of its selected features.\nuid must equal the immutable resource ID in name", + "properties": { + "core": { + "$ref": "#/components/schemas/SandboxCore", + "description": "core is the backend-neutral sandbox view." + }, + "displayName": { + "description": "display_name is the scoped label; UpdateSandbox changes it without changing identity.", + "type": "string" + }, + "effectiveFeatures": { + "$ref": "#/components/schemas/EffectiveFeatures", + "description": "effective_features is emitted only by the composition contract projection." + }, + "failure": { + "$ref": "#/components/schemas/Error", + "description": "failure is present only while status is FAILED and clears on recovery.", + "readOnly": true + }, + "name": { + "description": "(IDENTIFIER) name ends in the immutable backing ID and never changes with display_name.", + "pattern": "^sandboxes/[^/]+$", + "type": "string" + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing backing ID, equal to the resource name's terminal segment.", + "minLength": 1, + "readOnly": true, + "type": [ + "string" + ] + } + }, + "required": [ + "core", + "name", + "uid" + ], + "title": "Sandbox", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Sandbox/" + }, + { + "name": "SandboxCore", + "pointer": "/components/schemas/SandboxCore", + "schema": { + "allOf": [ + { + "properties": { + "agent": { + "description": "agent is the named agent profile, empty for raw image/start-command sandboxes.", + "type": "string" + }, + "appliedKits": { + "description": "applied_kits records kits active in the sandbox.", + "items": { + "$ref": "#/components/schemas/AppliedKit" + }, + "type": "array" + }, + "createdAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "created_at is the creation time." + }, + "endpoint": { + "$ref": "#/components/schemas/SandboxEndpoint", + "description": "endpoint is where process and file services are served for this sandbox." + }, + "environment": { + "additionalProperties": { + "title": "value", + "type": "string" + }, + "description": "environment is non-secret environment metadata.", + "type": "object" + }, + "etag": { + "description": "etag identifies the observed version of this resource. It is opaque and strong,\nchanges on every visible change, and is what a mutation sends as its precondition.", + "minLength": 1, + "pattern": "^\"[^\"\\x00-\\x20\\x7f]*\"$", + "readOnly": true, + "type": "string" + }, + "labels": { + "additionalProperties": { + "title": "value", + "type": "string" + }, + "description": "labels are non-secret caller-assigned key/value metadata.", + "type": "object" + }, + "origin": { + "description": "origin is set by merged views to identify the backend that owns this sandbox.", + "type": "string" + }, + "platform": { + "$ref": "#/components/schemas/Platform", + "description": "platform is the canonical placed platform." + }, + "ports": { + "description": "ports are the currently published ports.", + "items": { + "$ref": "#/components/schemas/PublishedPort" + }, + "type": "array" + }, + "resources": { + "$ref": "#/components/schemas/Resources", + "description": "resources are the sandbox resources." + }, + "status": { + "$ref": "#/components/schemas/SandboxStatus", + "description": "status is the coarse lifecycle state.", + "not": { + "enum": [ + "unspecified" + ] + }, + "readOnly": true + } + } + }, + { + "dependentSchemas": { + "image": { + "not": { + "anyOf": [ + { + "required": [ + "imageRef" + ] + } + ] + } + }, + "imageRef": { + "not": { + "anyOf": [ + { + "required": [ + "image" + ] + } + ] + } + } + }, + "properties": { + "image": { + "description": "image is the managed Image resource name.", + "pattern": "^images/[^/]+$", + "type": "string" + }, + "imageRef": { + "description": "image_ref is an external OCI reference, with the existing backend validation.", + "type": "string" + } + } + } + ], + "description": "SandboxCore is the backend-neutral sandbox view. At most one of image, imageRef is set.", + "required": [ + "status", + "createdAt", + "etag" + ], + "title": "SandboxCore", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/SandboxCore/" + }, + { + "name": "SandboxEndpoint", + "pointer": "/components/schemas/SandboxEndpoint", + "schema": { + "dependentSchemas": { + "authentication": { + "allOf": [ + { + "oneOf": [ + { + "properties": { + "authentication": { + "properties": { + "scheme": { + "const": "scopedBearer" + } + } + }, + "credentialAudience": { + "minLength": 1 + }, + "protocol": { + "const": "http" + } + }, + "required": [ + "credentialAudience" + ] + }, + { + "properties": { + "authentication": { + "properties": { + "scheme": { + "const": "localSocket" + } + } + }, + "credentialAudience": { + "const": "" + }, + "protocol": { + "const": "unixSocket" + } + } + } + ], + "required": [ + "protocol" + ] + } + ] + } + }, + "description": "SandboxEndpoint tells a client where sandbox endpoint services are served.\nnetwork endpoints require scoped credentials; Unix sockets use actual socket access controls\nsandbox must contain the endpoint's immutable sandbox UID", + "properties": { + "apiVersion": { + "const": "v1", + "description": "api_version identifies the /v1 endpoint contract before the client connects.", + "type": "string" + }, + "authentication": { + "$ref": "#/components/schemas/EndpointAuthentication" + }, + "capabilities": { + "description": "capabilities lists supported public operation IDs, independently of caller grants.", + "items": { + "pattern": "^[a-z][A-Za-z0-9]*$", + "type": "string" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "credentialAudience": { + "description": "credential_audience is server-controlled and required for network endpoints.", + "type": "string" + }, + "protocol": { + "$ref": "#/components/schemas/SandboxEndpointProtocol", + "description": "protocol identifies the endpoint transport." + }, + "sandbox": { + "description": "sandbox names the immutable sandbox incarnation served by this endpoint.", + "pattern": "^sandboxes/[^/]+$", + "type": "string" + }, + "sandboxUid": { + "minLength": 1, + "readOnly": true, + "type": [ + "string" + ] + }, + "uri": { + "description": "uri is the endpoint API base; preserve its path prefix when appending /v1 routes.", + "type": "string" + } + }, + "required": [ + "sandbox", + "sandboxUid", + "apiVersion", + "capabilities", + "authentication" + ], + "title": "SandboxEndpoint", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/SandboxEndpoint/" + }, + { + "name": "SandboxEndpointProtocol", + "pointer": "/components/schemas/SandboxEndpointProtocol", + "schema": { + "description": "SandboxEndpointProtocol identifies the transport used by a sandbox endpoint.\n\nValues:\nunspecified: unspecified is not a concrete endpoint protocol.\nhttp: http is the REST API over HTTP.\nunixSocket: unixSocket is a local unix socket.", + "enum": [ + "unspecified", + "http", + "unixSocket" + ], + "title": "SandboxEndpointProtocol", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/SandboxEndpointProtocol/" + }, + { + "name": "SandboxStatus", + "pointer": "/components/schemas/SandboxStatus", + "schema": { + "description": "SandboxStatus is the backend-neutral lifecycle state.\n\nValues:\nunspecified: unspecified is never a concrete known state.\ncreating: creating means provisioning has not completed.\nstarting: starting means a stopped sandbox is starting or resuming.\nrunning: running means the sandbox is running.\nstopping: stopping means the sandbox is stopping or hibernating.\nstopped: stopped means the sandbox is not running and may be started.\nfailed: failed means the sandbox reached an unrecoverable failure.\ndeleting: deleting means deletion is accepted; reads continue until removal.\ndegraded: degraded means runtime contact is lost; recovery or failure may follow.", + "enum": [ + "unspecified", + "creating", + "starting", + "running", + "stopping", + "stopped", + "failed", + "deleting", + "degraded" + ], + "title": "SandboxStatus", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/SandboxStatus/" + }, + { + "name": "Secret", + "pointer": "/components/schemas/Secret", + "schema": { + "description": "Secret is returned metadata and never includes secret material.\nuid must equal the immutable resource ID in name", + "properties": { + "createdAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "created_at is the creation timestamp." + }, + "displayName": { + "description": "display_name is a scoped label and never selects the resource.", + "type": "string" + }, + "etag": { + "description": "etag identifies the observed version of this resource. It is opaque and strong,\nchanges on every visible change, and is what a mutation sends as its precondition.", + "minLength": 1, + "pattern": "^\"[^\"\\x00-\\x20\\x7f]*\"$", + "readOnly": true, + "type": "string" + }, + "injection": { + "$ref": "#/components/schemas/CustomInjection", + "description": "injection is returned only for custom-shaped secrets." + }, + "name": { + "description": "(IDENTIFIER) name ends in the immutable backing ID and never changes with display_name.", + "pattern": "^secrets/[^/]+$", + "type": "string" + }, + "oauthConfig": { + "$ref": "#/components/schemas/OAuthConfig", + "description": "oauth_config is returned only for OAuth-shaped secrets." + }, + "placeholder": { + "description": "placeholder is server-generated per custom secret and stable across value\nrotation; it is not secret material. A client presents it where the\ncredential would go; for the configured hosts the backend replaces the\nconfigured header's value at egress regardless of what was sent.", + "type": "string" + }, + "scopes": { + "description": "scopes are non-secret OAuth scopes.", + "items": { + "type": "string" + }, + "type": "array" + }, + "serviceType": { + "description": "service_type identifies the consuming service.", + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/SecretType", + "description": "type identifies the stored material shape." + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing backing ID, equal to the resource name's terminal segment.", + "minLength": 1, + "readOnly": true, + "type": [ + "string" + ] + }, + "updatedAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "updated_at is the last update timestamp." + } + }, + "required": [ + "uid", + "name", + "createdAt", + "updatedAt", + "etag" + ], + "title": "Secret", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Secret/" + }, + { + "name": "SecretType", + "pointer": "/components/schemas/SecretType", + "schema": { + "description": "The stored credential shape: token, OAuth refresh material, custom injection, registry credentials, or a credential resolved from an approved host-owned source. Secret material is never returned.", + "enum": [ + "unspecified", + "token", + "oauthRefresh", + "custom", + "registryV2", + "hostResolved" + ], + "title": "SecretType", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/SecretType/" + }, + { + "name": "SignalResponse", + "pointer": "/components/schemas/SignalResponse", + "schema": { + "description": "SignalResponse has no fields.", + "title": "SignalResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/SignalResponse/" + }, + { + "name": "Snapshot", + "pointer": "/components/schemas/Snapshot", + "schema": { + "description": "Snapshot is the detailed snapshot view.\nuid must equal the immutable resource ID in name", + "properties": { + "captureMode": { + "$ref": "#/components/schemas/CaptureMode", + "description": "capture_mode is the mode the snapshot was captured with." + }, + "createdAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "created_at is the creation timestamp." + }, + "description": { + "description": "description is caller-supplied text.", + "type": "string" + }, + "displayName": { + "description": "display_name is a scoped label and never selects the resource.", + "type": "string" + }, + "etag": { + "description": "etag identifies the observed version of this resource. It is opaque and strong,\nchanges on every visible change, and is what a mutation sends as its precondition.", + "minLength": 1, + "pattern": "^\"[^\"\\x00-\\x20\\x7f]*\"$", + "readOnly": true, + "type": "string" + }, + "failure": { + "$ref": "#/components/schemas/Error", + "description": "failure is set when status is FAILED." + }, + "name": { + "description": "(IDENTIFIER) name ends in the immutable backing ID and never changes with display_name.", + "pattern": "^snapshots/[^/]+$", + "type": "string" + }, + "platform": { + "$ref": "#/components/schemas/Platform", + "description": "platform is the captured sandbox platform." + }, + "resources": { + "$ref": "#/components/schemas/Resources", + "description": "resources describes the captured sandbox resources." + }, + "sandbox": { + "description": "sandbox is the resource name recorded for this reference.", + "type": "string" + }, + "sandboxUid": { + "description": "sandbox_uid retains the observed backing incarnation when the backend provides one.", + "readOnly": true, + "type": [ + "string", + "null" + ] + }, + "status": { + "$ref": "#/components/schemas/SnapshotStatus", + "description": "status is the snapshot readiness state.", + "not": { + "enum": [ + "unspecified" + ] + }, + "readOnly": true + }, + "totalSizeBytes": { + "description": "total_size_bytes is the approximate stored snapshot size.", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing backing ID, equal to the resource name's terminal segment.", + "minLength": 1, + "readOnly": true, + "type": [ + "string" + ] + } + }, + "required": [ + "uid", + "name", + "status", + "createdAt", + "etag" + ], + "title": "Snapshot", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Snapshot/" + }, + { + "name": "SnapshotStatus", + "pointer": "/components/schemas/SnapshotStatus", + "schema": { + "description": "SnapshotStatus is snapshot readiness state.\n\nValues:\nunspecified: unspecified is never a concrete known state.\ncreating: creating means capture has not completed.\nready: ready means the snapshot can be restored.\nfailed: failed means capture reached a terminal failure.\ndeleted: deleted means the backend exposes a retained delete tombstone.", + "enum": [ + "unspecified", + "creating", + "ready", + "failed", + "deleted" + ], + "title": "SnapshotStatus", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/SnapshotStatus/" + }, + { + "name": "SnapshotSummary", + "pointer": "/components/schemas/SnapshotSummary", + "schema": { + "description": "SnapshotSummary is the list view of a snapshot.\nuid must equal the immutable resource ID in name", + "properties": { + "captureMode": { + "$ref": "#/components/schemas/CaptureMode", + "description": "capture_mode is the mode the snapshot was captured with." + }, + "createdAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "created_at is the creation timestamp." + }, + "displayName": { + "description": "display_name is a scoped label and never selects the resource.", + "type": "string" + }, + "name": { + "description": "name ends in the immutable backing ID and never changes with display_name.", + "pattern": "^snapshots/[^/]+$", + "type": "string" + }, + "sandbox": { + "description": "sandbox is the resource name recorded for this reference.", + "type": "string" + }, + "sandboxUid": { + "description": "sandbox_uid retains the observed backing incarnation when the backend provides one.", + "readOnly": true, + "type": [ + "string", + "null" + ] + }, + "status": { + "$ref": "#/components/schemas/SnapshotStatus", + "description": "status is the snapshot readiness state.", + "not": { + "enum": [ + "unspecified" + ] + } + }, + "totalSizeBytes": { + "description": "total_size_bytes is the approximate stored snapshot size.", + "format": "int64", + "type": [ + "integer", + "string" + ] + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing backing ID, equal to the resource name's terminal segment.", + "minLength": 1, + "readOnly": true, + "type": [ + "string" + ] + } + }, + "required": [ + "uid", + "name", + "status", + "createdAt" + ], + "title": "SnapshotSummary", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/SnapshotSummary/" + }, + { + "name": "StartupArgv", + "pointer": "/components/schemas/StartupArgv", + "schema": { + "additionalProperties": false, + "description": "StartupArgv preserves literal arguments, including empty positional arguments.\nstartup argv requires a nonempty executable", + "properties": { + "argv": { + "description": "argv is executed without shell expansion. It carries at least one element,\nand that first element is the executable and must not be empty.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "argv" + ], + "title": "StartupArgv", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/StartupArgv/" + }, + { + "name": "StartupExecution", + "pointer": "/components/schemas/StartupExecution", + "schema": { + "description": "StartupExecution retains the accepted execution promise across fresh boots.\nIt is ordinary create input.", + "oneOf": [ + { + "properties": { + "rawImage": { + "$ref": "#/components/schemas/RawImageStartup", + "description": "raw_image executes image commands using OCI identity and directory defaults." + } + }, + "required": [ + "rawImage" + ], + "title": "raw_image", + "type": "object" + } + ], + "title": "StartupExecution", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/StartupExecution/" + }, + { + "name": "StopMcpGatewayResponse", + "pointer": "/components/schemas/StopMcpGatewayResponse", + "schema": { + "description": "StopMcpGatewayResponse may retain the fenced desired configuration without claiming a live gateway.", + "title": "StopMcpGatewayResponse", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/StopMcpGatewayResponse/" + }, + { + "name": "StopMemoryOutcome", + "pointer": "/components/schemas/StopMemoryOutcome", + "schema": { + "description": "StopMemoryOutcome records the stop/start guarantee independently of location.\n\nValues:\nunspecified: unspecified is not an advertised or accepted guarantee.\ndiscard: discard retains disk and starts a fresh process tree.\npreserve: preserve restores the stopped process tree on start.", + "enum": [ + "unspecified", + "discard", + "preserve" + ], + "title": "StopMemoryOutcome", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/StopMemoryOutcome/" + }, + { + "name": "StoredSecretOptions", + "pointer": "/components/schemas/StoredSecretOptions", + "schema": { + "additionalProperties": false, + "description": "StoredSecretOptions resolves owner-scoped references before the workload can run.", + "properties": { + "secrets": { + "description": "secrets are complete Secret resource names resolved once at admission.", + "items": { + "pattern": "^secrets/[^/]+$", + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "secrets" + ], + "title": "StoredSecretOptions", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/StoredSecretOptions/" + }, + { + "name": "StreamType", + "pointer": "/components/schemas/StreamType", + "schema": { + "description": "StreamType identifies the source of an output chunk.\n\nValues:\nunspecified: unspecified is not a concrete output stream.\nstdout: stdout is stdout.\nstderr: stderr is stderr.\npty: pty is merged PTY output.", + "enum": [ + "unspecified", + "stdout", + "stderr", + "pty" + ], + "title": "StreamType", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/StreamType/" + }, + { + "name": "TerminalSize", + "pointer": "/components/schemas/TerminalSize", + "schema": { + "additionalProperties": false, + "description": "TerminalSize is a terminal rows/columns pair; 1 through 65535 is the portable range.\nbounded requires rows and cols in 1..65535", + "properties": { + "bounded": { + "description": "bounded requests the portable range enforced on this size, with no opt in\nto perform first. Unset or false keeps the unenforced behavior.", + "type": "boolean" + }, + "cols": { + "description": "cols is the terminal column count.", + "type": "integer" + }, + "rows": { + "description": "rows is the terminal row count.", + "type": "integer" + } + }, + "title": "TerminalSize", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/TerminalSize/" + }, + { + "name": "TimeoutAction", + "pointer": "/components/schemas/TimeoutAction", + "schema": { + "description": "TimeoutAction selects the lifecycle action taken at the reported deadline.\n\nValues:\nunspecified: unspecified is invalid when explicitly supplied.\ndelete: delete deletes the sandbox at expiry.\nstop: stop applies the sandbox's persisted stop guarantee at expiry.\nkeep: Deprecated alias for the restart action, still accepted on input and output. New clients should use the canonical restart action.\nrestart: Preserves memory through backend-managed stop/resume cycles at expiry. Requires memory preservation and the always-on entitlement.", + "enum": [ + "unspecified", + "delete", + "stop", + "keep", + "restart" + ], + "title": "TimeoutAction", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/TimeoutAction/" + }, + { + "name": "TimeoutOptions", + "pointer": "/components/schemas/TimeoutOptions", + "schema": { + "additionalProperties": false, + "description": "TimeoutOptions selects deadline behavior; presence enables this feature for the sandbox.\nan explicit RESTART (or its deprecated alias KEEP) initial timeout must be at least one hour", + "properties": { + "autoResume": { + "description": "Omission selects the advertised default; false does not disable RESTART or KEEP cycles.", + "type": [ + "boolean", + "null" + ] + }, + "onTimeout": { + "description": "on_timeout defaults to DELETE; an explicit UNSPECIFIED is invalid.", + "not": { + "enum": [ + "unspecified" + ] + }, + "oneOf": [ + { + "$ref": "#/components/schemas/TimeoutAction" + }, + { + "type": "null" + } + ] + }, + "timeout": { + "$ref": "#/components/schemas/Duration", + "description": "timeout is the initial TTL; omission selects the advertised action default." + } + }, + "title": "TimeoutOptions", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/TimeoutOptions/" + }, + { + "name": "Timestamp", + "pointer": "/components/schemas/Timestamp", + "schema": { + "description": "An RFC 3339 timestamp in UTC, for example 2026-01-02T03:04:05Z.", + "examples": [ + "2023-01-15T01:30:15.01Z", + "2024-12-25T12:00:00Z" + ], + "format": "date-time", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/Timestamp/" + }, + { + "name": "TokenSecretMaterial", + "pointer": "/components/schemas/TokenSecretMaterial", + "schema": { + "additionalProperties": false, + "description": "TokenSecretMaterial is opaque token material.", + "properties": { + "value": { + "description": "value is the secret token.", + "minLength": 1, + "type": "string", + "writeOnly": true + } + }, + "required": [ + "value" + ], + "title": "TokenSecretMaterial", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/TokenSecretMaterial/" + }, + { + "name": "UnknownErrorDetail", + "pointer": "/components/schemas/UnknownErrorDetail", + "schema": { + "additionalProperties": true, + "description": "A structured error detail identified by @type. Its decoded JSON fields appear beside the type URL.", + "properties": { + "@type": { + "not": { + "enum": [ + "type.googleapis.com/google.rpc.BadRequest", + "type.googleapis.com/google.rpc.DebugInfo", + "type.googleapis.com/google.rpc.ErrorInfo", + "type.googleapis.com/google.rpc.Help", + "type.googleapis.com/google.rpc.LocalizedMessage", + "type.googleapis.com/google.rpc.PreconditionFailure", + "type.googleapis.com/google.rpc.QuotaFailure", + "type.googleapis.com/google.rpc.RequestInfo", + "type.googleapis.com/google.rpc.ResourceInfo", + "type.googleapis.com/google.rpc.RetryInfo", + "type.googleapis.com/buf.validate.Violations", + "type.googleapis.com/docker.sandboxes.v1.EtagMismatch", + "type.googleapis.com/docker.sandboxes.v1.KitFieldOutcomeReport", + "type.googleapis.com/docker.sandboxes.v1.McpConfigurationReport" + ] + }, + "type": "string" + } + }, + "required": [ + "@type" + ], + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/UnknownErrorDetail/" + }, + { + "name": "UpdateSecretBody", + "pointer": "/components/schemas/UpdateSecretBody", + "schema": { + "allOf": [ + { + "properties": { + "serviceType": { + "description": "service_type identifies the consuming service.", + "type": "string" + } + } + }, + { + "oneOf": [ + { + "properties": { + "custom": { + "$ref": "#/components/schemas/CustomSecretMaterial", + "description": "custom stores an opaque value with caller-authored injection metadata.\nUpdateSecretRequest.service_type is server-assigned for custom\nmaterial; leave it empty." + } + }, + "required": [ + "custom" + ], + "title": "custom", + "type": "object" + }, + { + "properties": { + "oauth": { + "$ref": "#/components/schemas/OAuthRefreshMaterial", + "description": "oauth stores OAuth refresh material." + } + }, + "required": [ + "oauth" + ], + "title": "oauth", + "type": "object" + }, + { + "properties": { + "token": { + "$ref": "#/components/schemas/TokenSecretMaterial", + "description": "token stores opaque token material." + } + }, + "required": [ + "token" + ], + "title": "token", + "type": "object" + } + ] + } + ], + "description": "UpdateSecretRequest replaces secret material.\nservice_type must be empty for custom material (server-assigned)", + "title": "UpdateSecretRequest", + "type": "object", + "unevaluatedProperties": false + }, + "url": "/reference/api/sandboxes/latest/schemas/UpdateSecretBody/" + }, + { + "name": "ValidationFieldPath", + "pointer": "/components/schemas/ValidationFieldPath", + "schema": { + "description": "A path to a field, including any parent fields.", + "properties": { + "elements": { + "description": "`elements` contains each element of the path, starting from the root and recursing downward.", + "items": { + "$ref": "#/components/schemas/ValidationFieldPathElement" + }, + "type": "array" + } + }, + "title": "FieldPath", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ValidationFieldPath/" + }, + { + "name": "ValidationFieldPathElement", + "pointer": "/components/schemas/ValidationFieldPathElement", + "schema": { + "allOf": [ + { + "properties": { + "fieldName": { + "description": "`field_name` contains the field name this path element refers to.\nThis can be used to display a human-readable path even if the field number is unknown.", + "type": [ + "string", + "null" + ] + }, + "fieldNumber": { + "description": "`field_number` is the field number this path element refers to.", + "format": "int32", + "type": [ + "integer", + "null" + ] + }, + "fieldType": { + "description": "The type of the field that failed validation.", + "oneOf": [ + { + "$ref": "#/components/schemas/ValidationFieldType" + }, + { + "type": "null" + } + ] + }, + "keyType": { + "description": "`key_type` specifies the map key type of this field. This value is useful when traversing\nunknown fields through wire data: specifically, it allows handling the differences between\ndifferent integer encodings.", + "oneOf": [ + { + "$ref": "#/components/schemas/ValidationFieldType" + }, + { + "type": "null" + } + ] + }, + "valueType": { + "description": "`value_type` specifies map value type of this field. This is useful if you want to display a\nvalue inside unknown fields through wire data.", + "oneOf": [ + { + "$ref": "#/components/schemas/ValidationFieldType" + }, + { + "type": "null" + } + ] + } + } + }, + { + "oneOf": [ + { + "properties": { + "boolKey": { + "description": "`bool_key` specifies a map key of type bool.", + "type": "boolean" + } + }, + "required": [ + "boolKey" + ], + "title": "bool_key", + "type": "object" + }, + { + "properties": { + "index": { + "description": "`index` specifies a 0-based index into a repeated field.", + "format": "int64", + "type": [ + "integer", + "string" + ] + } + }, + "required": [ + "index" + ], + "title": "index", + "type": "object" + }, + { + "properties": { + "intKey": { + "description": "`int_key` specifies a map key of type int32, int64, sint32, sint64, sfixed32 or sfixed64.", + "format": "int64", + "type": [ + "integer", + "string" + ] + } + }, + "required": [ + "intKey" + ], + "title": "int_key", + "type": "object" + }, + { + "properties": { + "stringKey": { + "description": "`string_key` specifies a map key of type string.", + "type": "string" + } + }, + "required": [ + "stringKey" + ], + "title": "string_key", + "type": "object" + }, + { + "properties": { + "uintKey": { + "description": "`uint_key` specifies a map key of type uint32, uint64, fixed32 or fixed64.", + "format": "int64", + "type": [ + "integer", + "string" + ] + } + }, + "required": [ + "uintKey" + ], + "title": "uint_key", + "type": "object" + } + ] + } + ], + "description": "One field in a validation path. For a map or list, the subscript identifies the selected element.", + "title": "FieldPathElement", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ValidationFieldPathElement/" + }, + { + "name": "ValidationFieldType", + "pointer": "/components/schemas/ValidationFieldType", + "schema": { + "enum": [ + "TYPE_DOUBLE", + "TYPE_FLOAT", + "TYPE_INT64", + "TYPE_UINT64", + "TYPE_INT32", + "TYPE_FIXED64", + "TYPE_FIXED32", + "TYPE_BOOL", + "TYPE_STRING", + "TYPE_GROUP", + "TYPE_MESSAGE", + "TYPE_BYTES", + "TYPE_UINT32", + "TYPE_ENUM", + "TYPE_SFIXED32", + "TYPE_SFIXED64", + "TYPE_SINT32", + "TYPE_SINT64" + ], + "title": "Type", + "type": "string" + }, + "url": "/reference/api/sandboxes/latest/schemas/ValidationFieldType/" + }, + { + "name": "ValidationViolation", + "pointer": "/components/schemas/ValidationViolation", + "schema": { + "description": "A validation failure, with the affected field, rule, and a human-readable message.", + "properties": { + "field": { + "description": "The field that failed validation, including its parent fields.", + "oneOf": [ + { + "$ref": "#/components/schemas/ValidationFieldPath" + }, + { + "type": "null" + } + ] + }, + "forKey": { + "description": "`for_key` indicates whether the violation was caused by a map key, rather than a value.", + "type": [ + "boolean", + "null" + ] + }, + "message": { + "description": "`message` is a human-readable error message that describes the nature of the violation.\nThis can be the default error message from the violated `Rule`, or it can be a custom message that gives more context about the violation.", + "type": [ + "string", + "null" + ] + }, + "rule": { + "description": "The validation rule that failed.", + "oneOf": [ + { + "$ref": "#/components/schemas/ValidationFieldPath" + }, + { + "type": "null" + } + ] + }, + "ruleId": { + "description": "`rule_id` is the unique identifier of the `Rule` that was not fulfilled.\nThis is the same `id` that was specified in the `Rule` message, allowing easy tracing of which rule was violated.", + "type": [ + "string", + "null" + ] + } + }, + "title": "Violation", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ValidationViolation/" + }, + { + "name": "ValidationViolations", + "pointer": "/components/schemas/ValidationViolations", + "schema": { + "description": "The validation failures returned for a request.", + "properties": { + "violations": { + "description": "`violations` is a repeated field that contains all the `Violation` messages corresponding to the violations detected.", + "items": { + "$ref": "#/components/schemas/ValidationViolation" + }, + "type": "array" + } + }, + "title": "Violations", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ValidationViolations/" + }, + { + "name": "ValidationViolationsErrorDetail", + "pointer": "/components/schemas/ValidationViolationsErrorDetail", + "schema": { + "description": "The validation failures returned for a request.", + "properties": { + "@type": { + "const": "type.googleapis.com/buf.validate.Violations", + "type": "string" + }, + "violations": { + "description": "`violations` is a repeated field that contains all the `Violation` messages corresponding to the violations detected.", + "items": { + "$ref": "#/components/schemas/ValidationViolation" + }, + "type": "array" + } + }, + "required": [ + "@type" + ], + "title": "ViolationsErrorDetail", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/ValidationViolationsErrorDetail/" + }, + { + "name": "Volume", + "pointer": "/components/schemas/Volume", + "schema": { + "description": "Volume is persistent storage metadata within its owner and contract scope.\nuid must equal the immutable resource ID in name", + "properties": { + "createdAt": { + "$ref": "#/components/schemas/Timestamp", + "description": "created_at is the creation timestamp." + }, + "displayName": { + "description": "display_name is a scoped label and never selects the resource.", + "type": "string" + }, + "etag": { + "description": "etag identifies the observed version of this resource. It is opaque and strong,\nchanges on every visible change, and is what a mutation sends as its precondition.", + "minLength": 1, + "pattern": "^\"[^\"\\x00-\\x20\\x7f]*\"$", + "readOnly": true, + "type": "string" + }, + "name": { + "description": "(IDENTIFIER) name ends in the immutable backing ID and never changes with display_name.", + "pattern": "^volumes/[^/]+$", + "type": "string" + }, + "uid": { + "description": "(IMMUTABLE) uid is the existing backing ID, equal to the resource name's terminal segment.", + "minLength": 1, + "readOnly": true, + "type": [ + "string" + ] + } + }, + "required": [ + "uid", + "name", + "createdAt", + "etag" + ], + "title": "Volume", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/Volume/" + }, + { + "name": "VolumeAttachment", + "pointer": "/components/schemas/VolumeAttachment", + "schema": { + "additionalProperties": false, + "description": "VolumeAttachment binds an existing owner-scoped volume before guest execution.", + "properties": { + "mode": { + "$ref": "#/components/schemas/AttachmentMode", + "description": "mode defaults to exclusive; it never silently enables shared writers." + }, + "target": { + "description": "target is an absolute guest path and cannot overlap another mount target.", + "minLength": 1, + "type": "string" + }, + "volume": { + "description": "volume is the complete resource name, in the form volumes/{volume}.", + "pattern": "^volumes/[^/]+$", + "type": "string" + } + }, + "required": [ + "volume", + "target" + ], + "title": "VolumeAttachment", + "type": "object" + }, + "url": "/reference/api/sandboxes/latest/schemas/VolumeAttachment/" + } + ], + "securitySchemes": { + "bearer": { + "description": "A bearer credential is required for every HTTP request. Management operations use an API credential; sandbox endpoint operations use an issued credential scoped to the sandbox, audience and permitted actions.", + "scheme": "bearer", + "type": "http" + }, + "sandboxBearer": { + "description": "A short-lived bearer issued by createEndpointCredential for this sandbox, audience and explicit permissions. Management credentials are not accepted.", + "scheme": "bearer", + "type": "http" + }, + "sandboxWebSocketBearer": { + "description": "Sandbox-scoped credential encoded in the non-echoed subprotocol offer declared by x-websocket. Offer the API subprotocol alongside it; use this carrier only when endpoint discovery advertises webSocketSubprotocol. Never combine it with Authorization.", + "in": "header", + "name": "Sec-WebSocket-Protocol", + "type": "apiKey" + } + }, + "servers": [ + { + "description": "The API base URL. Append the /v1 paths while preserving this URL's path prefix.", + "url": "https://connect.docker.com/sandboxes" + } + ], + "source": "content/reference/api/sandboxes/api.yaml", + "sourceURL": "/reference/api/sandboxes/api.yaml", + "tags": [ + { + "description": "Read, write, copy, and manage files inside a sandbox.", + "kind": "nav", + "name": "Files", + "summary": "Files", + "x-displayName": "Files" + }, + { + "description": "Run commands and interact with processes inside a sandbox.", + "kind": "nav", + "name": "Processes", + "summary": "Processes", + "x-displayName": "Processes" + }, + { + "description": "Exchange credentials for the authenticated owner.", + "kind": "nav", + "name": "Credentials", + "summary": "Credentials", + "x-displayName": "Credentials" + }, + { + "description": "Manage images used to create sandboxes.", + "kind": "nav", + "name": "Images", + "summary": "Images", + "x-displayName": "Images" + }, + { + "description": "Configure MCP gateways and authorize upstream servers.", + "kind": "nav", + "name": "MCP gateways", + "summary": "MCP gateways", + "x-displayName": "MCP gateways" + }, + { + "description": "Read enforced outbound network policies and their decision logs.", + "kind": "nav", + "name": "Network policies", + "summary": "Network policies", + "x-displayName": "Network policies" + }, + { + "description": "Create sandboxes and manage their lifecycle, ports, and SSH access.", + "kind": "nav", + "name": "Sandboxes", + "summary": "Sandboxes", + "x-displayName": "Sandboxes" + }, + { + "description": "Store credentials and read their metadata without returning secret material.", + "kind": "nav", + "name": "Secrets", + "summary": "Secrets", + "x-displayName": "Secrets" + }, + { + "description": "Capture sandbox state and restore it into a new sandbox.", + "kind": "nav", + "name": "Snapshots", + "summary": "Snapshots", + "x-displayName": "Snapshots" + }, + { + "description": "Manage persistent storage and attach it to sandboxes.", + "kind": "nav", + "name": "Volumes", + "summary": "Volumes", + "x-displayName": "Volumes" + } + ], + "title": "Docker Sandboxes", + "url": "/reference/api/sandboxes/latest/", + "version": "v1" + } + ], + "legacyAPIs": [ + { + "connection": "unix", + "description": "Manage containers, images, networks, and volumes.", + "title": "Docker Engine", + "url": "/reference/api/engine/" + } + ], + "modelVersion": 1 +} diff --git a/docker-bake.hcl b/docker-bake.hcl index b693439a542d..7ecf5517b05e 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -40,7 +40,7 @@ target "release" { } group "validate" { - targets = ["lint", "test", "unused-media", "test-go-redirects", "dockerfile-lint", "validate-vendor"] + targets = ["lint", "test", "unused-media", "test-go-redirects", "dockerfile-lint", "validate-vendor", "validate-api-reference"] } target "test" { @@ -169,6 +169,12 @@ target "validate-vendor" { output = ["type=cacheonly"] } +target "validate-api-reference" { + target = "validate-api-reference" + output = ["type=cacheonly"] + provenance = false +} + variable "UPSTREAM_MODULE_NAME" { default = null } @@ -188,4 +194,4 @@ target "validate-upstream" { target = "validate-upstream" output = ["type=cacheonly"] provenance = false -} \ No newline at end of file +} diff --git a/hack/api-docs/README.md b/hack/api-docs/README.md index 4cbf7a4303f3..d6d49fd0944a 100644 --- a/hack/api-docs/README.md +++ b/hack/api-docs/README.md @@ -1,31 +1,41 @@ # API reference build -This tool validates the Hub, DVP, Registry, and AI Governance OpenAPI sources +This tool validates the Hub, DVP, Registry, AI Governance, and Sandboxes OpenAPI sources in `content/reference/api/` and generates presentation data for Hugo. Engine retains its existing sources and renderer. ## Commands -Use the Go version declared in `go.mod`, Hugo, and the site's Node dependencies. -From the repository root: +Site builds use the committed `data/api-reference.json`. To build the site, +use Hugo and the site's Node dependencies. From the repository root: ```console $ npm ci -$ ./hack/api-docs/run.sh test -$ ./hack/api-docs/run.sh generate $ hugo server ``` For a static build with HTML/Markdown checks, run `./hack/api-docs/run.sh build`. To serve that build on port 1314, run `./hack/api-docs/run.sh serve`. Set `DOCS_URL` and `DOCS_PORT` when using another -address. Run generation again after changing a specification or source manifest entry. -With `docker compose watch`, changes to the registered specifications or -`hack/api-docs/` rebuild the server image and regenerate the reference. +address. These commands use the committed data without running the generator. + +After changing a specification, source manifest entry, or generator code, use +the Go version declared in `hack/api-docs/go.mod` to regenerate the data. + +Install the Vacuum version pinned in the [Dockerfile](../../Dockerfile) and make +the `vacuum` executable available on `PATH`. The script runs Vacuum and the Go +generator without installing tools. -Docker builds and Netlify deploy previews run generation before Hugo. Generated -data, validation reports, binaries, and local builds go under `tmp/api-reference/`. -Hugo reports an error if the generated data is absent. +```console +$ ./hack/api-docs/run.sh test +$ ./hack/api-docs/run.sh generate +``` + +Commit `data/api-reference.json` with the source changes. With +`docker compose watch`, the regenerated JSON syncs to the server and Hugo +rebuilds the reference. Docker builds and Netlify deploy previews also use the +committed JSON. Validation reports and local builds remain under +`tmp/api-reference/`. ## Processor inputs @@ -56,9 +66,7 @@ relative to each original file, then moves `index.md` files to flattened paths. It preserves code examples and other text. API pages use the same processing as other pages; links that already use published URLs remain unchanged. -The published YAML URLs still serve the source files directly. There is no -conversion step, snapshot dependency, Node migration package, or source archive -in the build. +The published YAML URLs still serve the source files directly. ## Validation @@ -68,10 +76,25 @@ in the build. $ ./hack/api-docs/run.sh check ``` -Generation runs the same strict validation. Any diagnostic fails the build; +Generation runs the same strict validation. Any diagnostic fails generation; there is no exception baseline. Reports are written to `tmp/api-reference/validation.json`. +The build workflow's validation matrix runs API reference checks alongside the +other validation targets. It runs tests, validates the sources, regenerates the +JSON, and compares the result with the committed file to detect stale data. +This matrix entry is advisory: failures do not block site builds or deployment. + +Run the same check locally with Docker: + +```console +$ docker buildx bake validate-api-reference +``` + +This target runs generator tests, strict validation, and a byte-for-byte +comparison inside Docker. It leaves the working tree unchanged and is also +included in the `validate` Bake group. + ## Tests and scope Go fixtures cover dialects, references, recursion, boolean schemas, examples, diff --git a/hack/api-docs/main.go b/hack/api-docs/main.go index 475a2e07f5b1..dccb9eee656b 100644 --- a/hack/api-docs/main.go +++ b/hack/api-docs/main.go @@ -749,7 +749,7 @@ func run() error { return fmt.Errorf("%d blocking diagnostics; see tmp/api-reference/validation.json", blocking) } if command == "generate" { - if e = writeJSON(filepath.Join(out, "data/api-reference.json"), Object{"modelVersion": 1, "apis": models, "legacyAPIs": manifest.LegacyAPIs}); e != nil { + if e = writeJSON(filepath.Join(root, "data/api-reference.json"), Object{"modelVersion": 1, "apis": models, "legacyAPIs": manifest.LegacyAPIs}); e != nil { return e } } diff --git a/hack/api-docs/run.sh b/hack/api-docs/run.sh index e132d20253b0..b079e66754b3 100755 --- a/hack/api-docs/run.sh +++ b/hack/api-docs/run.sh @@ -2,37 +2,24 @@ set -euo pipefail ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd) cd "$ROOT" -BIN="$ROOT/tmp/api-reference/bin" -mkdir -p "$BIN" "$ROOT/tmp/api-reference/reports" +mkdir -p "$ROOT/tmp/api-reference/reports" export GOWORK=off -bootstrap() { - (cd hack/api-docs && go build -o "$BIN/api-docs" .) - if [[ ! -x "$BIN/vacuum-v0.30.3" ]]; then - GOBIN="$BIN" go install github.com/daveshanley/vacuum@v0.30.3 - mv "$BIN/vacuum" "$BIN/vacuum-v0.30.3" - fi +api_docs() { + (cd hack/api-docs && go run . "$@" "$ROOT") } policy() { local sources - sources=$("$BIN/api-docs" sources "$ROOT") + sources=$(api_docs sources) while IFS=$'\t' read -r api source; do - "$BIN/vacuum-v0.30.3" lint --no-update-check --remote=false --ruleset hack/api-docs/validation/rules.yaml --fail-severity error --min-score 0 --no-banner --no-style --details "$source" > "tmp/api-reference/reports/$api-vacuum.txt" 2>&1 || { + vacuum lint --no-update-check --remote=false --ruleset hack/api-docs/validation/rules.yaml --fail-severity error --min-score 0 --no-banner --no-style --details "$source" > "tmp/api-reference/reports/$api-vacuum.txt" 2>&1 || { cat "tmp/api-reference/reports/$api-vacuum.txt"; return 1; } done <<< "$sources" } -generate() { - bootstrap - policy - "$BIN/api-docs" generate "$ROOT" -} case "${1:-build}" in - bootstrap) bootstrap ;; - check) bootstrap; policy; "$BIN/api-docs" check "$ROOT" ;; - generate) generate ;; + check|generate) policy; api_docs "$1" ;; test) (cd hack/api-docs && go test ./...) ;; build|serve) - generate hugo --destination tmp/api-reference/site --baseURL "${DOCS_URL:-http://localhost:1314}" --cleanDestinationDir node hack/flatten-and-resolve.js tmp/api-reference/site node hack/api-docs/verify-output.mjs tmp/api-reference/site @@ -40,5 +27,5 @@ case "${1:-build}" in exec python3 -m http.server "${DOCS_PORT:-1314}" --bind 127.0.0.1 --directory tmp/api-reference/site fi ;; - *) printf '%s\n' 'Usage: run.sh bootstrap|check|generate|test|build|serve' >&2; exit 2 ;; + *) printf '%s\n' 'Usage: run.sh check|generate|test|build|serve' >&2; exit 2 ;; esac diff --git a/hack/api-docs/verify-output.mjs b/hack/api-docs/verify-output.mjs index 3f91e03e2f21..ee6f3ccddd75 100644 --- a/hack/api-docs/verify-output.mjs +++ b/hack/api-docs/verify-output.mjs @@ -4,7 +4,7 @@ import { isDeepStrictEqual } from "node:util"; const root = path.resolve(import.meta.dirname, "../.."); const base = path.resolve(process.argv[2] || "public"); const data = JSON.parse( - fs.readFileSync(path.join(root, "tmp/api-reference/data/api-reference.json")), + fs.readFileSync(path.join(root, "data/api-reference.json")), ); const decode = (s) => s @@ -157,6 +157,7 @@ const bytes = files(path.join(base, "reference/api")).reduce( (n, p) => n + fs.statSync(p).size, 0, ); +fs.mkdirSync(path.join(root, "tmp/api-reference/reports"), { recursive: true }); fs.writeFileSync( path.join(root, "tmp/api-reference/reports/output.json"), JSON.stringify( diff --git a/hack/sandboxes/README.md b/hack/sandboxes/README.md index 8c4eba52be30..f6e0b3d23808 100644 --- a/hack/sandboxes/README.md +++ b/hack/sandboxes/README.md @@ -34,7 +34,8 @@ installation page. The specification is registered in `hack/api-docs/sources.json`. The shared API renderer generates an overview and separate operation and schema pages under `/reference/api/sandboxes/latest/`, in HTML and Markdown. Run -`./hack/api-docs/run.sh generate` before Hugo. Strict validation checks the +`./hack/api-docs/run.sh generate` after importing a specification and commit +`data/api-reference.json` with the source changes. Strict validation checks the specification and its examples. Fix failures upstream and re-import the export. To update, change both commit IDs in `source.json`, review additions or removals diff --git a/hugo.yaml b/hugo.yaml index 4b72eb5aa07e..38dce8194f35 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -329,8 +329,6 @@ module: mounts: - source: data target: data - - source: tmp/api-reference/data - target: data # Mount the assets directory so it doesn't get overwritten - source: assets target: assets diff --git a/netlify.toml b/netlify.toml index 000114a4bb03..45b666756557 100644 --- a/netlify.toml +++ b/netlify.toml @@ -3,7 +3,6 @@ publish = "public" [context.deploy-preview.environment] NODE_VERSION = "24" -GO_VERSION = "1.26.5" NODE_ENV = "production" HUGO_VERSION = "0.163.0" HUGO_ENABLEGITINFO = "true" @@ -11,4 +10,4 @@ HUGO_ENVIRONMENT = "preview" SECRETS_SCAN_OMIT_PATHS = "public/contribute/file-conventions/index.html" [context.deploy-preview] -command = "./hack/api-docs/run.sh generate && hugo --gc --minify -b $DEPLOY_PRIME_URL && node hack/flatten-and-resolve.js && node hack/api-docs/verify-output.mjs && npx pagefind@v1.5.2" +command = "hugo --gc --minify -b $DEPLOY_PRIME_URL && node hack/flatten-and-resolve.js && node hack/api-docs/verify-output.mjs && npx pagefind@v1.5.2"