Skip to main content
These events mirror a creator’s direct-message activity in real time. They are the successor to the legacy message.received, message.sent, and message.read events, plus new deleted and reaction events. All message events require the read:chat scope. Delivered in the Standard-Webhooks envelope; the fields below describe the data object.
creator.message.received and creator.message.sent both carry the message content, text, media_uuids, price and more. creator.message.deleted is metadata-only: for that one, use the chat API to fetch content. The two content-bearing events do not carry an identical set, see Content fields for exactly which event carries what.The conversation is addressed by the fan (fan.uuid); there is no separate chat id.
Two payload behaviours that commonly break integrations:
  • Keys are snake_case. media_uuids, message_type, is_muted, unread_messages_count, is_automated, not mediaUuids, messageType, isMuted. The deprecated flat message.received used camelCase; the creator.* envelope does not.
  • Optional fields are omitted, not nulled. An absent value has no key at all, it is never sent as null or as an empty array. A message with no media has no media_uuids key, so treat an absent key as empty rather than reading payload.data.media_uuids.length.

Message resource

Used by creator.message.received, creator.message.sent, and creator.message.deleted.

Core fields

Always present on all three events.

Content fields

creator.message.received and creator.message.sent carry the message itself. Every field here is optional in the sense described above: when the value does not apply, the key is absent from the payload, not null, not [].
creator.message.sent is not metadata-only. It carries text, media_uuids, price, gif, message_type and unread_messages_count. What it does not carry is is_muted, tip, or is_automated.creator.message.deleted carries none of this table. Fetch its content from the chat API.Content on sent is hydrated best-effort after the event is triggered. A lookup failure omits the fields rather than delaying or dropping the delivery, so an absent text on sent means “no text or not resolved”, fall back to the chat API if you need certainty.

Fan object

avatar_url is the only identity field limited to creator.message.received. creator.message.sent and creator.message.deleted carry handle and display_name but no avatar.

Example: creator.message.received

A pay-to-view message with text and two media attachments:
A plain text-only message from the same fan omits media_uuids and price entirely, the keys are not present at all.

Example: creator.message.sent

The same envelope and object as received. sender is always creator, and is_muted, tip and is_automated are never present.

Example: creator.message.deleted

The core fields only: sender names which party unsent their own message, deleted_at is the unsend time, and created_at is always null.
creator.message.deleted fires only for a single-message unsend, from the creator web app, the public API, or agency automation. Mass-message unsends, moderation takedowns, and failed scheduled sends deliberately do not emit it, so do not treat this event as a complete record of disappearing messages.

Read-receipt resource

Used by creator.message.read. This is a per-conversation read receipt, not a message entity, it reports counts rather than a message uuid. This fires only when the read actually cleared unread state. Opening an already-read conversation emits nothing, so creator.message.read is not a signal that the creator opened the chat.

Example: creator.message.read

Reaction resource

Used by creator.message.reaction. Either party can react, so this resource names three roles rather than two.
On a creator-initiated reaction actor and creator carry the same uuid. Use sender to tell the direction and fan to identify the conversation, actor alone cannot do it.Only added reactions emit. Removing a reaction produces no event; a swapped emoji arrives as a new creator.message.reaction.

Example: creator.message.reaction