Skip to main content
Check environment and feature availability before following this guide.
A wrong message in Slack stays wrong for everyone who reads it later, and AI tools that read your workspace take it as fact. A correction posted underneath doesn’t remove it. LithoBlocks can change or remove the message itself. Every message LithoBlocks delivers is recorded, whichever way it was sent: the API, the web app, /lb-send, a scheduled message or a batch digest. The record has its own id, message_id, which every send returns.

Who can change what

An API key’s sends count as its owner’s. Over the API these need the messages:read, messages:update and messages:delete scopes. Existing keys don’t get them automatically, so add them to a key that should have them.

Find a message

Use the message_id a send returned, or list messages:
You can filter by template_id, channel_id, message_ts (with channel_id), lifecycle (live, deleted, expired), source, reference, sent time and expires_before. GET /v1/messages/{id} adds the blocks as LithoBlocks last posted them, and GET /v1/messages/{id}/events lists every change and who made it. A reference is your own handle for a message, given when you send it:
It doesn’t need to be unique; a bulk send gives every destination’s message the same one. With a reference, your automation can find “the messages for ticket 123” without storing our ids. In the web app, Sent messages lists them all. Search by template, reference, text or channel, or paste a Slack message link.

Correct the text

Change the words in place: header, section, section field, context and markdown text. Buttons, links and what they do stay as sent. Correcting text is free.
  • index is the block’s position in blocks from GET /v1/messages/{id}.
  • path is text.text (header, section), fields.N.text (a section field), elements.N.text (context) or text (markdown).
  • remove_blocks removes whole blocks.
  • text, if you give it, replaces the notification text; otherwise it’s written from the blocks.
Text can be corrected only when LithoBlocks’ copy is exactly what Slack shows (text_editable is true). A message sent from the web app with sensitive values redacted isn’t; re-render it instead.

Re-render with corrected data

Compile the message again from its template with the data it should have had. This costs one credit, charged only when Slack accepts the change.
version is sent (the template version the message was sent from, the default) or current (the template’s live version). Pass the data in full: it replaces what the message was sent with.

Delete

Deleting can’t be undone, and people may already have read the message. Replies in its thread stay, under Slack’s “This message was deleted”. scrub=true also clears LithoBlocks’ copy of what the message said: its blocks, metadata, notification text and the send’s logged input. The record and its history stay.

Revisions and conflicts

Every change names the revision you read. If the message changed since (someone else corrected it, a button updated it, it expired), nothing happens and the answer is 409 revision_conflict. Read it again and decide. After slack_outcome_unknown the message is held. LithoBlocks can’t read messages back from Slack, so a person has to look and say what happened. Until then nothing else can change the message:
The web app shows these messages under Needs review, where you say whether the change reached Slack. Never retry a lost change with a new idempotency key; resolve it.

From MCP and the SDK

AI assistants connected over MCP have list_messages, get_message, update_message, delete_message and reconcile_message. LithoBlocks’ instructions tell them to correct a wrong message rather than post a correction under it. The TypeScript SDK has client.messages.list, get, update, delete and reconcile. To retire a message on a schedule instead, see Expiring messages.