GoHarbor · AsyncAPI Specification
Goharbor Webhooks
Version
View Spec
View on GitHub
Container RegistryContainersArtifactsVulnerability ScanningSupply Chain SecurityOCIOpen SourceKubernetesDevOpsReplicationAsyncAPIEvents
AsyncAPI Specification
generated: '2026-09-12'
method: searched
source: https://goharbor.io/docs/2.15.0/working-with-projects/project-configuration/configure-webhooks/
provider: Harbor
providerId: goharbor
type: Webhooks
description: >-
Harbor's event surface is a per-project webhook policy: a project administrator registers
an endpoint and Harbor POSTs a JSON notification when one of ten documented events occurs
in that project. There is no AsyncAPI document and no streaming/queue surface — Harbor
publishes NO AsyncAPI specification, and none is authored here. What follows is the
published event catalog, the two payload formats, and the API operations that manage
subscriptions.
asyncapi_published: false
delivery:
transport: HTTP(S) POST
endpoint_kinds:
- http
- slack
scope: per project — multiple endpoints may be registered per project
payload_formats:
- name: Default
note: Harbor's original payload shape, unchanged across versions. Fields — type, occur_at, operator, event_data{resources[], repository{}}.
- name: CloudEvents
note: 'Same data wrapped per CloudEvents 1.0 — specversion, id, requestid, source (/projects/{id}/webhook/policies/{policy_id}), type (e.g. harbor.artifact.pushed), datacontenttype, time, data.'
spec: https://cloudevents.io
retries: not published
signing: not published
note: The docs describe no signature header and no retry/backoff policy for webhook delivery.
events:
- type: PUSH_ARTIFACT
trigger: Push artifact to registry
payload: repository namespace and name, resource URL, tags, manifest digest, artifact name, push timestamp, username of the pusher
cloudevents_type: harbor.artifact.pushed
- type: PULL_ARTIFACT
trigger: Pull artifact from registry
payload: repository namespace and name, manifest digest, artifact name, pull timestamp, username of the puller
- type: DELETE_ARTIFACT
trigger: Delete artifact from registry
payload: repository namespace and name, manifest digest, artifact name, artifact size, delete timestamp, username of the deleter
- type: SCANNING_COMPLETED
trigger: Artifact scan completed
payload: repository namespace and name, tag scanned, artifact name, counts of critical/major/minor issues, last scan status, completion timestamp, username
- type: SCANNING_STOPPED
trigger: Artifact scan stopped
payload: repository namespace and name, tag scanned, artifact name, scan status
- type: SCANNING_FAILED
trigger: Artifact scan failed
payload: repository namespace and name, tag scanned, artifact name, the error that occurred, username
- type: QUOTA_EXCEED
trigger: Project quota exceeded
payload: repository namespace and name, tags, manifest digest, artifact name, push timestamp, username
- type: QUOTA_WARNING
trigger: Project quota near threshold
payload: repository namespace and name, tags, manifest digest, artifact name, push timestamp, username
- type: REPLICATION
trigger: Artifact replication status changed
payload: repository namespace and name, tags, manifest digest, artifact name, push timestamp, username who triggered the replication
- type: TAG_RETENTION
trigger: Artifact tag retention finished
payload: repository namespace and name, total and retained counts, the retention rule, deleted artifact results
subscription_api:
base: https://{host}/api/v2.0
operations:
- operationId: GetSupportedEventTypes
method: GET /projects/{project_name_or_id}/webhook/events
purpose: Discover the event types and notify types this instance supports — the runtime source of truth for the catalog above.
- operationId: CreateWebhookPolicyOfProject
method: POST /projects/{project_name_or_id}/webhook/policies
purpose: Register an endpoint and select the events and payload format.
- operationId: ListWebhookPoliciesOfProject
method: GET /projects/{project_name_or_id}/webhook/policies
- operationId: GetWebhookPolicyOfProject
method: GET /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}
- operationId: UpdateWebhookPolicyOfProject
method: PUT /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}
- operationId: DeleteWebhookPolicyOfProject
method: DELETE /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}
- operationId: ListExecutionsOfWebhookPolicy
method: GET /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}/executions
purpose: Delivery history per policy.
- operationId: ListTasksOfWebhookExecution
method: GET /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}/executions/{execution_id}/tasks
- operationId: GetLogsOfWebhookTask
method: GET /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}/executions/{execution_id}/tasks/{task_id}/log
purpose: Per-delivery log — the debugging surface when an endpoint stops receiving events.
deprecated:
- operationId: LastTrigger
method: GET /projects/{project_name_or_id}/webhook/lasttrigger
- operationId: ListWebhookJobs
method: GET /projects/{project_name_or_id}/webhook/jobs
counts:
events: 10
payload_formats: 2
management_operations: 9
Work with this as data
Every AsyncAPI spec 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 asyncapi
4 MCP tools reach this
find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.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.
Call it yourself
curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/goharbor-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?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.