This is the catalog of events Cortex emits. The same events are delivered over
webhooks, Server-Sent Events
and serverless functions — so this reference
applies no matter which surface you consume.
The envelope
Every event is a DomainEvent:
interface DomainEvent<T> {
id: string;
type: string;
source: string;
tenantId: string;
projectId?: string;
resourceId: string;
timestamp: string;
payload: ActionPayload<T>;
}
Action-typed payloads
Every payload is discriminated on an action:
| Action | Meaning | Shape |
|---|
created | A new entity | { action, data } |
updated | An entity changed | { action, data, changes } — changes holds the old values of fields that differed |
deleted | An entity was removed | { action, data } — data is the last known state |
occurred | A lifecycle moment (no create/update/delete) | { action, data } |
On updated, changes lets you see exactly what changed without keeping your own copy.
Nested objects are atomic — if any field within one changes, the whole previous nested
object is included.
Subscribing
- Webhooks — list event names when creating a subscription. Wildcards are supported:
exact (
message.created), domain (message.*) or global (*).
- Functions — export a handler named after the event (
message.created →
onMessageCreated). The subscription is derived from your exports.
- SSE — open the event stream (the SDK’s
watch() does this for you) and filter by type.
Catalog
Session
| Type | Action | Emitted when |
|---|
session.created | created | A session is created |
session.updated | updated | A session changes (e.g. status) |
session.deleted | deleted | A session is deleted |
Message
| Type | Action | Emitted when |
|---|
message.created | created | A transcribed utterance is stored |
Participant
| Type | Action | Emitted when |
|---|
participant.created | created | A participant first appears in a project |
participant.updated | updated | A participant changes (display name, email, user data) |
participant.deleted | deleted | A participant is deleted |
participant.joined | occurred | A participant joined a session or gathering |
participant.left | occurred | A participant left a session or gathering |
Annotation
| Type | Action | Emitted when |
|---|
message.annotation.created | created | A plugin produced a message-scoped annotation |
session.annotation.created | created | A plugin produced a session-scoped annotation |
Annotation events carry the plugin-defined body under a content object, and a
resourceId pointing at the annotated entity (message:{id} or session:{id}).
Sanction
| Type | Action | Emitted when |
|---|
sanction.created | created | A moderation action is applied |
sanction.updated | updated | A sanction is modified |
sanction.revoked | occurred | A sanction is lifted |
Gathering
| Type | Action | Emitted when |
|---|
gathering.created | created | A gathering is created |
gathering.updated | updated | A gathering changes |
gathering.started | occurred | A gathering starts (optionally creating a session) |
gathering.ended | occurred | A gathering ends |
gathering.cancelled | occurred | A gathering is cancelled before it starts |
Gathering members
| Type | Action | Emitted when |
|---|
gathering.member.joined | occurred | A member joined |
gathering.member.ready | occurred | A member marked ready (lobby) |
gathering.member.left | occurred | A member left |
Gathering invitations
| Type | Action | Emitted when |
|---|
gathering.invitation.sent | occurred | An invitation was created (email may be queued) |
gathering.invitation.accepted | occurred | An invitee accepted |
gathering.invitation.declined | occurred | An invitee declined |
Bot
| Type | Action | Emitted when |
|---|
bot.status.changed | occurred | The transcription bot changed status (starting / running / stopped / error) |
| Type | Action | Emitted when |
|---|
webhook.delivery.updated | updated | A webhook delivery changed status (delivered / failed / retrying) |
Example
A message.created event delivered to a webhook or function:
{
"id": "8f3c…",
"type": "message.created",
"source": "cortex:bot",
"tenantId": "…",
"projectId": "…",
"resourceId": "session:abc-123",
"timestamp": "2026-06-04T10:00:00.000Z",
"payload": {
"action": "created",
"data": {
"messageId": "…",
"sessionId": "abc-123",
"participantId": "…",
"content": "Hello everyone, let's get started."
}
}
}