data. In an SDK handler these fields arrive at the top level of the
context, next to reintersect, actor, env, config and waitUntil. Literal values such as
origin are open: new values can appear, so handle unknown ones.
Text fields such as titles are at most 300 characters, and bodies (
summary, recap, text) at
most 4,000.
Shared shapes
circleId, conversationId and replyId are null when they don’t apply:
replyId is null for an object in the conversation’s opening post, and conversationId is null
for a chat message that isn’t filed in a conversation. When Reintersect files a chat message into a
conversation later, or someone moves it, message.filed tells you where it went.
app.installed
version is the installed app version number. config is the install config the admin filled in.
app.uninstalled
app.reconsentRequired
widened lists every kind of access the new version adds: "scopes", "egress_hosts",
"domains", "events", "mcp", "actions" or "message_actions". It can include kinds the
added* lists don’t cover, such as a new MCP server or new actions. New categories may appear, so
treat unknown values as “more access”.
The install stays on currentVersion until an admin approves. See
Publishing new versions.
block.created
clone means a member pasted a copy of an existing block; it starts with fresh state.
block.removed
reference.created and reference.removed
conversations:read and only arrive from circles your app can
reach, because the occurrence tells you where a
member linked your object.
decision.published and decision.updated
call.recapReady
post.created
reply.created
app.mentioned
reply.created and app.mentioned also cover chat messages. A chat message
not filed in a conversation has conversationId (and, for reply.created, conversationTitle) set
to null; answer it with replyTo or circleId. See Writing to circles.
Mentions by members also invite your app to that circle.
message.filed
previousConversationId is null when the message wasn’t filed before, and
conversationId (with conversationTitle) is null when it was unfiled. filing says who placed it:
machine for Reintersect, corrected for a member’s correction, explicit for a message sent
straight into a conversation. A message staying where it was sends nothing, and your app never hears
about its own messages.
conversation.updated
line (where it stands), status and the people it’s waiting
on. title is empty until the conversation has one. label is the circle’s own name for the status,
or null when the conversation shows the plain phase.
Reintersect refreshes cards often, so it gathers changes for about 30 seconds and sends one event with
the latest card. changed lists what differs from the card as it was before those changes. Nothing is
sent when no field you can see changed. source is person when a member set one of the changed
fields, such as a status.
revision is the card’s revision, which only goes up. Deliveries can arrive out of order, so keep the
highest revision you have seen for each conversation and ignore a delivery with a lower one. Still
apply a delivery with the same revision, because a member’s change, such as setting a status, keeps
the revision.
conversation.agreed
machine), or a member confirmed the agreement
(person). statement is what was agreed and sourceMessageIds are the messages behind it: the
proposal first, then the replies that backed it. sourceMessageIds can be empty for an agreement
made on a call. revision is the card’s revision when the agreement was recorded, the same counter as
conversation.updated: ignore an agreement older than the last revision you saw for that
conversation. Dismissing an agreement sends nothing.
message.filed, conversation.updated and conversation.agreed exist only in circles that use chat,
not in circles set to posts.
The envelope
Without the SDK, each event arrives as a signedPOST with this body. See the
delivery protocol.