openapi: 3.0.0
info:
  title: Docker HUB API
  version: beta
  x-logo:
    url: https://docs.docker.com/assets/images/logo-docker-main.png
    href: /reference
  description: |
    Docker Hub is a service provided by Docker for finding and sharing container images with your team.

    It is the world's largest library and community for container images.

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

    Browse through the Docker Hub API documentation to explore the supported endpoints.
servers:
  - description: Docker HUB API
    x-audience: public
    url: https://hub.docker.com
tags:
  - name: resources
    x-displayName: Resources
    description: |
      The following resources are available to interact with the documented API:
      - [Docker Hub CLI tool](https://github.com/docker/hub-tool#readme) (currently experimental)
  - name: rate-limiting
    x-displayName: Rate Limiting
    description: |
      The Docker Hub API is limited on the amount of requests you can perform per minute against it.

      If you haven't hit the limit, each request to the API will return the following headers in the response.

      - `X-RateLimit-Limit` - The limit of requests per minute.
      - `X-RateLimit-Remaining` - The remaining amount of calls within the limit period.
      - `X-RateLimit-Reset` - The unix timestamp of when the remaining resets.

      If you have hit the limit, you will receive a response status of `429` and the `X-Retry-After` header in the response.

      The `X-Retry-After` header is a unix timestamp of when you can call the API again.

      **Note**: These rate limits are separate from anti-abuse and Docker Hub download, or pull rate limiting.
      To learn more about Docker Hub pull rate limiting, see [Usage and limits](https://docs.docker.com/docker-hub/usage/).
  - name: authentication
    x-displayName: Authentication
    description: |
      Most Docker Hub API endpoints require you to authenticate using your Docker credentials before using them.

      Additionally, similar to the Docker Hub UI features, API endpoint responses may vary depending on your plan (Personal, Pro, or Team) and your account's permissions.

      To learn more about the features available in each plan and to upgrade your existing plan, see [Docker Pricing](https://www.docker.com/pricing).
  - name: access-tokens
    x-displayName: Personal Access Tokens
    description: |
      The Personal Access Token endpoints lets you manage personal access tokens. For more information, see [Access Tokens](https://docs.docker.com/security/for-developers/access-tokens/).

      You can use a personal access token instead of a password in the [Docker CLI](https://docs.docker.com/engine/reference/commandline/cli/) or in the [Create an authentication token](#operation/PostUsersLogin) route to obtain a bearer token.

      ### Scopes

      For each scope grouping (in this case "repo"), you only need to define 1 scope as any lower scopes are assumed.
      For example: If you define `repo:write`, the API assumes the scope of both `repo:read` *and* `repo:public_read` as well.
      If you were to define both `repo:write` *and* `repo:read`, then `repo:read` is assumed by `repo:write` and ignored.

      ***Treat your personal access token like your password and keep it secret. You cannot retrieve your token after it is generated.***
  - name: audit-logs
    x-displayName: Audit Logs
    description: |
      The Audit Logs API endpoints allow you to query audit log events across a namespace.

      For more information, see [Audit Log](https://docs.docker.com/admin/organization/activity-logs/).
  - name: org-settings
    x-displayName: Org Settings
    description: |
      The Org Settings API endpoints allow you to manage your organization's settings.
  - name: repositories
    x-displayName: Repositories
    description: |
      The repository endpoints allow you to access your repository's tags.
  - name: orgs
    x-displayName: Organizations
    x-audience: public
    description: |
      The organization endpoints allow you to interact with and manage your organizations.

      For more information, see [Organization administration overview](https://docs.docker.com/admin/organization/).
  - name: groups
    x-displayName: Groups (Teams)
    x-audience: public
    description: |
      The groups endpoints allow you to manage your organization's teams and their members.

      For more information, seee [Create and manage a team](https://docs.docker.com/admin/organization/manage-a-team/).
  - name: invites
    x-displayName: Invites
    x-audience: public
    description: |
      The invites endpoints allow you to manage invites for users to join your Docker organization.

      For more information, see [Invite members](https://docs.docker.com/admin/organization/members/#invite-members).
  - name: scim
    x-displayName: SCIM
    x-audience: public
    description: |
      SCIM is a provisioning system that lets you manage users within your identity provider (IdP).

      For more information, see [System for Cross-domain Identity management](https://docs.docker.com/security/for-admins/provisioning/scim/).
paths:
  /v2/users/login:
    post:
      tags:
        - authentication
      summary: Create an authentication token
      operationId: PostUsersLogin
      description: |
        Creates and returns a bearer token in JWT format that you can use to authenticate with Docker Hub APIs.

        The returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.

        Most Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.

        _**As of September 16, 2024, this route requires a PAT instead of a password if your organization has SSO enforced.**_
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UsersLoginRequest'
        description: Login details.
        required: true
      responses:
        '200':
          description: Authentication successful
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostUsersLoginSuccessResponse'
        '401':
          description: Authentication failed or second factor required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostUsersLoginErrorResponse'
  /v2/users/2fa-login:
    post:
      tags:
        - authentication
      summary: Second factor authentication
      operationId: PostUsers2FALogin
      description: |
        When a user has two-factor authentication (2FA) enabled, this is the second call to perform after `/v2/users/login` call.

        Creates and returns a bearer token in JWT format that you can use to authenticate with Docker Hub APIs.

        The returned token is used in the HTTP Authorization header like `Authorization: Bearer {TOKEN}`.

        Most Docker Hub APIs require this token either to consume or to get detailed information. For example, to list images in a private repository.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Users2FALoginRequest'
        description: Login details.
        required: true
      responses:
        '200':
          description: Authentication successful
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostUsersLoginSuccessResponse'
        '401':
          description: Authentication failed or second factor required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostUsers2FALoginErrorResponse'
  /v2/access-tokens:
    post:
      summary: Create a personal access token
      description: Creates and returns a personal access token.
      tags:
        - access-tokens
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createAccessTokenRequest'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/createAccessTokensResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
    get:
      summary: Get a list of personal access tokens
      description: Returns a paginated list of personal access tokens.
      tags:
        - access-tokens
      parameters:
        - in: query
          name: page
          schema:
            type: number
            default: 1
        - in: query
          name: page_size
          schema:
            type: number
            default: 10
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/getAccessTokensResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v2/access-tokens/{uuid}:
    parameters:
      - in: path
        name: uuid
        required: true
        schema:
          type: string
    patch:
      summary: Update a personal access token
      description: |
        Updates a personal access token partially. You can either update the token's label or enable/disable it.
      tags:
        - access-tokens
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/patchAccessTokenRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/patchAccessTokenResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
    get:
      summary: Get a personal access token
      description: Returns a personal access token by UUID.
      tags:
        - access-tokens
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/accessToken'
                  - type: object
                    properties:
                      token:
                        type: string
                        example: ''
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      summary: Delete a personal access token
      description: |
        Deletes a personal access token permanently. This cannot be undone.
      tags:
        - access-tokens
      responses:
        '204':
          description: A successful response.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /v2/auditlogs/{account}:
    get:
      summary: Returns list of audit log events
      description: Get audit log events for a given namespace.
      operationId: AuditLogs_GetAuditLogs
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAuditLogsResponse'
              examples:
                response:
                  value:
                    logs:
                      - account: docker
                        action: repo.tag.push
                        name: docker/example
                        actor: docker
                        data:
                          digest: sha256:c1ae9c435032a276f80220c7d9b40f76266bbe79243d34f9cda30b76fe114dfa
                          tag: latest
                        timestamp: '2021-02-19T01:34:35Z'
                        action_description: |
                          pushed the tag latest with the digest sha256:c1ae9c435032a to the repository docker/example
        '429':
          description: ''
          content:
            application/json:
              schema: {}
              examples:
                response:
                  value:
                    detail: Rate limit exceeded
                    error: false
        '500':
          description: ''
          content:
            application/json:
              schema: {}
        default:
          description: An unexpected error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/rpcStatus'
      parameters:
        - name: account
          description: Namespace to query audit logs for.
          in: path
          required: true
          schema:
            type: string
        - name: action
          description: |
            action name one of ["repo.tag.push", ...]. Optional parameter to filter specific audit log actions.
          in: query
          required: false
          schema:
            type: string
        - name: name
          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.
          in: query
          required: false
          schema:
            type: string
        - name: actor
          description: |
            actor name. Optional parameter to filter audit log events to the specific user who triggered the event.
          in: query
          required: false
          schema:
            type: string
        - name: from
          description: Start of the time window you wish to query audit events for.
          in: query
          required: false
          schema:
            type: string
            format: date-time
        - name: to
          description: End of the time window you wish to query audit events for.
          in: query
          required: false
          schema:
            type: string
            format: date-time
        - name: page
          description: page - specify page number. Page number to get.
          in: query
          required: false
          schema:
            type: integer
            format: int32
            default: 1
        - name: page_size
          description: page_size - specify page size. Number of events to return per page.
          in: query
          required: false
          schema:
            type: integer
            format: int32
            default: 25
      tags:
        - audit-logs
  /v2/auditlogs/{account}/actions:
    get:
      summary: Returns list of audit log actions
      description: |
        Get audit log actions for a namespace to be used as a filter for querying audit events.
      operationId: AuditLogs_GetAuditActions
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAuditActionsResponse'
              examples:
                response:
                  value:
                    actions:
                      org:
                        actions:
                          - name: team.create
                            description: contains team create events
                            label: Team Created
                          - name: team.delete
                            description: contains team delete events
                            label: Team Deleted
                          - name: team.member.add
                            description: contains team member add events
                            label: Team Member Added
                          - name: team.member.remove
                            description: contains team member remove events
                            label: Team Member Removed
                          - name: team.member.invite
                            description: contains team member invite events
                            label: Team Member Invited
                          - name: member.removed
                            description: contains org member remove events
                            label: Organization Member Removed
                          - name: create
                            description: contains organization create events
                            label: Organization Created
                        label: Organization
                      repo:
                        actions:
                          - name: create
                            description: contains repository create events
                            label: Repository Created
                          - name: delete
                            description: contains repository delete events
                            label: Repository Deleted
                          - name: change_privacy
                            description: contains repository privacy change events
                            label: Privacy Changed
                          - name: tag.push
                            description: contains image tag push events
                            label: Tag Pushed
                          - name: tag.delete
                            description: contains image tag delete events
                            label: Tag Deleted
                        label: Repository
        '429':
          description: ''
          content:
            application/json:
              schema: {}
              examples:
                response:
                  value:
                    detail: Rate limit exceeded
                    error: false
        '500':
          description: ''
          content:
            application/json:
              schema: {}
        default:
          description: An unexpected error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/rpcStatus'
      parameters:
        - name: account
          description: Namespace to query audit log actions for.
          in: path
          required: true
          schema:
            type: string
      tags:
        - audit-logs
  /v2/orgs/{name}/settings:
    parameters:
      - in: path
        name: name
        description: Name of the organization.
        required: true
        schema:
          type: string
    get:
      summary: Get organization settings
      description: |
        Returns organization settings by name.
      tags:
        - org-settings
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/orgSettings'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      summary: Update organization settings
      description: |
        Updates an organization's settings. Some settings are only used when the organization is on a business plan.

        ***Only users with administrative privileges for the organization (owner role) can modify these settings.***

        The following settings are only used on a business plan:
        - `restricted_images`
      tags:
        - org-settings
      requestBody:
        content:
          application/json:
            schema:
              required:
                - restricted_images
              properties:
                restricted_images:
                  allOf:
                    - $ref: '#/components/schemas/restricted_images'
                    - type: object
                      required:
                        - enabled
                        - allow_official_images
                        - allow_verified_publishers
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/orgSettings'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /v2/namespaces/{namespace}/repositories/{repository}/tags:
    parameters:
      - $ref: '#/components/parameters/namespace'
      - $ref: '#/components/parameters/repository'
    get:
      summary: List repository tags
      tags:
        - repositories
      parameters:
        - in: query
          name: page
          required: false
          schema:
            type: integer
          description: Page number to get. Defaults to 1.
        - in: query
          name: page_size
          required: false
          schema:
            type: integer
          description: Number of items to get per page. Defaults to 10. Max of 100.
      responses:
        '200':
          $ref: '#/components/responses/list_tags'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
    head:
      summary: Check repository tags
      tags:
        - repositories
      responses:
        '200':
          description: Repository contains tags
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /v2/namespaces/{namespace}/repositories/{repository}/tags/{tag}:
    parameters:
      - $ref: '#/components/parameters/namespace'
      - $ref: '#/components/parameters/repository'
      - $ref: '#/components/parameters/tag'
    get:
      summary: Read repository tag
      tags:
        - repositories
      responses:
        '200':
          $ref: '#/components/responses/get_tag'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
    head:
      summary: Check repository tag
      tags:
        - repositories
      responses:
        '200':
          description: Repository tag exists
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /v2/orgs/{org_name}/members:
    x-audience: public
    parameters:
      - $ref: '#/components/parameters/org_name'
      - $ref: '#/components/parameters/search'
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/page_size'
      - $ref: '#/components/parameters/invites'
      - $ref: '#/components/parameters/type'
      - $ref: '#/components/parameters/role'
    get:
      summary: List org members
      description: |
        Returns a list of members for an organization"
      tags:
        - orgs
      responses:
        '200':
          description: List of members
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/org_member_paginated'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
  /v2/orgs/{org_name}/members/export:
    x-audience: public
    parameters:
      - $ref: '#/components/parameters/org_name'
    get:
      summary: Export org members CSV
      description: |
        Export members of an organization as a CSV
      tags:
        - orgs
      responses:
        '200':
          description: Exported members
          content:
            text/csv:
              schema:
                type: array
                items:
                  type: object
                  required:
                    - Name
                    - Username
                    - Email
                    - Type
                    - Role
                    - Date Joined
                  properties:
                    Name:
                      type: string
                      description: First and last name of the member
                    Username:
                      type: string
                      description: Username of the member
                    Email:
                      type: string
                      description: Email address of the member
                    Type:
                      type: string
                      description: Type of the member
                      enum:
                        - Invitee
                        - User
                    Permission:
                      type: string
                      description: Permission of the member
                      enum:
                        - Owner
                        - Member
                    Teams:
                      type: string
                      description: Comma-separated list of teams the member is part of
                      example: team-1, team-2
                    Date Joined:
                      type: string
                      description: Date the member joined the organization
                      example: 2020-01-01 15:00:51.193355 +0000 UTC
          headers:
            Content-Disposition:
              schema:
                type: string
              example: attachment;filename="{org_name}-members-{timestamp}.csv"
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
  /v2/orgs/{org_name}/members/{username}:
    x-audience: public
    parameters:
      - $ref: '#/components/parameters/org_name'
      - $ref: '#/components/parameters/username'
    put:
      summary: Update org member (role)
      description: |
        Updates the role of a member in the organization.
        ***Only users in the "owners" group of the organization can use this endpoint.***
      tags:
        - orgs
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - role
              properties:
                role:
                  type: string
                  description: Role of the member
                  enum:
                    - owner
                    - editor
                    - member
      responses:
        '200':
          description: Member role updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/org_member'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
    delete:
      summary: Remove member from org
      description: |
        Removes the member from the org, ie. all groups in the org, unless they're the last owner
      tags:
        - orgs
      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'
  /v2/orgs/{org_name}/invites:
    x-audience: public
    parameters:
      - $ref: '#/components/parameters/org_name'
    get:
      summary: List org invites
      description: |
        Return all pending invites for a given org, only team owners can call this endpoint
      tags:
        - invites
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/invite'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
  /v2/orgs/{org_name}/groups:
    x-audience: public
    parameters:
      - $ref: '#/components/parameters/org_name'
    get:
      summary: Get groups of an organization
      tags:
        - groups
      parameters:
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/page_size'
        - in: query
          name: username
          schema:
            type: string
          description: Get groups for the specified username in the organization.
        - in: query
          name: search
          schema:
            type: string
          description: Get groups for the specified group in the organization.
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                properties:
                  count:
                    type: number
                    example: 1
                  next:
                    type: string
                    example: null
                  previous:
                    type: string
                    example: null
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/org_group'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
    post:
      summary: Create a new group
      description: Create a new group within an organization.
      tags:
        - groups
      requestBody:
        content:
          application/json:
            schema:
              required:
                - name
              properties:
                name:
                  type: string
                description:
                  type: string
      responses:
        '201':
          description: Group created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/org_group'
        '400':
          $ref: '#/components/responses/bad_request'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
  /v2/orgs/{org_name}/groups/{group_name}:
    x-audience: public
    parameters:
      - $ref: '#/components/parameters/org_name'
      - $ref: '#/components/parameters/group_name'
    get:
      summary: Get a group of an organization
      tags:
        - groups
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/org_group'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
    put:
      summary: Update the details for an organization group
      tags:
        - groups
      requestBody:
        content:
          application/json:
            schema:
              required:
                - name
              properties:
                name:
                  type: string
                description:
                  type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/org_group'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
    patch:
      summary: Update some details for an organization group
      tags:
        - groups
      requestBody:
        content:
          application/json:
            schema:
              properties:
                name:
                  type: string
                description:
                  type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/org_group'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
    delete:
      summary: Delete an organization group
      tags:
        - groups
      responses:
        '204':
          description: Group deleted successfully
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
  /v2/orgs/{org_name}/groups/{group_name}/members:
    x-audience: public
    get:
      parameters:
        - $ref: '#/components/parameters/org_name'
        - $ref: '#/components/parameters/group_name'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/page_size'
        - in: query
          name: search
          schema:
            type: string
          description: Search members by username, full_name or email.
      summary: List members of a group
      description: |
        List the members (users) that are in a group.
        If user is owner of the org or has otherwise elevated permissions, they can search by email and the result will also contain emails.
      tags:
        - groups
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                properties:
                  count:
                    type: number
                    example: 1
                  next:
                    type: string
                    example: null
                  previous:
                    type: string
                    example: null
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/group_member'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
    post:
      parameters:
        - $ref: '#/components/parameters/org_name'
        - $ref: '#/components/parameters/group_name'
      summary: Adds a member to a group
      tags:
        - groups
      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'
  /v2/orgs/{org_name}/groups/{group_name}/members/{username}:
    x-audience: public
    parameters:
      - $ref: '#/components/parameters/org_name'
      - $ref: '#/components/parameters/group_name'
      - $ref: '#/components/parameters/username'
    delete:
      summary: Removes a user from a group
      tags:
        - groups
      responses:
        '204':
          description: User removed successfully
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
  /v2/invites/{id}:
    x-audience: public
    parameters:
      - in: path
        name: id
        required: true
        schema:
          type: string
    delete:
      summary: Cancel an invite
      description: |
        Mark the invite as cancelled so it doesn't show up on the list of pending invites
      tags:
        - invites
      responses:
        '204':
          description: ''
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
  /v2/invites/{id}/resend:
    x-audience: public
    parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
    patch:
      summary: Resend an invite
      description: |
        Resend a pending invite to the user, any org owner can resend an invite
      tags:
        - invites
      responses:
        '204':
          description: ''
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/not_found'
  /v2/invites/bulk:
    x-audience: public
    parameters:
      - $ref: '#/components/parameters/bulk_invite'
    post:
      summary: Bulk create invites
      description: |
        Create multiple invites by emails or DockerIDs. Only a team owner can create invites.
      tags:
        - invites
      requestBody:
        $ref: '#/components/requestBodies/bulk_invite_request'
      responses:
        '202':
          description: Accepted
          content:
            application/json:
              schema:
                type: object
                properties:
                  invitees:
                    $ref: '#/components/schemas/bulk_invite'
        '400':
          $ref: '#/components/responses/bad_request'
        '409':
          $ref: '#/components/responses/conflict'
  /v2/scim/2.0/ServiceProviderConfig:
    x-audience: public
    get:
      summary: Get service provider config
      description: |
        Returns a service provider config for Docker's configuration.
      tags:
        - scim
      security:
        - bearerSCIMAuth: []
      responses:
        '200':
          $ref: '#/components/responses/scim_get_service_provider_config_resp'
        '401':
          $ref: '#/components/responses/scim_unauthorized'
        '500':
          $ref: '#/components/responses/scim_error'
  /v2/scim/2.0/ResourceTypes:
    x-audience: public
    get:
      summary: List resource types
      description: |
        Returns all resource types supported for the SCIM configuration.
      tags:
        - scim
      security:
        - bearerSCIMAuth: []
      responses:
        '200':
          $ref: '#/components/responses/scim_get_resource_types_resp'
        '401':
          $ref: '#/components/responses/scim_unauthorized'
        '500':
          $ref: '#/components/responses/scim_error'
  /v2/scim/2.0/ResourceTypes/{name}:
    x-audience: public
    get:
      summary: Get a resource type
      description: |
        Returns a resource type by name.
      tags:
        - scim
      parameters:
        - name: name
          in: path
          schema:
            type: string
          example: User
          required: true
      security:
        - bearerSCIMAuth: []
      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'
  /v2/scim/2.0/Schemas:
    x-audience: public
    get:
      summary: List schemas
      description: |
        Returns all schemas supported for the SCIM configuration.
      tags:
        - scim
      security:
        - bearerSCIMAuth: []
      responses:
        '200':
          $ref: '#/components/responses/scim_get_schemas_resp'
        '401':
          $ref: '#/components/responses/scim_unauthorized'
        '500':
          $ref: '#/components/responses/scim_error'
  /v2/scim/2.0/Schemas/{id}:
    x-audience: public
    get:
      summary: Get a schema
      description: |
        Returns a schema by ID.
      tags:
        - scim
      parameters:
        - name: id
          in: path
          schema:
            type: string
          example: urn:ietf:params:scim:schemas:core:2.0:User
          required: true
      security:
        - bearerSCIMAuth: []
      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'
  /v2/scim/2.0/Users:
    x-audience: public
    get:
      summary: List users
      description: |
        Returns paginated users for an organization. Use `startIndex` and `count` query parameters to receive paginated results.

        **Sorting:**

        Sorting allows you to specify the order in which resources are returned by specifying a combination of `sortBy` and `sortOrder` query parameters.

        The `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".

        **Filtering:**

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

        Supported operators are listed below.

        - `eq` equal
        - `ne` not equal
        - `co` contains
        - `sw` starts with
        - `and` Logical "and"
        - `or` Logical "or"
        - `not` "Not" function
        - `()` Precedence grouping
      tags:
        - scim
      security:
        - bearerSCIMAuth: []
      parameters:
        - name: startIndex
          in: query
          schema:
            type: integer
            minimum: 1
          description: ''
          example: 1
        - name: count
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 200
          description: ''
          example: 10
        - name: filter
          in: query
          schema:
            type: string
          description: ''
          example: userName eq "jon.snow@docker.com"
        - $ref: '#/components/parameters/scim_attributes'
        - name: sortOrder
          in: query
          schema:
            type: string
            enum:
              - ascending
              - descending
        - name: sortBy
          in: query
          schema:
            type: string
          description: User attribute to sort by.
          example: userName
      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'
    post:
      summary: Create user
      description: |
        Creates a user. If the user already exists by email, they are assigned to the organization on the "company" team.
      tags:
        - scim
      security:
        - bearerSCIMAuth: []
      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'
  /v2/scim/2.0/Users/{id}:
    x-audience: public
    parameters:
      - $ref: '#/components/parameters/scim_user_id'
    get:
      summary: Get a user
      description: |
        Returns a user by ID.
      tags:
        - scim
      security:
        - bearerSCIMAuth: []
      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'
    put:
      summary: Update a user
      description: |
        Updates a user. This route is used to change the user's name, activate, and deactivate the user.
      tags:
        - scim
      security:
        - bearerSCIMAuth: []
      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'
components:
  responses:
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ValueError'
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Not Found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    list_tags:
      description: list repository tags
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/paginated_tags'
    get_tag:
      description: repository tag
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/tag'
    bad_request:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
    unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
    forbidden:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
    not_found:
      description: Not Found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
    conflict:
      description: Conflict
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
    internal_error:
      description: Internal
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
    scim_bad_request:
      description: Bad Request
      content:
        application/scim+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/scim_error'
              - properties:
                  status:
                    example: '400'
                  scimType:
                    type: string
                    description: Some types of errors will return this per the specification.
    scim_unauthorized:
      description: Unauthorized
      content:
        application/scim+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/scim_error'
              - properties:
                  status:
                    example: '401'
    scim_forbidden:
      description: Forbidden
      content:
        application/scim+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/scim_error'
              - properties:
                  status:
                    example: '403'
    scim_not_found:
      description: Not Found
      content:
        application/scim+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/scim_error'
              - properties:
                  status:
                    example: '404'
    scim_conflict:
      description: Conflict
      content:
        application/scim+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/scim_error'
              - properties:
                  status:
                    example: '409'
    scim_error:
      description: Internal Error
      content:
        application/scim+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/scim_error'
              - properties:
                  status:
                    example: '500'
    scim_get_service_provider_config_resp:
      description: ''
      content:
        application/scim+json:
          schema:
            $ref: '#/components/schemas/scim_service_provider_config'
    scim_get_resource_types_resp:
      description: ''
      content:
        application/scim+json:
          schema:
            type: object
            properties:
              schemas:
                type: array
                items:
                  type: string
                  example: urn:ietf:params:scim:api:messages:2.0:ListResponse
              totalResults:
                type: integer
                example: 1
              resources:
                type: array
                items:
                  $ref: '#/components/schemas/scim_resource_type'
    scim_get_resource_type_resp:
      description: ''
      content:
        application/scim+json:
          schema:
            $ref: '#/components/schemas/scim_resource_type'
    scim_get_schemas_resp:
      description: ''
      content:
        application/scim+json:
          schema:
            type: object
            properties:
              schemas:
                type: array
                items:
                  type: string
                  example: urn:ietf:params:scim:api:messages:2.0:ListResponse
              totalResults:
                type: integer
                example: 1
              resources:
                type: array
                items:
                  $ref: '#/components/schemas/scim_schema'
    scim_get_schema_resp:
      description: ''
      content:
        application/scim+json:
          schema:
            $ref: '#/components/schemas/scim_schema'
    scim_get_users_resp:
      description: ''
      content:
        application/scim+json:
          schema:
            type: object
            properties:
              schemas:
                type: array
                items:
                  type: string
                example:
                  - urn:ietf:params:scim:api:messages:2.0:ListResponse
              totalResults:
                type: integer
                example: 1
              startIndex:
                type: integer
                example: 1
              itemsPerPage:
                type: integer
                example: 10
              resources:
                type: array
                items:
                  $ref: '#/components/schemas/scim_user'
    scim_create_user_resp:
      description: ''
      content:
        application/scim+json:
          schema:
            $ref: '#/components/schemas/scim_user'
    scim_get_user_resp:
      description: ''
      content:
        application/scim+json:
          schema:
            $ref: '#/components/schemas/scim_user'
    scim_update_user_resp:
      description: ''
      content:
        application/scim+json:
          schema:
            $ref: '#/components/schemas/scim_user'
  schemas:
    UsersLoginRequest:
      description: User login details
      type: object
      required:
        - username
        - password
      properties:
        username:
          description: The username of the Docker Hub account to authenticate with.
          type: string
          example: myusername
        password:
          description: |
            The password or personal access token (PAT) of the Docker Hub account to authenticate with.
          type: string
          example: p@ssw0rd
    PostUsersLoginSuccessResponse:
      description: successful user login response
      type: object
      properties:
        token:
          description: |
            Created authentication token.
            This token can be used in the HTTP Authorization header as a JWT to authenticate with the Docker Hub APIs.
          type: string
          example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          nullable: false
    PostUsersLoginErrorResponse:
      description: failed user login response or second factor required
      type: object
      required:
        - detail
      properties:
        detail:
          description: Description of the error.
          type: string
          example: Incorrect authentication credentials
          nullable: false
        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.
          type: string
          example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
          nullable: true
    Users2FALoginRequest:
      description: Second factor user login details
      type: object
      required:
        - login_2fa_token
        - code
      properties:
        login_2fa_token:
          description: The intermediate 2FA token returned from `/v2/users/login` API.
          type: string
          example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
        code:
          description: |
            The Time-based One-Time Password of the Docker Hub account to authenticate with.
          type: string
          example: 123456
    PostUsers2FALoginErrorResponse:
      description: failed second factor login response.
      type: object
      properties:
        detail:
          description: Description of the error.
          type: string
          example: Incorrect authentication credentials
          nullable: false
    protobufAny:
      type: object
      properties:
        type_url:
          type: string
        value:
          type: string
          format: byte
    rpcStatus:
      type: object
      properties:
        code:
          type: integer
          format: int32
        message:
          type: string
        details:
          type: array
          items:
            $ref: '#/components/schemas/protobufAny'
    AuditLogAction:
      type: object
      properties:
        name:
          type: string
          description: Name of audit log action.
        description:
          type: string
          description: Description of audit log action.
        label:
          type: string
          description: Label for audit log action.
      description: Audit Log action
    AuditLogActions:
      type: object
      properties:
        actions:
          type: array
          items:
            $ref: '#/components/schemas/AuditLogAction'
          description: List of audit log actions.
        label:
          type: string
          description: Grouping label for a particular set of audit log actions.
    GetAuditActionsResponse:
      type: object
      properties:
        actions:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/AuditLogActions'
          description: Map of audit log actions.
      description: GetAuditActions response.
    GetAuditLogsResponse:
      type: object
      properties:
        logs:
          type: array
          items:
            $ref: '#/components/schemas/AuditLog'
          description: List of audit log events.
      description: GetAuditLogs response.
    AuditLog:
      type: object
      properties:
        account:
          type: string
        action:
          type: string
        name:
          type: string
        actor:
          type: string
        data:
          type: object
          additionalProperties:
            type: string
        timestamp:
          type: string
          format: date-time
        action_description:
          type: string
      description: Audit log event.
    ValueError:
      type: object
      description: Used to error if input validation fails.
      properties:
        fields:
          type: object
          items:
            type: string
        text:
          type: string
    Error:
      type: object
      properties:
        detail:
          type: string
        message:
          type: string
    accessToken:
      type: object
      properties:
        uuid:
          type: string
          example: b30bbf97-506c-4ecd-aabc-842f3cb484fb
        client_id:
          type: string
          example: HUB
        creator_ip:
          type: string
          example: 127.0.0.1
        creator_ua:
          type: string
          example: some user agent
        created_at:
          type: string
          example: '2021-07-20T12:00:00.000000Z'
        last_used:
          type: string
          example: null
          nullable: true
        generated_by:
          type: string
          example: manual
        is_active:
          type: boolean
          example: true
        token:
          type: string
          example: a7a5ef25-8889-43a0-8cc7-f2a94268e861
        token_label:
          type: string
          example: My read only token
        scopes:
          type: array
          example:
            - repo:read
          items:
            type: string
    createAccessTokenRequest:
      type: object
      required:
        - token_label
        - scopes
      properties:
        token_label:
          type: string
          description: Friendly name for you to identify the token.
          example: My read only token
          minLength: 1
          maxLength: 100
        scopes:
          type: array
          description: |
            Valid scopes: "repo:admin", "repo:write", "repo:read", "repo:public_read"
          example:
            - repo:read
          items:
            type: string
    createAccessTokensResponse:
      $ref: '#/components/schemas/accessToken'
    getAccessTokensResponse:
      type: object
      properties:
        count:
          type: number
          example: 1
        next:
          type: string
          example: null
        previous:
          type: string
          example: null
        active_count:
          type: number
          example: 1
        results:
          type: array
          items:
            allOf:
              - $ref: '#/components/schemas/accessToken'
              - type: object
                properties:
                  token:
                    type: string
                    example: ''
    patchAccessTokenRequest:
      type: object
      properties:
        token_label:
          type: string
          example: My read only token
          minLength: 1
          maxLength: 100
        is_active:
          type: boolean
          example: false
    patchAccessTokenResponse:
      $ref: '#/components/schemas/accessToken'
    orgSettings:
      type: object
      properties:
        restricted_images:
          $ref: '#/components/schemas/restricted_images'
    restricted_images:
      type: object
      properties:
        enabled:
          type: boolean
          description: Whether or not to restrict image usage for users in the organization.
          example: true
        allow_official_images:
          type: boolean
          description: Allow usage of official images if "enabled" is `true`.
          example: true
        allow_verified_publishers:
          type: boolean
          description: Allow usage of verified publisher images if "enabled" is `true`.
          example: true
    layer:
      type: object
      properties:
        digest:
          type: string
          description: image layer digest
          nullable: true
        size:
          type: integer
          description: size of the layer
        instruction:
          type: string
          description: Dockerfile instruction
    image:
      type: object
      properties:
        architecture:
          type: string
          description: CPU architecture
        features:
          type: string
          description: CPU features
        variant:
          type: string
          description: CPU variant
        digest:
          type: string
          description: image digest
          nullable: true
        layers:
          type: array
          items:
            $ref: '#/components/schemas/layer'
        os:
          type: string
          description: operating system
        os_features:
          type: string
          description: OS features
        os_version:
          type: string
          description: OS version
        size:
          type: integer
          description: size of the image
        status:
          type: string
          enum:
            - active
            - inactive
          description: Status of the image
        last_pulled:
          type: string
          example: '2021-01-05T21:06:53.506400Z'
          description: datetime of last pull
          nullable: true
        last_pushed:
          type: string
          example: '2021-01-05T21:06:53.506400Z'
          description: datetime of last push
          nullable: true
    tag:
      type: object
      properties:
        id:
          type: integer
          description: tag ID
        images:
          type: object
          $ref: '#/components/schemas/image'
        creator:
          type: integer
          description: ID of the user that pushed the tag
        last_updated:
          type: string
          example: '2021-01-05T21:06:53.506400Z'
          description: datetime of last update
          nullable: true
        last_updater:
          type: integer
          description: ID of the last user that updated the tag
        last_updater_username:
          type: string
          description: Hub username of the user that updated the tag
        name:
          type: string
          description: name of the tag
        repository:
          type: integer
          description: repository ID
        full_size:
          type: integer
          description: compressed size (sum of all layers) of the tagged image
        v2:
          type: string
          description: repository API version
        status:
          type: string
          enum:
            - active
            - inactive
          description: whether a tag has been pushed to or pulled in the past month
        tag_last_pulled:
          type: string
          example: '2021-01-05T21:06:53.506400Z'
          description: datetime of last pull
          nullable: true
        tag_last_pushed:
          type: string
          example: '2021-01-05T21:06:53.506400Z'
          description: datetime of last push
          nullable: true
    paginated_tags:
      allOf:
        - $ref: '#/components/schemas/page'
        - type: object
          properties:
            results:
              type: array
              items:
                $ref: '#/components/schemas/tag'
    page:
      type: object
      properties:
        count:
          type: integer
          description: total number of results available across all pages
        next:
          type: string
          description: link to next page of results if any
          nullable: true
        previous:
          type: string
          description: link to previous page of results  if any
          nullable: true
    scim_schema_attribute:
      type: object
      properties:
        name:
          type: string
          example: userName
        type:
          enum:
            - string
            - boolean
            - complex
          type: string
          example: string
        multiValued:
          type: boolean
          example: false
        description:
          type: string
          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.
        required:
          type: boolean
          example: true
        caseExact:
          type: boolean
          example: false
        mutability:
          type: string
          example: readWrite
        returned:
          type: string
          example: default
        uniqueness:
          type: string
          example: server
    scim_schema_parent_attribute:
      allOf:
        - $ref: '#/components/schemas/scim_schema_attribute'
        - type: object
          properties:
            subAttributes:
              type: array
              items:
                $ref: '#/components/schemas/scim_schema_attribute'
    invite:
      type: object
      properties:
        id:
          type: string
          description: uuid representing the invite id
          example: e36eca69-4cc8-4f17-9845-ae8c2b832691
        inviter_username:
          type: string
          example: moby
        invitee:
          type: string
          description: can either be a dockerID for registred users or an email for non-registred users
          example: invitee@docker.com
        org:
          type: string
          description: name of the org to join
          example: docker
        team:
          type: string
          description: name of the team (user group) to join
          example: owners
        created_at:
          type: string
          example: '2021-10-28T18:30:19.520861Z'
    bulk_invite:
      type: object
      properties:
        invitees:
          type: array
          description: A list of invitees
          items:
            type: object
            properties:
              invitee:
                type: string
                description: invitee email or Docker ID
              status:
                type: string
                description: status of the invite or validation error
              invite:
                description: Invite data if successfully invited
                $ref: '#/components/schemas/invite'
      example:
        invitees:
          - invitee: invitee@docker.com
            status: invited
            invite:
              id: e36eca69-4cc8-4f17-9845-ae8c2b832691
              inviter_username: moby
              invitee: invitee@docker.com
              org: docker
              team: owners
              created_at: '2021-10-28T18:30:19.520861Z'
          - invitee: invitee2@docker.com
            status: existing_org_member
          - invitee: invitee3@docker.com
            status: invalid_email_or_docker_id
    error:
      type: object
      properties:
        errinfo:
          type: object
          items:
            type: string
        detail:
          type: string
        message:
          type: string
    scim_error:
      type: object
      properties:
        status:
          type: string
          description: The status code for the response in string format.
        schemas:
          type: array
          items:
            type: string
            default: urn:ietf:params:scim:api:messages:2.0:Error
        detail:
          type: string
          description: Details about why the request failed.
    user:
      type: object
      properties:
        id:
          type: string
          example: 0ab70deb065a43fcacd55d48caa945d8
          description: The UUID trimmed
        company:
          type: string
          example: Docker Inc
        date_joined:
          type: string
          example: '2021-01-05T21:06:53.506400Z'
        full_name:
          type: string
          example: Jon Snow
        gravatar_email:
          type: string
        gravatar_url:
          type: string
        location:
          type: string
        profile_url:
          type: string
        type:
          type: string
          enum:
            - User
            - Org
          example: User
        username:
          type: string
          example: dockeruser
    org_member:
      allOf:
        - $ref: '#/components/schemas/user'
      properties:
        email:
          type: string
          description: User's email address
          example: example@docker.com
        role:
          type: string
          description: User's role in the Organization
          enum:
            - Owner
            - Member
            - Invitee
          example: Owner
        groups:
          type: array
          description: Groups (Teams) that the user is member of
          items:
            type: string
          example:
            - developers
            - owners
        is_guest:
          type: boolean
          description: If the organization has verfied domains, members that have email addresses outside of those domains will be flagged as Guest member
          example: false
        primary_email:
          type: string
          description: User's email primary address
          example: example@docker.com
          deprecated: true
    org_member_paginated:
      type: object
      properties:
        count:
          type: number
          description: The total number of items that match with the search.
          example: 120
        previous:
          type: string
          description: The URL or link for the previous page of items.
          example: https://hub.docker.com/v2/some/resources/items?page=1&page_size=20
        next:
          type: string
          description: The URL or link for the next page of items.
          example: https://hub.docker.com/v2/some/resources/items?page=3&page_size=20
        results:
          type: array
          description: List of accounts.
          items:
            $ref: '#/components/schemas/org_member'
    org_group:
      type: object
      properties:
        id:
          type: number
          example: 10
          description: Group ID
        uuid:
          type: string
          description: UUID for the group
        name:
          type: string
          example: mygroup
          description: Name of the group
        description:
          type: string
          example: Groups description
          description: Description of the group
        member_count:
          type: number
          example: 10
          description: Member count of the group
    group_member:
      type: object
      properties:
        id:
          type: string
          example: 0ab70deb065a43fcacd55d48caa945d8
          description: The UUID trimmed
        company:
          type: string
          example: Docker Inc
        date_joined:
          type: string
          example: '2021-01-05T21:06:53.506400Z'
        full_name:
          type: string
          example: John Snow
        gravatar_email:
          type: string
        gravatar_url:
          type: string
        location:
          type: string
        profile_url:
          type: string
        type:
          type: string
          enum:
            - User
            - Org
          example: User
        username:
          type: string
          example: dockeruser
        email:
          type: string
          example: dockeruser@docker.com
    email_address:
      type: object
      properties:
        id:
          type: number
        user_id:
          type: number
        email:
          type: string
          example: dockeruser@docker.com
        verified:
          type: boolean
        primary:
          type: boolean
    legacy_email_address:
      allOf:
        - $ref: '#/components/schemas/email_address'
        - type: object
          properties:
            user:
              type: string
              example: dockeruser
    email_with_username:
      allOf:
        - $ref: '#/components/schemas/email_address'
        - type: object
          properties:
            username:
              type: string
              example: dockeruser
    scim_service_provider_config:
      type: object
      properties:
        schemas:
          type: array
          items:
            type: string
          example:
            - urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig
        documentationUri:
          type: string
          example: ''
        patch:
          properties:
            supported:
              type: boolean
              example: false
        bulk:
          type: object
          properties:
            supported:
              type: boolean
              example: false
            maxOperations:
              type: integer
            maxPayloadSize:
              type: integer
        filter:
          type: object
          properties:
            supported:
              type: boolean
              example: true
            maxResults:
              type: integer
              example: 99999
        changePassword:
          type: object
          properties:
            supported:
              type: boolean
              example: false
        sort:
          type: object
          properties:
            supported:
              type: boolean
              example: true
        etag:
          type: object
          properties:
            supported:
              type: boolean
              example: false
        authenticationSchemes:
          type: object
          properties:
            name:
              type: string
              example: OAuth 2.0 Bearer Token
            description:
              type: string
              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.
            specUri:
              type: string
              example: http://tools.ietf.org/html/rfc6750
            type:
              type: string
              example: oauthbearertoken
    scim_resource_type:
      type: object
      properties:
        schemas:
          type: array
          items:
            type: string
          example:
            - urn:ietf:params:scim:schemas:core:2.0:ResourceType
        id:
          type: string
          example: User
        name:
          type: string
          example: User
        description:
          type: string
          example: User
        endpoint:
          type: string
          example: /Users
        schema:
          type: string
          example: urn:ietf:params:scim:schemas:core:2.0:User
    scim_schema:
      type: object
      properties:
        schemas:
          type: array
          items:
            type: string
          example:
            - urn:ietf:params:scim:schemas:core:2.0:Schema
        id:
          type: string
          example: urn:ietf:params:scim:schemas:core:2.0:User
        name:
          type: string
          example: User
        description:
          type: string
          example: User Account
        attributes:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/scim_schema_parent_attribute'
    scim_email:
      type: object
      properties:
        value:
          type: string
          example: jon.snow@docker.com
        display:
          type: string
          example: jon.snow@docker.com
        primary:
          type: boolean
          example: true
    scim_group:
      type: object
      properties:
        value:
          type: string
          example: nightswatch
        display:
          type: string
          example: nightswatch
    scim_user_username:
      type: string
      description: The user's email address. This must be reachable via email.
      example: jon.snow@docker.com
    scim_user_name:
      type: object
      properties:
        givenName:
          type: string
          example: Jon
        familyName:
          type: string
          example: Snow
    scim_user_display_name:
      type: string
      description: The username in Docker. Also known as the "Docker ID".
      example: jonsnow
    scim_user_schemas:
      type: array
      items:
        type: string
        example: urn:ietf:params:scim:schemas:core:2.0:User
        minItems: 1
    scim_user_id:
      type: string
      example: d80f7c79-7730-49d8-9a41-7c42fb622d9c
      description: The unique identifier for the user. A v4 UUID.
    scim_user:
      type: object
      properties:
        schemas:
          $ref: '#/components/schemas/scim_user_schemas'
        id:
          $ref: '#/components/schemas/scim_user_id'
        userName:
          $ref: '#/components/schemas/scim_user_username'
        name:
          $ref: '#/components/schemas/scim_user_name'
        displayName:
          $ref: '#/components/schemas/scim_user_display_name'
        active:
          type: boolean
          example: true
        emails:
          type: array
          items:
            $ref: '#/components/schemas/scim_email'
        groups:
          type: array
          items:
            $ref: '#/components/schemas/scim_group'
        meta:
          type: object
          properties:
            resourceType:
              type: string
              example: User
            location:
              type: string
              example: https://hub.docker.com/v2/scim/2.0/Users/d80f7c79-7730-49d8-9a41-7c42fb622d9c
            created:
              type: string
              description: The creation date for the user as a RFC3339 formatted string.
              example: '2022-05-20T00:54:18Z'
            lastModified:
              type: string
              description: The date the user was last modified as a RFC3339 formatted string.
              example: '2022-05-20T00:54:18Z'
  parameters:
    namespace:
      in: path
      name: namespace
      required: true
      schema:
        type: string
    repository:
      in: path
      name: repository
      required: true
      schema:
        type: string
    tag:
      in: path
      name: tag
      required: true
      schema:
        type: string
    org_name:
      in: path
      name: org_name
      description: Name of the organization (namespace).
      schema:
        type: string
      example: myorganization
      required: true
    group_name:
      in: path
      name: group_name
      description: Name of the group (team) in the organization.
      schema:
        type: string
        example: developers
      required: true
    username:
      in: path
      name: username
      description: Username, identifier for the user (namespace, DockerID).
      schema:
        type: string
        example: jonsnow
      required: true
    page:
      in: query
      name: page
      description: Page number (starts on 1).
      schema:
        type: integer
    page_size:
      in: query
      name: page_size
      description: Number of items (rows) per page.
      schema:
        type: integer
    invites:
      in: query
      name: invites
      description: Include invites in the response.
      schema:
        type: boolean
    search:
      in: query
      name: search
      schema:
        type: integer
      description: Search term.
    scim_attributes:
      in: query
      name: attributes
      schema:
        type: string
      description: Comma delimited list of attributes to limit to in the response.
      example: userName,displayName
    scim_user_id:
      name: id
      in: path
      schema:
        type: string
      description: The user ID.
      example: d80f7c79-7730-49d8-9a41-7c42fb622d9c
      required: true
    type:
      in: query
      name: type
      schema:
        type: string
        enum:
          - all
          - invitee
          - member
      example: all
    role:
      in: query
      name: role
      schema:
        type: string
        enum:
          - owner
          - editor
          - member
      example: owner
    bulk_invite:
      in: header
      name: X-Analytics-Client-Feature
      description: Optional string that indicates the feature used to submit the bulk invites (e.g.'file', 'web')
      schema:
        type: string
  requestBodies:
    bulk_invite_request:
      required: true
      content:
        application/json:
          schema:
            type: object
            required:
              - org
              - invitees
            properties:
              org:
                type: string
                description: organization name
                example: docker
              team:
                type: string
                description: team name
                example: owners
              role:
                type: string
                description: role for invitees
                example: member
              invitees:
                type: array
                description: list of invitees emails or Docker Ids
                items:
                  type: string
                  description: invitee email or Docker ID
                example:
                  - invitee1DockerId
                  - invitee2@docker.com
                  - invitee3@docker.com
              dry_run:
                type: boolean
                description: Optional, run through validation but don't actually change data.
                example: true
    scim_create_user_request:
      required: true
      content:
        application/scim+json:
          schema:
            type: object
            required:
              - schemas
              - userName
            properties:
              schemas:
                $ref: '#/components/schemas/scim_user_schemas'
              userName:
                $ref: '#/components/schemas/scim_user_username'
              name:
                $ref: '#/components/schemas/scim_user_name'
    scim_update_user_request:
      required: true
      content:
        application/scim+json:
          schema:
            type: object
            required:
              - schemas
            properties:
              schemas:
                $ref: '#/components/schemas/scim_user_schemas'
              name:
                allOf:
                  - $ref: '#/components/schemas/scim_user_name'
                  - description: If this is omitted from the request, the update will skip the update on it. We will only ever change the name, but not clear it.
              enabled:
                type: boolean
                default: false
                description: If this is omitted from the request, it will default to false resulting in a deactivated user.
    add_member_to_org_group:
      required: true
      content:
        application/json:
          schema:
            type: object
            required:
              - member
            properties:
              member:
                type: string
                example: jonsnow
x-tagGroups:
  - name: General
    tags:
      - resources
      - rate-limiting
  - name: API
    tags:
      - authentication
      - access-tokens
      - images
      - audit-logs
      - org-settings
      - repositories
      - scim
      - orgs 
      - groups
      - invites
