Artifact Hub Subscriptions API

Package event subscriptions

Operations 7

GET /subscriptions Get user's subscriptions #
POST /subscriptions Add subscription #
DELETE /subscriptions Delete subscription #
GET /subscriptions/{packageID} Get user's subscriptions for the given package #
GET /subscriptions/opt-out Get user's opt-out entries #
POST /subscriptions/opt-out Add opt-out entry #
DELETE /subscriptions/opt-out/{optOutID} Delete opt-out entry #

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 form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

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.2.0
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
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
                    name:
                      type: string
                      example: pkg1
                    normalized_name:
                      type: string
                      example: pkg1
                    logo_image_id:
                      type: string
                      example: 12345abcde
                    repository:
                      $ref: '#/components/schemas/RepositorySummary'
                    event_kinds:
                      type: array
                      items:
                        $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 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
                    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:
  parameters:
    OptOutIDParam:
      in: path
      name: optOutID
      schema:
        type: string
        format: uuid
      required: true
      description: Opt-out entry ID
    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
    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
    LimitParam:
      in: query
      name: limit
      schema:
        type: integer
        default: 20
        maximum: 60
      required: false
      description: The number of items to return
    EventKindParam:
      in: query
      name: event_kind
      required: true
      schema:
        $ref: '#/components/schemas/EventKindId'
      description: Event kind
  schemas:
    EventKindId:
      type: integer
      enum:
      - 0
      - 1
      - 2
      - 4
      description: "Event kind:\n  * `0` - New package release\n  * `1` - Security alerts\n  * `2` - Repository tracking errors\n  * `4` - Repository scanning errors\n"
    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
          example: repo1
        display_name:
          type: string
          example: Repository 1
        url:
          type: string
          format: uri
          example: http://repourl
        verified_publisher:
          type: boolean
        official:
          type: boolean
        cncf:
          type:
          - boolean
          - 'null'
        private:
          type: boolean
        scanner_disabled:
          type: boolean
          example: false
        user_alias:
          type: string
          example: jdoe
        organization_name:
          type: string
          example: org1
        organization_display_name:
          type: string
          example: Organization 1
  responses:
    NoContent:
      description: The request has succeeded, no content returned
    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
    UnauthorizedError:
      description: Valid authentication credentials not provided
      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'
  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
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.