Proposal: Webhooks and event subscriptions
Integrators need to react to identity events in their own systems, and operators need to stream the audit trail to a SIEM. The identity event stream (ADR-0022) is already the substrate; this exposes it outward as a projection of that stream — no new architecture.
Motivation
Provisioning, lifecycle, security, and login events (user created/updated/deprovisioned, login, MFA enrolled, risk events) are useful to downstream systems. Today they live only inside Vord. Webhooks and SIEM streaming are developer- and operator-platform table-stakes.
Design
- Subscriptions (per tenant, via the admin API, ADR-0021) to event types from the identity event stream (ADR-0022).
- Webhook delivery: signed (HMAC/asymmetric, so the receiver verifies authenticity), retried with backoff, at-least-once with idempotency keys, and dead-lettered on persistent failure. Egress is allowlisted (SSRF, §12.5); payloads are redacted of secrets/PII beyond the subscription's scope (the canonical no-secrets rule is proposal 0004's; this applies it to payloads).
- SIEM / log streaming as a sibling delivery mode (Splunk / Datadog / object-store sinks) over the same subscription model — the audit trail (ADR-0022) streamed out.
- It is a consumer/projection of the ADR-0022 identity event stream — per the revised extensibility model (ADR-0029), webhooks are a delivery projection of that stream, not a parallel event mechanism; ordering and replay remain the stream's (ADR-0022), so a subscriber can resume from a cursor.
Alternatives considered
- Polling an events API as the primary mechanism — rejected (latency, inefficiency); offered as a fallback for receivers that cannot accept webhooks.
- Direct database access to the event store — rejected (couples integrators to internals).
Graduation criteria
A tenant subscribes to event types and receives signed, retried, idempotent webhooks; failures dead-letter and are replayable from a cursor; a SIEM stream delivers the audit trail.
Backward compatibility
A projection of the event stream (ADR-0022); no architecture change.
Open questions
- Per-event-type payload schemas and their versioning.
- Delivery-guarantee vs ordering trade-offs per subscription.