Skip to content

Webhooks

Outbound webhooks let you subscribe to Colony pipeline events and receive an HTTP POST to any https:// endpoint you control. Use them to pipe Colony signals into Slack, PagerDuty, internal dashboards, or any automation that consumes HTTP.

Each webhook subscription receives notifications for the events you choose at creation time. The table below lists all event types. webhook.test fires on demand from the Test button; digest.daily is the only pipeline-driven event currently emitted. The eight pipeline and PR event types are reserved and do not yet produce deliveries.

EventWhen it firesDelivery
issue.analyzedColony finished analyzing an issue and produced a work plan — the issue is ready for development.Reserved
issue.blockedAn issue has entered a blocked state (dependency-blocked, failure-blocked, or needs-clarification) and cannot progress without intervention.Reserved
issue.doneAn issue completed the full pipeline cycle: PR merged and state reached done. This is the canonical completion event.Reserved
pr.openedColony opened a pull request for an issue. The PR URL and branch are included in the payload.Reserved
pr.approvedA reviewer approved a Colony pull request. Fires on each approval event.Reserved
pr.changes_requestedA reviewer requested changes on a Colony PR — the issue will be re-queued for development for revision.Reserved
pr.mergedA Colony pull request was successfully merged to the target branch.Reserved
cost.budget_warningLLM token spend has approached or exceeded the configured cost threshold for the billing period.Reserved
digest.dailyA scheduled daily operator digest: pipeline throughput, cost, blocked work, anomalies, and recommendations.Active
webhook.testA synthetic test event sent via the Test button.Active

To configure the email delivery channel for the daily digest — recipients, send time, timezone, and quiet mode — see Digest Notifications.

ActionOwnerAdminMemberViewer
Create webhook
Edit or delete webhook
Send test delivery
Replay a delivery
List webhooks
View delivery history
  1. Open Settings → Webhooks.
  2. Click Add webhook.
  3. Enter the URL — must start with https:// and be at most 2 048 characters.
  4. Choose a Format:
    • JSON payload (default) — Colony sends a JSON body signed with HMAC-SHA256. Use this for custom endpoints, automation platforms, and most integrations.
    • Slack message — Colony sends a Block Kit message formatted for Slack. The URL must be a hooks.slack.com incoming-webhook URL. No signature header is sent in this mode.
  5. Check the events you want to receive. At least one event is required.
  6. Optionally add a Description (up to 500 characters) to identify the webhook in the list.
  7. Click Add webhook.

When a JSON-format delivery is sent, Colony includes three headers:

HeaderValue
X-Colony-Signaturesha256=<hex> — HMAC-SHA256 of the raw request body, keyed with the signing secret
X-Colony-EventThe event type, e.g. issue.done
X-Colony-Delivery-IdA UUID that uniquely identifies this delivery attempt

The signing secret is a 64-character hex string (32 random bytes). To verify a delivery, compute HMAC-SHA256(secret, rawBody) and compare the result against the value in X-Colony-Signature after stripping the sha256= prefix. Always compare in constant time to prevent timing attacks.

  1. Open Settings → Webhooks.
  2. In the webhook row, click Test.
  3. Colony queues a synthetic webhook.test delivery immediately. The test payload contains the event name, webhook ID, the user who triggered it, and a timestamp.
  4. Click History on the same row to watch the delivery status update.

The test delivery follows the same retry and signing logic as a real event delivery.

  1. Open Settings → Webhooks.
  2. In the webhook row, click History.
  3. The delivery history panel shows the most recent 100 deliveries, newest first.

Each row shows:

ColumnDescription
EventThe event type that triggered the delivery
Statuspending — queued, not yet attempted; retrying — at least one attempt failed, more scheduled; delivered — endpoint returned 2xx; failed — all attempts exhausted
AttemptsNumber of delivery attempts made so far
ResponseHTTP status code from the most recent attempt
CreatedWhen the delivery was first queued
DeliveredWhen the endpoint returned a successful 2xx response
  1. Open Settings → Webhooks.
  2. Click History on the webhook row.
  3. Find a delivery with status failed or retrying and click Replay.
  4. Colony resets the delivery’s attempt counter to zero and queues it for immediate re-delivery.

Replaying does not create a new delivery record — it reuses the existing one, resetting its state to pending and scheduling it to fire right away.

Colony attempts each delivery up to 7 times. If the initial attempt fails, the remaining retries are spaced with exponential back-off plus ±20% random jitter to avoid thundering-herd bursts:

RetryDelay (approximate)
1st retry30 seconds
2nd retry2 minutes
3rd retry10 minutes
4th retry1 hour
5th retry6 hours
6th retry24 hours

Each delivery attempt has a 30-second timeout. Payloads larger than 1 MB are dropped immediately without a retry attempt.

A delivery is counted as successful when the endpoint returns any 2xx HTTP status code.