Key points
- Each source owns its own signing secret and receives deliveries at
POST /v1/git/webhooks/{sourceID}. - Deliveries are normalized into the same event model that GitHub App events use, so trigger manifests stay provider-neutral.
- Recent deliveries are visible for diagnosis at
GET /v1/git-webhook-sources/{sourceID}/deliveries. - A trigger manifest for a non-GitHub provider must reference the source by ID.
Before you start
- Provider
- A GitLab, Bitbucket, Gitea, or generic provider that can send webhooks
- Reachable ingress
- The webhook endpoint reachable from the provider; nothing else about the install needs to be exposed
- Access
- Permission to create Git webhook sources and the trigger that consumes them
Steps
- 01
Create the source
A source owns its provider kind, its signing secret, and the repository allowlist that bounds what it may start runs for.
Create a sourcebash curl -sX POST "$NOPSAI_URL/v1/git-webhook-sources" \ -H "Authorization: Bearer $NOPSAI_TOKEN" \ -H "Content-Type: application/json" \ --data @source.json | jq -r .idExpected result- A source ID. Deliveries for this source arrive at
POST /v1/git/webhooks/{sourceID}.
- A source ID. Deliveries for this source arrive at
- 02
Point the provider at it
Configure the webhook in the provider with that URL and the same signing secret. Every delivery is signature-verified before it is accepted.
Verify- The provider reports a successful delivery, and the source lists it.
- 03
Read the deliveries
Delivery history is the first place to look when a push produced no run: it separates "never arrived" from "arrived and was rejected".
List recent deliveriesbash curl -s -H "Authorization: Bearer $NOPSAI_TOKEN" "$NOPSAI_URL/v1/git-webhook-sources/$SOURCE_ID/deliveries" | jqVerify- The delivery appears with its verification result and the event it normalised to.
- 04
Bind a trigger to the source
A trigger manifest for a non-GitHub provider must reference the source by ID. The event model is already normalised, so the manifest stays provider-neutral.
Verify- A push matching the trigger rules produces a run.
How it works
The webhook endpoint is public by necessity — the provider calls it — but every delivery is signature-verified against the source secret before it is accepted.
A repository allowlist limits which repositories a source may start runs for, so one shared source cannot be used to trigger unrelated pipelines.
Implementation evidence
doc/git-webhook-sources.mdProvider configuration, security, payload normalization, and operations.
services/nopsai/git_webhook_sources_schema.goSource schema and delivery handling.

