Complete reference for all Pivot webhook event payloads.
This page documents the JSON payloads delivered to your webhook endpoints. All field names use camelCase. For setup instructions, see Webhooks.
Every webhook event shares this structure:
| Field | Type | Description |
|---|---|---|
eventType | string | The event type identifier |
organizationId | string | The organization this event belongs to |
spaceId | string | The space containing the subject |
subject | object | { type, id } — the entity that triggered |
timestamp | string | ISO 8601 timestamp of when the event fired |
data | object | Event-specific payload (see below) |
Triggered when a message is sent in a subscribed room.
Data fields:
| Field | Type | Description |
|---|---|---|
messageId | string | The unique identifier of the message. |
roomId | string | The room the message was sent in. |
userId | string | The user who sent the message. |
status | string | The message status (e.g. “SENT”). |
createdAt | string | When the message was created (ISO 8601). |
richContent | google.protobuf.Struct | Structured rich text content of the message body (Lexical JSON). |
threadParentMessageId | string | The parent message ID when this message is a thread reply. Empty string if not a thread reply. |
inlineReplyMessageId | string | The message ID this message is an inline reply to. Empty string if not an inline reply. |
type | string | The message type (e.g. “MESSAGE_TYPE_UNSPECIFIED”, “MESSAGE_TYPE_VIDEO_CALL”, “MESSAGE_TYPE_AUDIO_CALL”). |
sentAt | string | When the message was sent (ISO 8601). Empty string if not yet sent. |
threadRootMessageId | string | The thread root message ID when this message is a (possibly nested) thread reply. Empty string for top-level messages. Together with room_id and sent_at this is the message’s storage locator; pass it back on message reads for partition-addressed lookups. |
Payload example:
{ "eventType": "message_sent", "organizationId": "organization-uuid", "spaceId": "space-uuid", "subject": { "type": "room", "id": "example-id" }, "timestamp": "2026-01-01T12:00:00Z", "data": { "messageId": "message-uuid", "roomId": "room-uuid", "userId": "user-uuid", "status": "SENT", "createdAt": "2026-01-01T12:00:00Z", "richContent": { "key": "value" }, "threadParentMessageId": "thread_parent_message-uuid", "inlineReplyMessageId": "inline_reply_message-uuid", "type": "MESSAGE_TYPE_UNSPECIFIED", "sentAt": "2026-01-01T12:00:00Z", "threadRootMessageId": "thread_root_message-uuid" }}Triggered when a message is deleted in a subscribed room.
Data fields:
| Field | Type | Description |
|---|---|---|
messageId | string | The unique identifier of the deleted message. |
roomId | string | The room the message was in. |
userId | string | The user who deleted the message. |
status | string | The message status (e.g. “DELETED”). |
deletedAt | string | When the message was deleted (ISO 8601). |
sentAt | string | When the message was originally sent (ISO 8601). Empty string if unknown. |
threadParentMessageId | string | The parent message ID when the deleted message was a thread reply. |
threadRootMessageId | string | The thread root message ID when the deleted message was a (possibly nested) thread reply. Empty string for top-level messages. |
Payload example:
{ "eventType": "message_deleted", "organizationId": "organization-uuid", "spaceId": "space-uuid", "subject": { "type": "room", "id": "example-id" }, "timestamp": "2026-01-01T12:00:00Z", "data": { "messageId": "message-uuid", "roomId": "room-uuid", "userId": "user-uuid", "status": "DELETED", "deletedAt": "2026-01-01T12:00:00Z", "sentAt": "2026-01-01T12:00:00Z", "threadParentMessageId": "thread_parent_message-uuid", "threadRootMessageId": "thread_root_message-uuid" }}Triggered when a message is edited in a subscribed room.
Data fields:
| Field | Type | Description |
|---|---|---|
messageId | string | The unique identifier of the edited message. |
roomId | string | The room the message is in. |
userId | string | The user who edited the message. |
status | string | The message status (e.g. “SENT”). |
updatedAt | string | When the message was last updated (ISO 8601). |
richContent | google.protobuf.Struct | Structured rich text content of the message body (Lexical JSON). |
threadParentMessageId | string | The parent message ID when this message is a thread reply. Empty string if not a thread reply. |
inlineReplyMessageId | string | The message ID this message is an inline reply to. Empty string if not an inline reply. |
type | string | The message type (e.g. “MESSAGE_TYPE_UNSPECIFIED”, “MESSAGE_TYPE_VIDEO_CALL”, “MESSAGE_TYPE_AUDIO_CALL”). |
sentAt | string | When the message was sent (ISO 8601). Empty string if not yet sent. |
threadRootMessageId | string | The thread root message ID when this message is a (possibly nested) thread reply. Empty string for top-level messages. |
Payload example:
{ "eventType": "message_edited", "organizationId": "organization-uuid", "spaceId": "space-uuid", "subject": { "type": "room", "id": "example-id" }, "timestamp": "2026-01-01T12:00:00Z", "data": { "messageId": "message-uuid", "roomId": "room-uuid", "userId": "user-uuid", "status": "SENT", "updatedAt": "2026-01-01T12:00:00Z", "richContent": { "key": "value" }, "threadParentMessageId": "thread_parent_message-uuid", "inlineReplyMessageId": "inline_reply_message-uuid", "type": "MESSAGE_TYPE_UNSPECIFIED", "sentAt": "2026-01-01T12:00:00Z", "threadRootMessageId": "thread_root_message-uuid" }}Triggered when a room recording transcript is ready.
Data fields:
| Field | Type | Description |
|---|---|---|
recordingId | string | The unique identifier of the recording. |
roomId | string | The room the recording belongs to. |
createdAt | string | When the recording was created (ISO 8601). |
Payload example:
{ "eventType": "room_recording_transcript_published", "organizationId": "organization-uuid", "spaceId": "space-uuid", "subject": { "type": "room", "id": "example-id" }, "timestamp": "2026-01-01T12:00:00Z", "data": { "recordingId": "recording-uuid", "roomId": "room-uuid", "createdAt": "2026-01-01T12:00:00Z" }}Triggered when a message attachment transcript is ready.
Data fields:
| Field | Type | Description |
|---|---|---|
messageId | string | The message that owns the attachment. |
roomId | string | The room containing the message. |
attachmentId | string | The attachment whose transcript became available. |
sentAt | string | When the message was sent (ISO 8601). Pass this to message read routes. |
completedAt | string | When transcription completed (ISO 8601). |
threadRootMessageId | string | The root message ID when this message is a thread reply. Empty string otherwise. |
Payload example:
{ "eventType": "message_attachment_transcript_published", "organizationId": "organization-uuid", "spaceId": "space-uuid", "subject": { "type": "message", "id": "example-id" }, "timestamp": "2026-01-01T12:00:00Z", "data": { "messageId": "message-uuid", "roomId": "room-uuid", "attachmentId": "attachment-uuid", "sentAt": "2026-01-01T12:00:00Z", "completedAt": "2026-01-01T12:00:00Z", "threadRootMessageId": "thread_root_message-uuid" }}Triggered when a block response attachment transcript is ready.
Data fields:
| Field | Type | Description |
|---|---|---|
blockResponseId | string | The block response that owns the attachment. |
blockId | string | The block containing the response. |
attachmentId | string | The attachment whose transcript became available. |
completedAt | string | When transcription completed (ISO 8601). |
Payload example:
{ "eventType": "block_response_attachment_transcript_published", "organizationId": "organization-uuid", "spaceId": "space-uuid", "subject": { "type": "blockResponse", "id": "example-id" }, "timestamp": "2026-01-01T12:00:00Z", "data": { "blockResponseId": "block_response-uuid", "blockId": "block-uuid", "attachmentId": "attachment-uuid", "completedAt": "2026-01-01T12:00:00Z" }}Triggered when a room recording video is ready.
Data fields:
| Field | Type | Description |
|---|---|---|
recordingId | string | The unique identifier of the recording. |
roomId | string | The room the recording belongs to. |
createdAt | string | When the recording was created (ISO 8601). |
Payload example:
{ "eventType": "room_recording_published", "organizationId": "organization-uuid", "spaceId": "space-uuid", "subject": { "type": "room", "id": "example-id" }, "timestamp": "2026-01-01T12:00:00Z", "data": { "recordingId": "recording-uuid", "roomId": "room-uuid", "createdAt": "2026-01-01T12:00:00Z" }}Triggered when a block response is sent on a subscribed block.
Data fields:
| Field | Type | Description |
|---|---|---|
blockResponseId | string | The unique identifier of the block response. |
blockId | string | The block the response was submitted on. |
parentBlockResponseId | string | The parent response ID when this is a threaded reply. |
userId | string | The user who sent the response. |
status | string | The response status (e.g. “BLOCK_RESPONSE_STATUS_SENT”). |
createdAt | string | When the response was created (ISO 8601). |
updatedAt | string | When the response was last updated (ISO 8601). |
richContent | google.protobuf.Struct | Structured rich text content for the response. |
attachments | BlockResponseAttachmentData[] | File attachment metadata for the response. |
Payload example:
{ "eventType": "block_response_sent", "organizationId": "organization-uuid", "spaceId": "space-uuid", "subject": { "type": "block", "id": "example-id" }, "timestamp": "2026-01-01T12:00:00Z", "data": { "blockResponseId": "block_response-uuid", "blockId": "block-uuid", "parentBlockResponseId": "parent_block_response-uuid", "userId": "user-uuid", "status": "BLOCK_RESPONSE_STATUS_SENT", "createdAt": "2026-01-01T12:00:00Z", "updatedAt": "2026-01-01T12:00:00Z", "richContent": { "key": "value" }, "attachments": [ { "id": "example-id", "fileId": "file-uuid", "fileUrl": "example-file_url", "displayName": "example-display_name", "type": "example-type", "createdAt": "2026-01-01T12:00:00Z" } ] }}Was this guide helpful?