Artifact Hub Subscriptions API

Package event subscriptions

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/artifact-hub-subscriptions-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

artifact-hub-subscriptions-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Artifact Hub Subscriptions 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: Subscriptions
  description: ''
paths:
  /subscriptions:
    get:
      tags:
      - Subscriptions
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Get user's subscriptions
      description: Get user's subscriptions
      operationId: getUserSubscriptions
      parameters:
      - $ref: '#/components/parameters/OffsetParam'
      - $ref: '#/components/parameters/LimitParam'
      responses:
        '200':
          description: ''
          headers:
            Pagination-Total-Count:
              schema:
                type: string
              description: Total number of subscriptions
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  required:
                  - package_id
                  - name
                  - normalized_name
                  - repository
                  - event_kinds
                  properties:
                    package_id:
                      type: string
                      format: uuid
                      nullable: false
                    name:
                      type: string
                      nullable: false
                      example: pkg1
                    normalized_name:
                      type: string
                      nullable: false
                      example: pkg1
                    logo_image_id:
                      type: string
                      nullable: false
                      example: 12345abcde
                    repository:
                      $ref: '#/components/schemas/RepositorySummary'
                    event_kinds:
                      type: array
                      items:
                        $ref: '#/components/schemas/EventKindId'
                      nullable: false
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    post:
      tags:
      - Subscriptions
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Add subscription
      description: Add subscription
      operationId: addPackageSubscription
      requestBody:
        $ref: '#/components/requestBodies/SubscriptionBody'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags:
      - Subscriptions
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Delete subscription
      description: Delete subscription
      operationId: deletePackageSubscription
      parameters:
      - $ref: '#/components/parameters/PackageIDQueryParam'
      - $ref: '#/components/parameters/EventKindParam'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /subscriptions/{packageID}:
    get:
      tags:
      - Subscriptions
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Get user's subscriptions for the given package
      description: Get user's subscriptions for the given package
      operationId: getPackageUserSubscriptions
      parameters:
      - $ref: '#/components/parameters/PackageIDParam'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  required:
                  - event_kind
                  properties:
                    event_kind:
                      $ref: '#/components/schemas/EventKindId'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /subscriptions/opt-out:
    get:
      tags:
      - Subscriptions
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Get user's opt-out entries
      description: Get user's opt-out entries
      operationId: getUserOptOutEntries
      parameters:
      - $ref: '#/components/parameters/OffsetParam'
      - $ref: '#/components/parameters/LimitParam'
      responses:
        '200':
          description: ''
          headers:
            Pagination-Total-Count:
              schema:
                type: string
              description: Total number of user's opt-out entries
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  required:
                  - opt_out_id
                  - repository
                  - event_kind
                  properties:
                    opt_out_id:
                      type: string
                      format: uuid
                      nullable: false
                    repository:
                      $ref: '#/components/schemas/RepositorySummary'
                    event_kind:
                      $ref: '#/components/schemas/EventKindId'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    post:
      tags:
      - Subscriptions
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Add opt-out entry
      description: Add opt-out entry
      operationId: addOptOutEntry
      requestBody:
        $ref: '#/components/requestBodies/OptOutBody'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /subscriptions/opt-out/{optOutID}:
    delete:
      tags:
      - Subscriptions
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Delete opt-out entry
      description: Delete opt-out entry
      operationId: deleteOptOutEntry
      parameters:
      - $ref: '#/components/parameters/OptOutIDParam'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    Error:
      type: object
      properties:
        message:
          type: string
          example: error details
    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"
    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
    EventKindId:
      type: integer
      enum:
      - 0
      - 1
      - 2
      - 4
      nullable: false
      description: "Event kind:\n  * `0` - New package release\n  * `1` - Security alerts\n  * `2` - Repository\
        \ tracking errors\n  * `4` - Repository scanning errors\n"
  parameters:
    PackageIDParam:
      in: path
      name: packageID
      schema:
        type: string
        format: uuid
      required: true
      description: Package ID
    PackageIDQueryParam:
      in: query
      name: packageID
      schema:
        type: string
        format: uuid
      required: true
      description: Package ID
    EventKindParam:
      in: query
      name: event_kind
      required: true
      schema:
        $ref: '#/components/schemas/EventKindId'
      description: Event kind
    LimitParam:
      in: query
      name: limit
      schema:
        type: integer
        default: 20
        maximum: 60
      required: false
      description: The number of items to return
    OptOutIDParam:
      in: path
      name: optOutID
      schema:
        type: string
        format: uuid
      required: true
      description: Opt-out entry ID
    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
  responses:
    Created:
      description: The request has succeeded and has led to the creation of a resource
    BadRequest:
      description: The request sent was not valid
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    TooManyRequests:
      description: The user has sent too many requests in a given amount of time
    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
    UnauthorizedError:
      description: Valid authentication credentials not provided
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  requestBodies:
    SubscriptionBody:
      description: Subscription request body
      required: true
      content:
        application/json:
          schema:
            type: object
            properties:
              package_id:
                type: string
                format: uuid
              event_kind:
                $ref: '#/components/schemas/EventKindId'
            required:
            - package_id
            - event_kind
    OptOutBody:
      description: Opt-out entry request body
      required: true
      content:
        application/json:
          schema:
            type: object
            properties:
              repository_id:
                type: string
                format: uuid
              event_kind:
                $ref: '#/components/schemas/EventKindId'
            required:
            - repository_id
            - event_kind
  securitySchemes:
    ApiKeyId:
      type: apiKey
      in: header
      name: X-API-KEY-ID
    ApiKeySecret:
      type: apiKey
      in: header
      name: X-API-KEY-SECRET