Reply to a Slack thread by parent timestamp. reply is a top-level command,
not a subcommand of message, so the runbook for thread responses lives
here.
slick reply --channel C1234567890 --parent 1746284582.123456 --message "Investigating"
echo "Fixed in deploy 1234" | slick reply --channel C1234567890 --parent 1746284582.123456 --file -
slick reply --channel C1234567890 --parent 1746284582.123456 --blocks --file blocks.json??? note "Flags"
| Flag | Value | Description |
|------|-------|-------------|
| `-c`, `--channel` | `<CHANNEL>` | Channel ID, name, or alias |
| `-p`, `--parent` | `<TS>` | Parent message timestamp |
| `-m`, `--message` | `<TEXT>` | Message body |
| `-f`, `--file` | `<FILE>` | Read message body from file or `-` for stdin |
| `-b`, `--blocks` | | Treat message source as raw [Block Kit](https://docs.slack.dev/block-kit/) JSON |
| `-n`, `--dry-run` | | Preview without sending |
--8<-- "includes/attribution-flags.md"
=== "Human"
Human (`--dry-run`):
```text
Reply posted channel=C1234567890 ts=dry-run dry_run=true
```
A real reply renders the same shape but with the real Slack `ts` and a
`permalink=...` field appended.
=== "JSON"
JSON envelope (real reply) mirrors [`message send`](message.md#message-send)
but the data record includes `thread_ts`, and the `permalink` carries
extra query parameters identifying the parent thread:
```json
{
"data": {
"message": {
"type": "message",
"text": "Investigating",
"ts": "1778534628.573559",
"thread_ts": "1746284582.123456",
"channel": "C1234567890"
},
"permalink": "https://example.slack.com/archives/C1234567890/p1778534628573559?thread_ts=1746284582.123456&cid=C1234567890",
"attribution": true
}
}
```
JSON envelope (`--dry-run`). `ts` is the literal `"dry-run"`, `permalink`
is absent, and `dry_run: true` is present:
```json
{
"data": {
"message": {"type": "message", "text": "Investigating", "ts": "dry-run", "channel": "C1234567890", "thread_ts": "1746284582.123456"},
"dry_run": true,
"attribution": true
}
}
```
| Error | Cause | Fix |
|---|---|---|
validation_error: parent is required |
Missing --parent. |
Provide the parent message timestamp; verify with history list --thread. |
message_not_found (not_found, exit 2) |
Parent timestamp does not exist in this channel. | Confirm channel and timestamp via history. |
| Markdown handling | Same as message send: block-level fallbacks preserve source text. |
— |
message— top-level send/edit/delete.history list --thread— read replies before posting.- Slack API method:
chat.postMessage.