Artifact Hub Repositories API

Repository management

OpenAPI Specification

artifact-hub-repositories-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Artifact Hub Repositories API
  description: Find, install and publish Cloud Native packages
  version: 1.22.0
  contact:
    name: Artifact Hub support
    url: https://cloud-native.slack.com/channels/artifact-hub
servers:
- url: https://artifacthub.io/api/v1
  description: Artifact Hub production API
x-evidence:
  source: https://artifacthub.io/docs/api/openapi.yaml
  source_title: Artifact Hub
  source_version: 1.22.0
  harvested: '2026-08-01'
  harvest_status: HTTP 200
  server_verified: https://artifacthub.io/api/v1/stats -> HTTP 200 (2026-08-01)
  note: Harvested from the provider. Replaces a reconstructed spec that shared no paths with this document
    and carried no schemas.
tags:
- name: Repositories
  description: ''
paths:
  /repositories/search:
    get:
      tags:
      - Repositories
      summary: Search repositories that meet the provided criteria
      description: Search repositories that meet the provided criteria
      operationId: searchRepositories
      parameters:
      - $ref: '#/components/parameters/OffsetParam'
      - $ref: '#/components/parameters/LimitParam'
      - $ref: '#/components/parameters/RepositoryKindsListParam'
      - $ref: '#/components/parameters/UsersListParam'
      - $ref: '#/components/parameters/OrgsListParam'
      - $ref: '#/components/parameters/RepoNameQueryParam'
      - $ref: '#/components/parameters/UrlQueryParam'
      responses:
        '200':
          description: ''
          headers:
            Pagination-Total-Count:
              schema:
                type: string
              description: Total number of repositories
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Repository'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /repositories/user:
    post:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Add user's repository
      description: Add user's repository
      operationId: addUserRepository
      requestBody:
        $ref: '#/components/requestBodies/RepositoryBody'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /repositories/user/{repoName}:
    put:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Update user's repository
      description: Update user's repository
      operationId: updateUserRepository
      parameters:
      - $ref: '#/components/parameters/RepoNameParam'
      requestBody:
        $ref: '#/components/requestBodies/RepositoryBody'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Delete user's repository
      description: Delete user's repository
      operationId: deleteUserRepository
      parameters:
      - $ref: '#/components/parameters/RepoNameParam'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /repositories/user/{repoName}/transfer:
    put:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Transfer user's repository ownership to an organization
      description: Transfer user's repository ownership to an organization
      operationId: transferRepositoryOwnershipToOrganization
      parameters:
      - $ref: '#/components/parameters/RepoNameParam'
      - $ref: '#/components/parameters/OrgNameToParam'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /repositories/user/{repoName}/claim-ownership:
    put:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Claim the ownership of a given repository
      description: Claim the ownership of a given repository
      operationId: claimRepositoryOwnership
      parameters:
      - $ref: '#/components/parameters/RepoNameParam'
      - $ref: '#/components/parameters/OrgNameToParam'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /repositories/org/{orgName}:
    post:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Add organization's repository
      description: Add organization's repository
      operationId: addOrganizationRepository
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      requestBody:
        $ref: '#/components/requestBodies/RepositoryBody'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /repositories/org/{orgName}/{repoName}:
    put:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Update organization's repository
      description: Update organization's repository
      operationId: updateOrganizationRepository
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      - $ref: '#/components/parameters/RepoNameParam'
      requestBody:
        $ref: '#/components/requestBodies/RepositoryBody'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Delete organization's repository
      description: Delete organization's repository
      operationId: deleteOrganizationRepository
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      - $ref: '#/components/parameters/RepoNameParam'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /repositories/org/{orgName}/{repoName}/transfer:
    put:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Transfer organization's repository to a different owner
      description: Transfer organization's repository to a different owner
      operationId: transferRepositoryOwnership
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      - $ref: '#/components/parameters/RepoNameParam'
      - $ref: '#/components/parameters/OrgNameToParam'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /repositories/org/{orgName}/{repoName}/claim-ownership:
    put:
      tags:
      - Repositories
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Claim the ownership of a given repository
      description: Claim the ownership of a given repository
      operationId: claimRepositoryOwnershipFromOrganization
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      - $ref: '#/components/parameters/RepoNameParam'
      - $ref: '#/components/parameters/OrgNameToParam'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    Error:
      type: object
      properties:
        message:
          type: string
          example: error details
    RepositorySummary:
      type: object
      required:
      - repository_id
      - kind
      - name
      - url
      - verified_publisher
      - official
      - scanner_disabled
      properties:
        repository_id:
          type: string
          format: uuid
        kind:
          $ref: '#/components/schemas/RepositoryKind'
        name:
          type: string
          nullable: false
          example: repo1
        display_name:
          type: string
          nullable: false
          example: Repository 1
        url:
          type: string
          format: uri
          nullable: false
          example: http://repourl
        verified_publisher:
          type: boolean
          nullable: false
        official:
          type: boolean
          nullable: false
        cncf:
          type: boolean
          nullable: true
        private:
          type: boolean
          nullable: false
        scanner_disabled:
          type: boolean
          nullable: false
          example: false
        user_alias:
          type: string
          nullable: false
          example: jdoe
        organization_name:
          type: string
          nullable: false
          example: org1
        organization_display_name:
          type: string
          nullable: false
          example: Organization 1
      nullable: false
    Repository:
      allOf:
      - $ref: '#/components/schemas/RepositorySummary'
      - type: object
        required:
        - digest
        - last_tracking_ts
        - last_scanning_ts
        - disabled
        properties:
          digest:
            type: string
            nullable: false
          last_tracking_ts:
            type: integer
            nullable: false
          last_tracking_errors:
            type: string
            nullable: false
            example: Error
          last_scanning_ts:
            type: integer
            nullable: false
          last_scanning_errors:
            type: string
            nullable: false
            example: Error
          disabled:
            type: boolean
            nullable: false
          branch:
            type: string
            nullable: false
          data:
            type: object
            nullable: false
            properties:
              tags:
                type: array
                items:
                  type: object
                  required:
                  - name
                  properties:
                    name:
                      type: string
                      nullable: false
                      example: stable
                    mutable:
                      type: boolean
                      nullable: false
    RepositoryKind:
      type: integer
      enum:
      - 0
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      - 10
      - 11
      - 12
      - 13
      - 14
      - 15
      - 16
      - 17
      - 18
      - 19
      - 20
      - 21
      - 22
      - 23
      - 24
      - 25
      - 26
      - 27
      description: "Repository kind:\n  * `0` - Helm charts\n  * `1` - Falco rules\n  * `2` - OPA policies\n\
        \  * `3` - OLM operators\n  * `4` - Tinkerbell actions\n  * `5` - Krew kubectl plugins\n  * `6`\
        \ - Helm plugins\n  * `7` - Tekton tasks\n  * `8` - KEDA scalers\n  * `9` - Core DNS plugins\n\
        \  * `10` - Keptn integrations\n  * `11` - Tekton pipelines\n  * `12` - Container images\n  *\
        \ `13` - Kubewarden policies\n  * `14` - Gatekeeper policies\n  * `15` - Kyverno policies\n  *\
        \ `16` - Knative client plugins\n  * `17` - Backstage plugins\n  * `18` - Argo templates\n  *\
        \ `19` - KubeArmor templates\n  * `20` - KCL packages\n  * `21` - Headlamp plugins\n  * `22` -\
        \ Inspektor gadgets\n  * `23` - Tekton stepactions\n  * `24` - Meshery designs\n  * `25` - Opencost\
        \ plugins\n  * `26` - Radius recipes\n  * `27` - Bootable containers\n  * `28` - Kagent agents\n"
  responses:
    BadRequest:
      description: The request sent was not valid
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    InternalServerError:
      description: The server encountered an unexpected condition that prevented it from fulfilling the
        request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NoContent:
      description: The request has succeeded, no content returned
    Forbidden:
      description: The user does not have permission to perform the requested operation
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnauthorizedError:
      description: Valid authentication credentials not provided
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Created:
      description: The request has succeeded and has led to the creation of a resource
    TooManyRequests:
      description: The user has sent too many requests in a given amount of time
  parameters:
    LimitParam:
      in: query
      name: limit
      schema:
        type: integer
        default: 20
        maximum: 60
      required: false
      description: The number of items to return
    OrgsListParam:
      in: query
      name: org
      schema:
        type: array
        items:
          type: string
        example:
        - org1
        - org2
      required: false
      description: List of organization names
    OffsetParam:
      in: query
      name: offset
      schema:
        type: integer
        minimum: 0
        default: 0
      required: false
      description: The number of items to skip before starting to collect the result set
    OrgNameParam:
      in: path
      name: orgName
      schema:
        type: string
        example: org1
      required: true
      description: Organization name
    RepoNameQueryParam:
      in: query
      name: name
      schema:
        type: string
        example: repo-name
      required: false
      description: Repository name
    UrlQueryParam:
      in: query
      name: url
      schema:
        type: string
        example: https://repo2.com
      required: false
      description: Repository url
    RepositoryKindsListParam:
      in: query
      name: kind
      schema:
        type: array
        items:
          $ref: '#/components/schemas/RepositoryKind'
      required: false
      description: "Repository kind:\n  * `0` - Helm charts\n  * `1` - Falco rules\n  * `2` - OPA policies\n\
        \  * `3` - OLM operators\n  * `4` - Tinkerbell actions\n  * `5` - Krew kubectl plugins\n  * `6`\
        \ - Helm plugins\n  * `7` - Tekton tasks\n  * `8` - KEDA scalers\n  * `9` - Core DNS plugins\n\
        \  * `10` - Keptn integrations\n  * `11` - Tekton pipelines\n  * `12` - Container images\n  *\
        \ `13` - Kubewarden policies\n  * `14` - Gatekeeper policies\n  * `15` - Kyverno policies\n  *\
        \ `16` - Knative client plugins\n  * `17` - Backstage plugins\n  * `18` - Argo templates\n  *\
        \ `19` - KubeArmor templates\n  * `20` - KCL packages\n  * `21` - Headlamp plugins\n  * `22` -\
        \ Inspektor gadgets\n  * `23` - Tekton stepactions\n  * `24` - Meshery designs\n  * `25` - Opencost\
        \ plugins\n  * `26` - Radius recipes\n  * `27` - Bootable containers\n  * `28` - Kagent agents\n"
    OrgNameToParam:
      in: query
      name: org
      required: false
      schema:
        type: string
        example: org1
      description: The org to transfer or from claiming the repository
    RepoNameParam:
      in: path
      name: repoName
      schema:
        type: string
        example: repoName
      required: true
      description: Repository name
    UsersListParam:
      in: query
      name: user
      schema:
        type: array
        items:
          type: string
        example:
        - user1
        - user2
      required: false
      description: List of aliases
  requestBodies:
    RepositoryBody:
      description: Repository request body
      required: true
      content:
        application/json:
          schema:
            type: object
            properties:
              kind:
                $ref: '#/components/schemas/RepositoryKind'
              name:
                type: string
                example: repo1
              display_name:
                type: string
                example: Repo 1
              url:
                type: string
                example: http://repo-url.com
  securitySchemes:
    ApiKeyId:
      type: apiKey
      in: header
      name: X-API-KEY-ID
    ApiKeySecret:
      type: apiKey
      in: header
      name: X-API-KEY-SECRET