Skip to content

Webhook Extractor

Receives events via HTTP POST requests, creating endpoints that accept JSON payloads from CI/CD pipelines and external services.

The webhook source is the primary way to receive push-based events from GitHub, GitLab, Jenkins, ArgoCD, and other systems that support outgoing webhooks.

Configuration

toml
[sources.my_webhook.extractor]
type = "webhook"
id = "github-events"
headers_to_keep = ["X-GitHub-Event", "X-GitHub-Delivery"]

Parameters

ParameterTypeDefaultDescription
idstringUnique identifier used in the URL path (/webhook/{id})
headers_to_keeparray[]HTTP header names to preserve through the pipeline
headerstable{}Header validation rules for incoming requests
metadataobjectStatic metadata for all events; context.source is auto-populated if unset

URL Structure

POST /webhook/{id}

The collector exposes one endpoint per webhook source. Configure the external service to send POST requests to https://your-collector:8080/webhook/{id}.

Response Codes

CodeCondition
201 CreatedEvent successfully received
400 Bad RequestInvalid JSON body
401 UnauthorizedMissing authentication header
403 ForbiddenHeader validation failed

Security

Always validate webhook signatures to prevent unauthorized event injection.

API key validation

toml
[sources.my_webhook.extractor.headers]
"x-api-key" = { type = "secret", value = "my-secret-api-key" }

HMAC signature (GitHub, Jenkins, Gitea)

toml
[sources.github_webhook.extractor.headers]
"x-hub-signature-256" = { type = "signature", token = "github-webhook-secret", signature_prefix = "sha256=", signature_on = "body", signature_encoding = "hex" }

→ Complete Header Validation Guide

Integration Examples

GitHub Actions / GitHub webhooks

toml
[sources.github_events]
enabled = true
transformer_refs = ["github_to_cdevents"]

[sources.github_events.extractor]
type = "webhook"
id = "github"
headers_to_keep = ["X-GitHub-Event", "X-GitHub-Delivery"]

[sources.github_events.extractor.headers]
"x-hub-signature-256" = { type = "signature", token_file = "/run/secrets/github_webhook_secret", signature_prefix = "sha256=", signature_on = "body", signature_encoding = "hex" }

Configure in GitHub: Settings → Webhooks → Add webhook → https://collector:8080/webhook/github

GitLab webhooks

toml
[sources.gitlab_events]
enabled = true
transformer_refs = ["gitlab_to_cdevents"]

[sources.gitlab_events.extractor]
type = "webhook"
id = "gitlab"
headers_to_keep = ["X-Gitlab-Event", "X-Gitlab-Event-UUID"]

[sources.gitlab_events.extractor.headers]
"x-gitlab-token" = { type = "secret", value_file = "/run/secrets/gitlab_webhook_token" }

Multiple independent webhook sources

Define one source per external system to apply different transformers:

toml
[sources.github]
enabled = true
transformer_refs = ["github_to_cdevents"]

[sources.github.extractor]
type = "webhook"
id = "github"

[sources.argocd]
enabled = true
transformer_refs = ["argocd_to_cdevents"]

[sources.argocd.extractor]
type = "webhook"
id = "argocd"