Message Resource
A message represents a piece of content sent in a room or conversation. Messages can contain text, embeds, attachments, and stickers. The content field is nullable to support sticker-only or attachment-only messages.
Message Object
| Field | Type | Description |
|---|---|---|
id | string | The message's UUID (v7, time-ordered) |
room_id | string? | The UUID of the room the message was sent in |
author_id | string? | The UUID of the user who sent the message. Null for webhook messages. |
content | string? | The text content of the message (null for sticker-only or attachment-only messages) |
type | integer | The message type: 0 a message someone wrote, 1 a voice note, 2 a pin notice (see below) |
created_at | ISO 8601 | When the message was created |
updated_at | ISO 8601 | When the message was last updated |
pinned_at | ISO 8601? | When the message was pinned in its room or conversation; null while it isn't |
deleted_at | string? | ISO 8601 soft-delete timestamp |
conversation_id | string? | The UUID of the conversation (for DM/group messages) |
ref_type | integer? | The reference type (e.g., reply) |
ref_message_id | string? | The UUID of the referenced message |
ref_room_id | string? | The UUID of the room of the referenced message |
ref_space_id | string? | The UUID of the space of the referenced message |
embeds | Embed[]? | Array of embedded content (links, media) |
sticker_attachment_id | string? | The attachment ID of the sticker, if the message is a sticker message |
webhook_id | string? | The UUID of the webhook that sent this message. Null for user messages. |
author_idis null for webhook messages. Usewebhook_idto identify the source webhook. Theuserfield in gateway events will contain a synthetic user built fromwebhook_author.
webhook_authoris stored internally but hidden from JSON responses. It is used server-side to populate theuserfield and reply previews for webhook messages.
Pin Notices
Pinning a message (see the pins endpoints of rooms and conversations) posts a message of type 2 in its room or conversation: its author is who pinned it, its content is null, and its referenced_message is the pinned message. Only the API writes them: a message sent with type 2 is rejected, and a pin notice can’t be edited or pinned. Being its author doesn’t let the pinner delete it: in a room that takes Manage Messages, in a group its owner, and in a DM either member can. The message stays pinned. They aren’t message search results, and a thread doesn’t list them as replies.
WebhookAuthor Object
Stored as JSONB in the webhook_author column. Contains a snapshot of the webhook’s identity at the time the message was sent.
| Field | Type | Description |
|---|---|---|
username | string | The webhook's display name when the message was sent |
avatar | string? | The webhook's avatar attachment ID when the message was sent |
Webhook Messages
When a message is sent via a webhook:
author_idisnullwebhook_idcontains the webhook’s UUIDwebhook_authorstores the username and avatar used at send time- In gateway events (
MESSAGE_CREATE), theuserfield contains a synthetic user withid = webhook_id,usernameandavatarfrom the webhook, andis_bot = true - In reply previews, the author name and avatar are resolved from
webhook_authorwhen the referenced message has noauthor_id
Example (User Message)
{
"id": "019cf96a-7d5f-7e4a-bf6a-4c5d6e7f8091",
"room_id": "019cf96a-5b3f-7c2e-ae4f-2b3c4d5e6f70",
"author_id": "019cf96a-3d5b-72c5-830f-75e85355d078",
"content": "Hello everyone!",
"type": 0,
"created_at": "2026-01-15T09:30:00.000Z",
"updated_at": "2026-01-15T09:30:00.000Z",
"webhook_id": null,
"embeds": null,
"sticker_attachment_id": null
} Example (Webhook Message)
{
"id": "019d1234-abcd-7890-ef12-345678901234",
"room_id": "019cf96a-5b3f-7c2e-ae4f-2b3c4d5e6f70",
"author_id": null,
"content": "Automated deploy notification",
"type": 0,
"created_at": "2026-04-07T10:00:00.000Z",
"updated_at": "2026-04-07T10:00:00.000Z",
"webhook_id": "019d1234-0000-7890-ef12-000000000001",
"embeds": null,
"sticker_attachment_id": null
}