Artifact Hub Webhooks API

Webhook configuration and delivery

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-webhooks-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-webhooks-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Artifact Hub Webhooks 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: Webhooks
  description: ''
paths:
  /webhooks/user:
    get:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Get user's webhooks
      description: Get user's webhooks
      operationId: getUserWebhooks
      responses:
        '200':
          description: ''
          headers:
            Pagination-Total-Count:
              schema:
                type: string
              description: Total number of user's webhooks
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Webhook'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    post:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Add user's webhook
      description: Add user's webhook
      operationId: addUserWebhook
      requestBody:
        $ref: '#/components/requestBodies/WebhookBody'
      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'
  /webhooks/user/{webhookID}:
    get:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Get user's webhook
      description: Get user's webhook
      operationId: getUserWebhookDetail
      parameters:
      - $ref: '#/components/parameters/WebhookIDParam'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Webhook'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    put:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Update user's webhook
      description: Update user's webhook
      operationId: updateUserWebhook
      parameters:
      - $ref: '#/components/parameters/WebhookIDParam'
      requestBody:
        $ref: '#/components/requestBodies/WebhookBody'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Delete user's webhook
      description: Delete user's webhook
      operationId: deleteUserWebhook
      parameters:
      - $ref: '#/components/parameters/WebhookIDParam'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /webhooks/org/{orgName}:
    get:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Get organization's webhooks
      description: Get organization's webhooks
      operationId: getOrganizationWebhooks
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      responses:
        '200':
          description: ''
          headers:
            Pagination-Total-Count:
              schema:
                type: string
              description: Total number of organization's webhooks
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Webhook'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    post:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Add organization's webhook
      description: Add organization's webhook
      operationId: addOrganizationWebhook
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      requestBody:
        $ref: '#/components/requestBodies/WebhookBody'
      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'
  /webhooks/org/{orgName}/{webhookID}:
    get:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Get organization's webhook
      description: Get organization's webhook
      operationId: getOrganizationWebhookDetails
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      - $ref: '#/components/parameters/WebhookIDParam'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Webhook'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    put:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Update organization's webhook
      description: Update organization's webhook
      operationId: updateOrganizationWebhook
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      - $ref: '#/components/parameters/WebhookIDParam'
      requestBody:
        $ref: '#/components/requestBodies/WebhookBody'
      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:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Delete organization's webhook
      description: Delete organization's webhook
      operationId: deleteOrganizationWebhook
      parameters:
      - $ref: '#/components/parameters/OrgNameParam'
      - $ref: '#/components/parameters/WebhookIDParam'
      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'
  /webhooks/test:
    post:
      tags:
      - Webhooks
      security:
      - ApiKeyId: []
        ApiKeySecret: []
      summary: Trigger webhook test
      description: Trigger webhook test
      operationId: triggerWebhookTest
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookTest'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    Error:
      type: object
      properties:
        message:
          type: string
          example: error details
    Webhook:
      allOf:
      - $ref: '#/components/schemas/WebhookSummary'
      - type: object
        required:
        - webhook_id
        - packages
        - last_notifications
        properties:
          webhook_id:
            type: string
            format: uuid
            nullable: false
          packages:
            type: array
            items:
              $ref: '#/components/schemas/PackageSummary'
            nullable: false
          last_notifications:
            type: array
            items:
              $ref: '#/components/schemas/WebhookNotification'
            nullable: false
    WebhookTest:
      type: object
      required:
      - url
      - event_kinds
      properties:
        url:
          type: string
          format: uri
          nullable: false
          example: http://url
        content_type:
          type: string
          nullable: false
          example: application/json
        template:
          type: string
          nullable: false
          example: '{"text": "Package {{ .Package.Name }} version {{ .Package.Version }} released! {{
            .Package.URL }}"}'
        event_kinds:
          type: array
          items:
            $ref: '#/components/schemas/EventKindId'
          nullable: false
          example:
          - 0
    PackageCategoryId:
      type: integer
      enum:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      nullable: false
      description: "Package category:\n  * `1` - AI / Machine learning\n  * `2` - Database\n  * `3` -\
        \ Integration and delivery\n  * `4` - Monitoring and logging\n  * `5` - Networking\n  * `6` -\
        \ Security\n  * `7` - Storage\n  * `8` - Streaming and messaging\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
    PackageSummary:
      allOf:
      - $ref: '#/components/schemas/PackageBase'
      - type: object
        properties:
          category:
            $ref: '#/components/schemas/PackageCategoryId'
          stars:
            type: integer
            nullable: false
            example: 3
    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"
    WebhookNotification:
      type: object
      required:
      - notification_id
      - created_at
      - processed
      - processed_at
      properties:
        notification_id:
          type: string
          format: uuid
          nullable: false
        created_at:
          type: integer
          nullable: false
        processed:
          type: boolean
          nullable: false
        processed_at:
          type: integer
          nullable: false
        error:
          type: string
          nullable: false
          example: error
    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"
    WebhookSummary:
      type: object
      required:
      - name
      - url
      - active
      properties:
        name:
          type: string
          nullable: false
          example: webhook1
        description:
          type: string
          nullable: false
          example: description
        url:
          type: string
          format: uri
          nullable: false
          example: http://url
        secret:
          type: string
          nullable: false
          example: 123abc
        content_type:
          type: string
          nullable: false
          example: application/json
        template:
          type: string
          nullable: false
          example: '{"text": "Package {{ .Package.Name }} version {{ .Package.Version }} released! {{
            .Package.URL }}"}'
        active:
          type: boolean
          nullable: false
        event_kinds:
          type: array
          items:
            $ref: '#/components/schemas/EventKindId'
          nullable: false
    WebhookSummaryWithPackages:
      allOf:
      - $ref: '#/components/schemas/WebhookSummary'
      - type: object
        required:
        - name
        - url
        - active
        - event_kinds
        - packages
        properties:
          packages:
            type: array
            items:
              type: object
              required:
              - package_id
              properties:
                package_id:
                  type: string
                  format: uuid
                  nullable: false
            nullable: false
    PackageBase:
      type: object
      required:
      - package_id
      - name
      - normalized_name
      - stars
      - version
      - ts
      - repository
      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
        display_name:
          type: string
          nullable: false
          example: Package 1
        description:
          type: string
          nullable: false
          example: This is a package sample
        version:
          type: string
          nullable: false
          example: 1.0.0
        app_version:
          type: string
          nullable: false
          example: 0.1.0
        license:
          type: string
          nullable: false
          example: MIT
        deprecated:
          type: boolean
          nullable: false
          example: false
        signed:
          type: boolean
          nullable: false
          example: false
        signatures:
          type: array
          items:
            type: string
            enum:
            - prov
            - cosign
            nullable: false
        official:
          type: boolean
          nullable: false
        cncf:
          type: boolean
          nullable: true
        ts:
          type: integer
          nullable: false
        repository:
          $ref: '#/components/schemas/RepositorySummary'
        security_report_summary:
          type: object
          nullable: false
          properties:
            critical:
              type: number
              nullable: false
            high:
              type: number
              nullable: false
            medium:
              type: number
              nullable: false
            low:
              type: number
              nullable: false
            unknown:
              type: number
              nullable: false
        all_containers_images_whitelisted:
          type: boolean
          nullable: false
          example: false
        production_organizations_count:
          type: number
          nullable: false
  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
  requestBodies:
    WebhookBody:
      description: Webhook body
      required: true
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/WebhookSummaryWithPackages'
  parameters:
    OrgNameParam:
      in: path
      name: orgName
      schema:
        type: string
        example: org1
      required: true
      description: Organization name
    WebhookIDParam:
      in: path
      name: webhookID
      schema:
        type: string
        format: uuid
      required: true
      description: Webhook ID
  securitySchemes:
    ApiKeyId:
      type: apiKey
      in: header
      name: X-API-KEY-ID
    ApiKeySecret:
      type: apiKey
      in: header
      name: X-API-KEY-SECRET