Artifact Hub Webhooks API

Webhook configuration and delivery

Operations 11

GET /webhooks/user Get user's webhooks #
POST /webhooks/user Add user's webhook #
GET /webhooks/user/{webhookID} Get user's webhook #
PUT /webhooks/user/{webhookID} Update user's webhook #
DELETE /webhooks/user/{webhookID} Delete user's webhook #
GET /webhooks/org/{orgName} Get organization's webhooks #
POST /webhooks/org/{orgName} Add organization's webhook #
GET /webhooks/org/{orgName}/{webhookID} Get organization's webhook #
PUT /webhooks/org/{orgName}/{webhookID} Update organization's webhook #
DELETE /webhooks/org/{orgName}/{webhookID} Delete organization's webhook #
POST /webhooks/test Trigger webhook test #

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 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-webhooks-api-openapi.yml Raw ↑
openapi: 3.2.0
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
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:
    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"
    WebhookSummary:
      type: object
      required:
      - name
      - url
      - active
      properties:
        name:
          type: string
          example: webhook1
        description:
          type: string
          example: description
        url:
          type: string
          format: uri
          example: http://url
        secret:
          type: string
          example: 123abc
        content_type:
          type: string
          example: application/json
        template:
          type: string
          example: '{"text": "Package {{ .Package.Name }} version {{ .Package.Version }} released! {{ .Package.URL }}"}'
        active:
          type: boolean
        event_kinds:
          type: array
          items:
            $ref: '#/components/schemas/EventKindId'
    Error:
      type: object
      properties:
        message:
          type: string
          example: error details
    PackageCategoryId:
      type: integer
      enum:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      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"
    PackageBase:
      type: object
      required:
      - package_id
      - name
      - normalized_name
      - stars
      - version
      - ts
      - repository
      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
        display_name:
          type: string
          example: Package 1
        description:
          type: string
          example: This is a package sample
        version:
          type: string
          example: 1.0.0
        app_version:
          type: string
          example: 0.1.0
        license:
          type: string
          example: MIT
        deprecated:
          type: boolean
          example: false
        signed:
          type: boolean
          example: false
        signatures:
          type: array
          items:
            type: string
            enum:
            - prov
            - cosign
        official:
          type: boolean
        cncf:
          type:
          - boolean
          - 'null'
        ts:
          type: integer
        repository:
          $ref: '#/components/schemas/RepositorySummary'
        security_report_summary:
          type: object
          properties:
            critical:
              type: number
            high:
              type: number
            medium:
              type: number
            low:
              type: number
            unknown:
              type: number
        all_containers_images_whitelisted:
          type: boolean
          example: false
        production_organizations_count:
          type: number
    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
    WebhookTest:
      type: object
      required:
      - url
      - event_kinds
      properties:
        url:
          type: string
          format: uri
          example: http://url
        content_type:
          type: string
          example: application/json
        template:
          type: string
          example: '{"text": "Package {{ .Package.Name }} version {{ .Package.Version }} released! {{ .Package.URL }}"}'
        event_kinds:
          type: array
          items:
            $ref: '#/components/schemas/EventKindId'
          example:
          - 0
    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
    WebhookNotification:
      type: object
      required:
      - notification_id
      - created_at
      - processed
      - processed_at
      properties:
        notification_id:
          type: string
          format: uuid
        created_at:
          type: integer
        processed:
          type: boolean
        processed_at:
          type: integer
        error:
          type: string
          example: error
    PackageSummary:
      allOf:
      - $ref: '#/components/schemas/PackageBase'
      - type: object
        properties:
          category:
            $ref: '#/components/schemas/PackageCategoryId'
          stars:
            type: integer
            example: 3
    Webhook:
      allOf:
      - $ref: '#/components/schemas/WebhookSummary'
      - type: object
        required:
        - webhook_id
        - packages
        - last_notifications
        properties:
          webhook_id:
            type: string
            format: uuid
          packages:
            type: array
            items:
              $ref: '#/components/schemas/PackageSummary'
          last_notifications:
            type: array
            items:
              $ref: '#/components/schemas/WebhookNotification'
    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:
    TooManyRequests:
      description: The user has sent too many requests in a given amount of time
    NoContent:
      description: The request has succeeded, no content returned
    BadRequest:
      description: The request sent was not valid
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnauthorizedError:
      description: Valid authentication credentials not provided
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: The user does not have permission to perform the requested operation
      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'
    Created:
      description: The request has succeeded and has led to the creation of a resource
  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
  requestBodies:
    WebhookBody:
      description: Webhook body
      required: true
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/WebhookSummaryWithPackages'
  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.