Outbound webhooks let Atoll notify external systems when work changes.
Use cases
- Notify a deployment system when an issue is marked done.
- Send task changes into a data warehouse.
- Trigger internal automation on assignment or priority changes.
- Mirror updates into Slack, Discord, or another project system.
Create a webhook
Or use the API:
The create response includes an Atoll-generated signing secret. Store it immediately; it is shown only once. This is distinct from the receiver-supplied Standard Webhooks whsec_ secret. Later list responses show only an origin-level destination_display, never URL paths, query credentials, or signing material.
Automation destinations use the same webhook resource. Set purpose to
automation (or both) and use auth: { "type": "bearer", "secret": "..." }
when the receiver requires Authorization: Bearer .... The token is stored in
the private versioned destination configuration and is never returned after a
write. Lists show only whether a Bearer token is configured.
An automation rule with the Issue assigned trigger also runs when a task is
created with an assignee. This includes recurring occurrences that inherit an
assignee. Use one assignment rule for creation, later assignment, and
reassignment; you do not need a second Issue created rule for the same
receiver.
Bearer secrets must contain only printable ASCII characters. Switching from none to Bearer requires a token and returns HTTP 400 if it is missing.
Set standard_webhooks.enabled to true with the receiver’s whsec_ secret to
also send Standard Webhooks headers. The secret is write-only and must be
canonical standard Base64 after whsec_, decoding to 24-64 bytes. Atoll signs
the exact raw body with webhook-id + "." + webhook-timestamp + "." + rawBody
using HMAC-SHA256 and sends webhook-signature: v1,<base64>, webhook-id, and
webhook-timestamp. The existing Atoll signature headers remain present. Every
outbound logical delivery also includes Idempotency-Key; automatic retries
keep the same value, while manual redelivery uses a new value. Each attempt
gets a fresh Standard timestamp and signature. A 2xx response proves receiver
acceptance only.
Receiver setup
Grok Automations supports this Standard Webhooks option. Configure the
Atoll destination as an automation destination with the whsec_ value from
Grok. Grok checks the three Standard headers and the five-minute timestamp
window; HTTP 202 means the event was accepted for processing, not that the
automation completed.
Hermes supports the same Standard Webhooks whsec_ verification on a
public HTTPS /webhooks/<route> endpoint. Configure the Hermes receiver
route/filter with events: ["automation.action"]; this is a Hermes receiver
setting. In Atoll, set the destination purpose to automation (or both)
and trigger it with an explicit send_webhook action; the Atoll destination
events field does not select automation actions. Hermes should allowlist and
render the v3 fields when present: data.project, data.issue,
data.automation.ruleId, data.automation.ruleName,
data.trigger.eventType, and data.trigger.changedFields. Issue payloads also
include the current persisted id, optional identifier and url, title,
status, priority, assigneeId, updatedAt, and an optional privacy-safe
artifacts count. CI payloads set data.issue to null and retain only the
useful ci fields, so handle CI events separately. Hermes can use webhook-id
for one-hour deduplication. A 2xx response is receiver acceptance, not proof of
agent completion. No live Hermes receiver test was run; this setup guidance is
based on source compatibility.
An automation rule references only the webhook UUID:
The action sends one automation.action payload through the existing delivery
queue. New automation deliveries use payload schema version 3. Retries
preserve the same delivery ID; a manual redelivery is a new logical delivery.
trigger.changedFields contains sorted public names from title, status,
priority, assigneeId, and projectId; raw before/after values are never
serialized. artifacts counts direct issue links in the same organization and
is omitted if that optional lookup fails, returns an invalid type, or cannot
complete within the bounded 1,000-row pagination limit. Projectless
issues use project: null and include the canonical organization issue URL when
available. CI events use issue: null, omit issue changes and artifact counts,
and retain ci.provider, repository, workflow, conclusion, branch, and
runUrl. Delivery identity stays in X-Atoll-Delivery-Id, webhook-id, and
Idempotency-Key; it is not repeated in the v3 body. Subscription broadcasts
and ping remain schema version 2. Existing queued payloads retain their
stored schema and content; manual replay preserves v3 body content and rewrites
a body deliveryId only for legacy v2 automation rows.
Atoll signs deliveries in the X-Atoll-Signature header as sha256=<hmac>, where the HMAC-SHA256 key is the SHA-256 hex digest of that secret and the message is the exact raw request body. X-Atoll-Signature-Version and X-Atoll-Signatures support bounded signing-key overlap. Each delivery also includes X-Atoll-Delivery-Id for receiver-side deduplication.
Automation action payloads use schema version 3 with current issue/project
enrichment and safe changed field names. Subscription broadcasts and ping
remain schema version 2. Both versions omit descriptions, comment bodies, raw
before/after values, and unrelated source data.
Update a destination
Use Edit in Webhook Settings, or PATCH /api/webhooks/{id}, to change its
URL, purpose, event subscriptions, enabled state, or authentication. Omitted
fields are preserved. For Bearer authentication, an omitted or blank secret
keeps the configured token; auth: { "type": "none" } clears it. Switching from
none to Bearer requires a token. URL and authentication changes create a new
private destination version. Previously queued deliveries retain the old version.
standard_webhooks is omitted from list responses except for its safe
configured boolean. Omit the object on update to preserve it, set
enabled: true with a blank secret to preserve an existing secret, provide a
new valid secret to replace it, or set enabled: false to clear it.
subscription receives matching broadcast events; an empty event list matches
all broadcast events. automation receives only explicit rule actions, regardless
of its event list. both permits both uses. All three purposes support a test ping.
Automation payload
A send_webhook action sends schema version 3 with
event: "automation.action". The top-level timestamp is the source event
time and orgId is the organization. The data object contains:
changedFields contains only title, status, priority, assigneeId, and
projectId; raw before/after values are omitted. Artifact counts cover direct
issue links in the same organization and the field is omitted when the optional
lookup fails, returns an invalid type, or cannot complete within the bounded
1,000-row pagination limit. Descriptions, comments, private
headers, credentials, raw audit metadata, and receiver response bodies are
excluded. Subscription broadcasts and ping remain schema version 2, and
existing queued payloads retain their stored schema and content. Automatic
retries keep the payload and delivery ID. Manual redelivery preserves v3 body
content and rewrites a body deliveryId only for legacy v2 automation payloads
that already contain it.
Inspect deliveries
Delivery history keeps safe outcome metadata, retry status, stable error_code, and next retry time. It does not return payloads, receiver response bodies, or raw errors. Atoll performs one 30-second request attempt per delivery invocation. Network failures and 5xx responses are recorded as retry_pending with next_retry_at; an internal drain retries due deliveries every 15 minutes.
Redeliver
Use redelivery after the receiving endpoint has been fixed.
Test
The test route sends a distinct ping event. It creates delivery evidence only, without an automation event, run, or action run.
Webhook URLs must use HTTPS DNS hostnames. IP literals, localhost, and .local hosts are rejected, private or otherwise non-public DNS results are blocked at delivery time, and redirects are not followed.