Webhook guide

Receive Aurora activity without treating a notification like authorization.

The exact signing contract, event catalog, delivery guarantees, and receiver pattern for Aurora workspace webhooks.

Four event families

Projects, issues, issue sub-tasks, and issue-container milestones.

Purpose

Webhooks are signed wake-up signals

Aurora webhooks tell a receiver that supported workspace activity occurred. They are useful for waking a worker or refreshing a cache, but they are not a durable event stream and they do not grant access to Aurora.

Workspace scoped

Each endpoint belongs to one workspace and receives only its selected event types.

Signed

Every request carries an HMAC-SHA256 signature over the timestamp and exact raw body.

Separate credentials

The receiver needs its own PAT or OAuth credential before it reads or changes Aurora data.

Setup

Configure an endpoint

Workspace owners and admins create webhook endpoints from Settings -> Admin -> Integrations.

FieldRequirement
NameA recognizable receiver or workflow name
Delivery URLAn http or https endpoint; https is strongly recommended
EventsAt least one supported event type
Signing secretReturned once at creation; store it immediately in the receiver's secret manager

Rotation and changes

Webhook settings currently support list, create, and delete. To change the URL, selected events, or signing secret, remove the endpoint and create a replacement.

Contract

Delivery envelope and headers

Aurora sends one JSON POST to each matching active endpoint. Treat payload fields as a trigger snapshot and re-read current state before acting.

Envelope
{
  "event": "issue.updated",
  "payload": {
    "issue": {
      "id": "issue-id",
      "key": "ENG-123"
    }
  },
  "sentAt": "2026-08-06T20:15:00.000Z"
}
HeaderValue
content-typeapplication/json
x-aurora-eventThe event name, matching the envelope event field
x-aurora-signaturesha256=<hex HMAC digest>
x-aurora-timestampUnix epoch milliseconds used in the signed payload

Security

Verify the raw-body signature

Build the signed payload from the timestamp header, a period, and the exact UTF-8 request body before JSON parsing.

Node.js verification with a five-minute replay window
import { createHmac, timingSafeEqual } from "node:crypto";

export function verifyAuroraWebhook({ rawBody, timestamp, signature, secret }) {
  if (!timestamp || !signature) return false;

  const sentAtMs = Number(timestamp);
  if (!Number.isFinite(sentAtMs) || Math.abs(Date.now() - sentAtMs) > 5 * 60_000) {
    return false;
  }

  const expected = `sha256=${createHmac("sha256", secret)
    .update(`${timestamp}.${rawBody}`)
    .digest("hex")}`;
  const expectedBytes = Buffer.from(expected);
  const actualBytes = Buffer.from(signature);

  return expectedBytes.length === actualBytes.length &&
    timingSafeEqual(expectedBytes, actualBytes);
}

Verification order

Preserve the raw body, require the timestamp and signature, reject stale epoch-millisecond timestamps, compare in constant time, and only then parse or enqueue the payload.

Catalog

Supported event types

Meeting and discussion mutations do not have their own event families today. Actions that create an issue can still produce issue.created.

EventTriggerPayload intent
project.createdA project is createdProject summary
project.updatedProject metadata changesUpdated project summary
project.deletedA project is deletedDeleted project identity
issue.createdA mainline issue is createdIssue summary
issue.updatedA mainline issue changesUpdated issue summary
issue.deletedA mainline issue is deletedDeleted issue identity
issue.subtask.createdA sub-task is createdParent issue and sub-task summary
issue.subtask.updatedA sub-task changesParent issue and updated sub-task summary
issue.subtask.deletedA sub-task is deletedParent issue and deleted sub-task identity
issue.subtask.promotedA sub-task becomes a mainline issueSource sub-task and promoted issue summary
issue_container.milestone.createdA container milestone is createdContainer and milestone summary
issue_container.milestone.updatedA container milestone changesContainer and updated milestone summary
issue_container.milestone.deletedA container milestone is deletedContainer and deleted milestone identity
issue_container.milestone.commentedA milestone comment is addedContainer, milestone, and comment summary

Reliability

Current delivery behavior

The current sender favors low-latency notification over durable delivery. Design receivers around the guarantees that exist today.

BehaviorCurrent contract
DispatchOne immediate POST to every active endpoint subscribed to the event
Success trackinglastTriggeredAt changes only after a successful HTTP response
RetriesNone today for network failures or non-2xx responses
Delivery historyNo durable delivery record, replay endpoint, or response-body log
TimeoutNo explicit sender timeout today
Event idNo stable event id is included; consumers must define their own idempotency strategy

Correctness requires reconciliation

Return a 2xx response quickly after verification, enqueue durable work on your side, and reconcile with API polling when missing a notification would be harmful. Aurora does not retry failed deliveries today.

Implementation

Recommended receiver pattern

Keep the HTTP handler small and move authorization, state checks, and agent work behind your own durable queue.

Receiver sequence
1. Verify the signature and replay window against the raw body.
2. Enqueue the envelope and return 202 Accepted.
3. Select a separately stored Aurora PAT or OAuth credential.
4. Re-read the referenced resource through /api/external/* or MCP.
5. Confirm the principal still has the required project access.
6. Re-evaluate assignment and status before acting.
7. Use Idempotency-Key on downstream create operations.
8. Write a durable Aurora comment or status result.

Boundaries

Current boundaries

Plan around these limitations instead of assuming queue semantics Aurora does not yet provide.

No replay service

Aurora does not expose delivery attempts, replay controls, or test-delivery endpoints today.

Partial emitter coverage

Project and mainline issue events cover listed browser and external flows. Sub-task and milestone emitters currently live in external routes.

Need the API contract too?

Use the API reference to re-read the current resource after a webhook wakes your worker.