Duvet DOCS
GitHub

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

FieldTypeDescription
id stringThe 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 integerThe message type: 0 a message someone wrote, 1 a voice note, 2 a pin notice (see below)
created_at ISO 8601When the message was created
updated_at ISO 8601When 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_id is null for webhook messages. Use webhook_id to identify the source webhook. The user field in gateway events will contain a synthetic user built from webhook_author.

webhook_author is stored internally but hidden from JSON responses. It is used server-side to populate the user field 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.

FieldTypeDescription
username stringThe 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_id is null
  • webhook_id contains the webhook’s UUID
  • webhook_author stores the username and avatar used at send time
  • In gateway events (MESSAGE_CREATE), the user field contains a synthetic user with id = webhook_id, username and avatar from the webhook, and is_bot = true
  • In reply previews, the author name and avatar are resolved from webhook_author when the referenced message has no author_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
}