Ephemeral messages
An ephemeral message appears only for one person, inline in the conversation, marked Only visible to you. It isn’t saved to the conversation: it disappears when the person reloads or dismisses it — the same behaviour as Slack.
Use them for confirmations (“Your refund was queued”), private hints, or a question only the person who clicked should answer.
Send one
Section titled “Send one”POST /api/bot/chat.postEphemeralAuthorization: Bearer foxa-…{ "channel": "refunds", "user": "42bc76d7-…", "text": "Only you can see this", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "Refund *#4821* was queued. Want to undo it?" } }, { "type": "actions", "elements": [{ "type": "button", "action_id": "undo", "style": "danger", "text": { "type": "plain_text", "text": "Undo" } }] } ]}| Field | Description |
|---|---|
channel |
Channel id or short name. Required. |
user |
The person who sees it. They must be able to read the channel. Required. |
text, blocks, attachments |
As in chat.postMessage. |
thread_ts |
Show it in a thread. |
The answer is { "ok": true, "message_ts": "…" }. REST API: POST /api/v1/chat/channels/{id}/ephemeral with userId, body, blocks, attachments, parentMessageId.
Controls in ephemeral messages
Section titled “Controls in ephemeral messages”Buttons and menus work. Their block_actions payload has container.is_ephemeral: true and no message, and a response_url that can replace (replace_original) or delete (delete_original) the ephemeral message. Controls stay usable for 24 hours.
The response_url of any interaction also posts an ephemeral message when you send text or blocks without response_type — Slack’s default.