slack://
Slack producer (incoming-webhook OR chat.postMessage) + polling
consumer (conversations.history). Stdlib HTTP — no Slack SDK dependency.
URI shape
slack://#<channel>?token=xoxb-… # Web API producer + consumer
slack://?webhookUrl=https://hooks.slack.com/services/… # incoming-webhook producer
The leading # is canonical Slack form and is stripped at parse
time. Channel can also be passed as ?channel=… (channel name or
channel ID — IDs are auto-detected by their C/G/D prefix).
Parameters
Common
| Param |
Type |
Default |
Description |
channel |
string |
from URI |
Target channel name (or channel ID for consumer). |
token |
string |
— |
Slack bot/user token (xoxb-… / xoxp-…). Required for Web API producer + any consumer. |
Consumer
| Param |
Type |
Default |
Description |
conversationType |
enum |
PUBLIC_CHANNEL |
conversations.list type filter (PUBLIC_CHANNEL / PRIVATE_CHANNEL / MPIM / IM). |
maxResults |
integer |
10 |
Cap on messages dispatched per poll. |
naturalOrder |
boolean |
false |
Emit oldest-first (Slack API returns newest-first). |
sendEmptyMessageWhenIdle |
boolean |
false |
Emit a heartbeat Exchange when poll yields zero messages. |
serverUrl |
string |
https://slack.com |
Slack API base URL (overridable for tests). |
Producer
| Param |
Type |
Default |
Description |
webhookUrl |
string |
— |
Incoming-webhook URL. Mutually exclusive with token posting. |
iconEmoji |
string |
— |
icon_emoji for the posted message (e.g. :robot_face:). |
iconUrl |
string |
— |
icon_url for the posted message. |
username |
string |
— |
username (display-name override) for the posted message. |
Polling scheduler
delay (default 60s), initialDelay (1s), useFixedDelay,
repeatCount, greedy, pollInterval (legacy alias for delay).
| Header |
Direction |
Notes |
HelixSlackChannel |
Both |
Per-message channel override (producer); written by consumer on each emitted message. |
HelixSlackTimestamp |
Written by consumer + producer |
The Slack ts field. Written by the producer with the value returned from chat.postMessage. |
HelixSlackUser |
Written by consumer |
The Slack user ID who sent the message. |
HelixSlackEventType |
Written by consumer |
Event type (message/empty/…). |
HelixSlackBlocks |
Read by producer |
Block Kit []any (or []map[string]any) passed straight through into the blocks field. |
HelixSlackThreadTS |
Read by producer |
Sets thread_ts for thread replies. |
YAML examples
workflows:
# 1. Webhook producer — fire-and-forget alerts to an incoming-webhook URL.
- id: slack-webhook-alert
description: Post to a Slack incoming-webhook on every direct:// message.
trigger:
uri: direct://alert
steps:
- to: slack://?webhookUrl=https://hooks.slack.com/services/XXX/YYY/ZZZ&username=helix-alerts&iconEmoji=:rocket:
# 2. Token-based producer — post to a channel by name.
- id: slack-channel-post
description: Post via chat.postMessage using a bot token.
trigger:
uri: direct://ops-message
steps:
- to: slack://#ops?token=xoxb-…&username=Helix&iconEmoji=:robot_face:
# 3. Block Kit producer — rich message via HelixSlackBlocks header.
- id: slack-blocks
description: Send a Block Kit message.
trigger:
uri: direct://rich-message
steps:
- set-header:
name: HelixSlackBlocks
starlang: |
[
{type: "section", text: {type: "mrkdwn", text: "*Status:* :large_green_circle: All good"}},
{type: "context", elements: [{type: "mrkdwn", text: "_via Helix_"}]}
]
- to: slack://#ops?token=xoxb-…
# 4. Polling consumer — emit each new message in a channel.
- id: slack-consume
description: Poll #incoming for new messages, oldest-first.
trigger:
uri: slack://#incoming?token=xoxb-…&conversationType=PUBLIC_CHANNEL&maxResults=20&naturalOrder=true&delay=10s
steps:
- log:
message: "[${headers.HelixSlackTimestamp}] ${headers.HelixSlackUser}: ${body}"
# 5. Thread reply.
- id: slack-thread-reply
description: Reply in a thread.
trigger:
uri: direct://reply
steps:
- set-header:
name: HelixSlackThreadTS
starlang: headers["original_ts"]
- to: slack://#alerts?token=xoxb-…
See also
http-server:// — pair with this if you need Slack
Events API push delivery (Slack POSTs JSON events to a public HTTPS
endpoint).