Skip to content

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.

POST /api/bot/chat.postEphemeral
Authorization: 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.

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.