| Category | Events |
|---|---|
| security | Denied sign-ins/step-ups, staff identity/role changes, configuration/hook changes and qualifying denied or failed actions. |
| access | Customer or school access restrictions/restoration, credential revocation and organisation API blocking. |
| user | Customer name/email changes, deletion requests and restoration. |
| retention | Holds, purges, school closure, export and erasure actions. |
| data_access | Audited viewing of private customer metadata/content fields and attachment downloads; potentially high volume. |
type is staff. plus the first category in the defined category order; use categories to inspect every match. Routine desk work and rollups do not necessarily produce a staff webhook. Test delivery uses staff.security, action hooks.test, audit ID test and sequence zero.type StaffHookEvent = {
id: string;
type: `staff.${"security" | "access" | "user" | "retention" | "data_access"}`;
categories: string[];
created: string;
data: {
action: string;
outcome: string;
actor: { sub: string; role: string };
target: { type: string; id: string };
at: string;
audit: { id: string; seq: number };
};
};created is event creation time; data.at is the audit entry time. The sequence can support reconciliation but does not establish delivery ordering.t=<Unix seconds>,v1=<hex HMAC-SHA256> over the exact <timestamp>.<raw body> string using the endpoint's secret. Verify the raw request bytes before parsing/re-serializing JSON, use a constant-time comparison, and apply a receiver timestamp/replay policy. The secret is revealed once by hook creation; it is not a staff session or a personal developer token.shared/staff-hooks.ts, shared/staff-hook-categories.ts, admin/src/jobs/staff-hooks.ts, admin/src/admin/staff-hooks-admin.ts, and src/cloud/webhooks.ts. This is the source-derived receiver contract; no live delivery was sent during this documentation task.