Communication & Messaging
Channel-specific send and read actions for Slack, Telegram, WhatsApp, Instagram, Twitter/X, Microsoft Teams, email, and RSS feeds. These are workflow steps — for inbound events (new Slack messages, Telegram updates, incoming emails), see the corresponding poller triggers in Triggers.
slack-send
Sends a message to a Slack channel or opens a DM with a user, via chat.postMessage. Supports thread replies and Block Kit layouts.
Auth: a Slack OAuth connection_id (preferred — resolved server-side into auth.fields.token), or a bot token via token (e.g. {{ secret.SLACK_BOT_TOKEN }}).
{
"id": "notify_slack",
"type": "slack-send",
"config": {
"connection_id": "{{ connections.slack }}",
"channel": "#general",
"text": "{{ steps.llm.text }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
connection_id | string | — | OAuth Slack connection (preferred). Resolved upstream to auth.fields.token. |
token | string | — | Bot token, e.g. {{ secret.SLACK_BOT_TOKEN }}. Fallback if no connection. |
channel | string | — | Channel ID or name, e.g. #general or C012AB3CD. Required unless user_id is set. |
user_id | string | — | Slack user ID. If set and channel is empty, opens a DM via conversations.open and sends there. |
text | string | — | Message text. |
thread_ts | string | — | Parent message timestamp — replies in that thread. |
blocks | string (JSON) | — | Slack Block Kit blocks as a JSON array string, e.g. "[{...}]". |
username | string | — | Override the bot's display name for this message. |
icon_emoji | string | — | Override the bot's icon, e.g. :robot_face:. |
Output: { "ok": true, "ts": "1719500000.000200", "channel": "C012AB3CD" } — ts is the new message's timestamp (usable as thread_ts in a follow-up step), channel is the resolved channel ID.
Slack actions
Read-oriented Slack operations, sharing the same auth resolution as slack-send: auth.fields.token (OAuth) → token → api_key.
slack-list-channels
Lists public and private channels the bot can see, via conversations.list.
{
"id": "list_channels",
"type": "slack-list-channels",
"config": {
"token": "{{ secret.SLACK_BOT_TOKEN }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
token / api_key | string | — | Slack bot token (or auth.fields.token from an OAuth connection). |
Note: the node always queries conversations.list with types=public_channel,private_channel&exclude_archived=true&limit=200 — a limit is documented on the agent tool definition but not currently read from config.
Output: { "ok": true, "channels": [ { "id": "C012AB3CD", "name": "general", "is_private": false, "num_members": 42 } ], "count": 1 }
slack-get-history
Retrieves recent messages from a channel via conversations.history.
{
"id": "recent_messages",
"type": "slack-get-history",
"config": {
"token": "{{ secret.SLACK_BOT_TOKEN }}",
"channel": "C012AB3CD",
"limit": 20
}
}
| Field | Type | Default | Description |
|---|---|---|---|
token / api_key | string | — | Slack bot token (or auth.fields.token). |
channel | string | — | Channel ID. Required. |
limit | number | 20 | Max messages to return. Clamped to 1–100. |
Output: { "ok": true, "messages": [ { "ts": "...", "user": "U012AB3CD", "text": "...", "type": "message" } ], "count": 20 }
slack-add-reaction
Adds an emoji reaction to a message via reactions.add.
{
"id": "react_thumbsup",
"type": "slack-add-reaction",
"config": {
"token": "{{ secret.SLACK_BOT_TOKEN }}",
"channel": "C012AB3CD",
"timestamp": "{{ steps.notify_slack.output.ts }}",
"emoji": "thumbsup"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
token / api_key | string | — | Slack bot token (or auth.fields.token). |
channel | string | — | Channel ID containing the message. Required. |
timestamp | string | — | The message's ts field, e.g. 1512085950.000216. Required. |
emoji | string | — | Emoji name without colons, e.g. thumbsup, white_check_mark. Required. |
Output: { "ok": true }. If the bot already reacted, Slack's already_reacted error is treated as success: { "ok": true, "already_reacted": true }.
telegram-send
Sends a text message, photo, or audio/voice clip to a Telegram chat via the Bot API. Relates to the telegram poller trigger, which provides chat_id values for replies (e.g. {{ trigger.body.message.chat_id }}).
{
"id": "reply_telegram",
"type": "telegram-send",
"config": {
"bot_token": "{{ secret.TELEGRAM_BOT_TOKEN }}",
"chat_id": "{{ trigger.body.message.chat_id }}",
"text": "{{ steps.llm.text }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
bot_token | string | — | Telegram bot token, e.g. {{ secret.TELEGRAM_BOT_TOKEN }}. Required. |
chat_id | string | — | Chat ID (numeric) or @username. Required. |
text | string | "(empty message)" | Message text, or photo caption when photo_url is set. Sent as Markdown by default; if Telegram rejects the entities, the node automatically retries without parse_mode. |
parse_mode | string | "Markdown" | Markdown, HTML, or "" (plain text). |
photo_url | string | — | Public URL of a photo to send via sendPhoto. text becomes the caption. |
audio_base64 | string | — | Base64-encoded audio. If set, sent via sendVoice or sendAudio instead of text/photo. |
send_as_voice | string | "false" | "true" sends audio_base64 via sendVoice (round voice bubble, requires OGG/OPUS); otherwise sent via sendAudio as an audio file. |
disable_preview | string | "false" | "true" sets disable_web_page_preview on text messages. |
Output: { "ok": true, "message_id": "123", "chat_id": "<resolved chat_id>" }
Telegram actions
Read-oriented Bot API calls. Auth resolves bot_token → token.
telegram-get-updates
Calls getUpdates to fetch the bot's recent updates (messages, callback queries, etc.). For continuous inbound message handling, use the telegram poller trigger instead — this node is for on-demand polling within a workflow.
{
"id": "poll_updates",
"type": "telegram-get-updates",
"config": {
"bot_token": "{{ secret.TELEGRAM_BOT_TOKEN }}",
"limit": 20
}
}
| Field | Type | Default | Description |
|---|---|---|---|
bot_token / token | string | — | Telegram bot token. Required. |
limit | number | 20 | Max updates to return. |
offset | number | — | Update offset for pagination — pass the last update_id + 1 to acknowledge prior updates. |
Output: { "ok": true, "updates": [ { ... raw Telegram Update objects ... } ], "count": 5 }
telegram-get-chat
Calls getChat to fetch information about a chat, group, or user.
{
"id": "lookup_chat",
"type": "telegram-get-chat",
"config": {
"bot_token": "{{ secret.TELEGRAM_BOT_TOKEN }}",
"chat_id": "{{ trigger.body.message.chat_id }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
bot_token / token | string | — | Telegram bot token. Required. |
chat_id | string | — | Chat ID (number) or @username. Required. |
Output: { "ok": true, "chat": { ... raw Telegram Chat object ... } }
whatsapp-send
Sends a WhatsApp message via Twilio or the Meta WhatsApp Business Cloud API. Relates to the WhatsApp channel webhook (POST /webhooks/whatsapp/{workflowId}) documented in Triggers — that webhook handles inbound messages and Meta's verification handshake; this node sends outbound.
{
"id": "reply_whatsapp",
"type": "whatsapp-send",
"config": {
"provider": "meta",
"access_token": "{{ secret.META_WHATSAPP_TOKEN }}",
"phone_number_id": "123456789",
"to": "{{ trigger.body.from }}",
"body": "{{ steps.llm.text }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
provider | string | "twilio" | "twilio" or "meta". |
to | string | — | Recipient phone number. Required. For Twilio, the whatsapp: prefix is added automatically if missing. For Meta, non-digit/+ characters are stripped. |
body | string | — | Free-form message text. For Meta, only deliverable within the 24-hour customer service window unless template_name is set. |
Twilio fields
| Field | Type | Default | Description |
|---|---|---|---|
account_sid | string | — | {{ secret.TWILIO_ACCOUNT_SID }}. Required. |
auth_token | string | — | {{ secret.TWILIO_AUTH_TOKEN }}. Required. |
from | string | — | Sender, e.g. whatsapp:+14155238886 (sandbox or approved number). |
media_url | string | — | Public URL of an image/document to attach. |
Meta fields
| Field | Type | Default | Description |
|---|---|---|---|
access_token | string | — | Long-lived Meta access token, e.g. {{ secret.META_WHATSAPP_TOKEN }}. Required (or auth.fields.token from an OAuth connection). |
phone_number_id | string | — | WhatsApp phone number ID from Meta Business Manager. Required. |
template_name | string | — | Pre-approved message template name — required to message outside the 24-hour window. |
template_lang | string | "en_US" | Template language code. Used only when template_name is set. |
Output (Twilio): { "ok": true, "sid": "SM...", "to": "whatsapp:+1...", "status": "queued", "provider": "twilio" }
Output (Meta): { "ok": true, "id": "<message id>", "to": "<digits-only phone>", "provider": "meta" }
instagram-send
Publishes a photo or reel, replies to a comment, or sends a DM via the Instagram Graph API (graph.facebook.com/v19.0). Relates to the Instagram channel webhook (GET/POST /webhooks/instagram/{workflowId}) documented in Triggers, which delivers inbound comments/DMs and handles Meta's verification handshake.
{
"id": "post_to_instagram",
"type": "instagram-send",
"config": {
"access_token": "{{ secret.META_PAGE_TOKEN }}",
"instagram_account_id": "17841400000000000",
"action": "post_photo",
"media_url": "{{ steps.image_gen.output.url }}",
"caption": "{{ steps.llm.text }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
access_token | string | — | Long-lived Page access token from Meta Developer Console. Required (or auth.fields.token from an OAuth connection). |
instagram_account_id | string | — | Instagram Business Account ID, from Meta Business Manager → Instagram. Required. |
action | string | "post_photo" | One of post_photo, post_reel, reply_comment, send_dm. |
media_url | string | — | Public image/video URL. Required for post_photo and post_reel. |
caption | string | — | Post caption with hashtags. Used for post_photo and post_reel. |
comment_id | string | — | Comment ID to reply to. Required for reply_comment. |
recipient_id | string | — | Instagram-scoped user ID. Required for send_dm. |
message | string | — | Text content. Required for reply_comment and send_dm. |
For post_photo/post_reel, the node creates a media container, polls its status_code until FINISHED/READY (or ERROR, up to 30 attempts at 2s intervals), then publishes it.
Output (post_photo / post_reel): { "ok": true, "media_id": "...", "action": "post_photo" }
Output (reply_comment): { "ok": true, "reply_id": "...", "action": "reply_comment" }
Output (send_dm): { "ok": true, "message_id": "...", "action": "send_dm" }
twitter-send
Posts a tweet (or threaded reply) to Twitter/X via API v2, signed with OAuth 1.0a.
{
"id": "post_tweet",
"type": "twitter-send",
"config": {
"api_key": "{{ secret.TWITTER_API_KEY }}",
"api_secret": "{{ secret.TWITTER_API_SECRET }}",
"access_token": "{{ secret.TWITTER_ACCESS_TOKEN }}",
"access_token_secret": "{{ secret.TWITTER_ACCESS_TOKEN_SECRET }}",
"text": "{{ steps.llm.text }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
api_key | string | — | Twitter API Consumer Key from developer.twitter.com. Required. |
api_secret | string | — | Twitter API Consumer Secret. Required. |
access_token | string | — | OAuth 1.0a Access Token for the posting account. Required. |
access_token_secret | string | — | OAuth 1.0a Access Token Secret. Required. |
text | string | — | Tweet text, max 280 characters. Required. |
reply_to_id | string | — | Tweet ID to reply to — creates a thread. |
The Developer App needs Read+Write permissions.
Output: { "ok": true, "tweet_id": "...", "text": "..." }
teams-send
Sends a message to a Microsoft Teams channel or 1:1/group chat via Microsoft Graph. Supports @handle mentions in content, which are resolved to Teams <at> mentions by looking up team members.
{
"id": "notify_teams",
"type": "teams-send",
"config": {
"access_token": "{{ secret.TEAMS_ACCESS_TOKEN }}",
"send_to": "channel",
"team_id": "{{ secret.TEAMS_TEAM_ID }}",
"channel_id": "{{ secret.TEAMS_CHANNEL_ID }}",
"content": "Build finished for @alice"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
access_token | string | — | Microsoft Graph Bearer token, e.g. {{ secret.TEAMS_ACCESS_TOKEN }}. Required. |
send_to | string | "channel" | "channel" or "chat". |
team_id | string | — | Team GUID. Required when send_to is "channel". |
channel_id | string | — | Channel ID. Required when send_to is "channel". |
chat_id | string | — | Chat ID (1:1 or group). Required when send_to is "chat". |
content | string | — | Message body — text or HTML depending on content_type. Required. |
content_type | string | "text" | "text" or "html". For channel messages, if any @handle mentions resolve, the message is upgraded to HTML automatically (with <br>-converted line breaks) so the <at> tags render. |
Output: { "ok": true, "id": "<message id>", "created_at": "<createdDateTime>", "web_url": "<Teams deep link>" }
Teams actions
Read-oriented Microsoft Graph lookups, all authenticated with access_token (Microsoft Graph Bearer token).
teams-list-teams
Lists the teams the authenticated user belongs to (GET /me/joinedTeams).
{
"id": "list_teams",
"type": "teams-list-teams",
"config": {
"access_token": "{{ secret.TEAMS_ACCESS_TOKEN }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
access_token | string | — | Microsoft Graph Bearer token. Required. |
Output: { "ok": true, "teams": [ { "id": "...", "displayName": "...", "description": "..." } ], "count": 1 }
teams-list-channels
Lists channels in a team (GET /teams/{team_id}/channels).
{
"id": "list_channels",
"type": "teams-list-channels",
"config": {
"access_token": "{{ secret.TEAMS_ACCESS_TOKEN }}",
"team_id": "{{ steps.list_teams.output.teams[0].id }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
access_token | string | — | Microsoft Graph Bearer token. Required. |
team_id | string | — | Team ID (GUID). Required. |
Output: { "ok": true, "channels": [ { "id": "...", "displayName": "...", "description": "..." } ], "count": 1 }
teams-list-chats
Lists recent chats for the authenticated user (GET /me/chats).
{
"id": "list_chats",
"type": "teams-list-chats",
"config": {
"access_token": "{{ secret.TEAMS_ACCESS_TOKEN }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
access_token | string | — | Microsoft Graph Bearer token. Required. |
Output: { "ok": true, "chats": [ { "id": "...", "chatType": "oneOnOne", "topic": "..." } ], "count": 1 }
email-send
Sends an email via the Resend API or a generic SMTP relay.
{
"id": "send_summary_email",
"type": "email-send",
"config": {
"provider": "resend",
"api_key": "{{ secret.RESEND_API_KEY }}",
"from": "OrcFlows <noreply@yourdomain.com>",
"to": "{{ trigger.body.message.from }}",
"subject": "Re: {{ trigger.body.message.subject }}",
"body": "{{ steps.llm.text }}"
}
}
| Field | Type | Default | Description |
|---|---|---|---|
provider | string | "resend" | "resend" or "smtp". |
to | string | — | Recipient address(es), comma-separated for multiple. Required. |
from | string | — | Sender address, e.g. "OrcFlows <noreply@yourdomain.com>". |
subject | string | — | Email subject. |
body | string | — | Plain-text body. |
html | string | — | HTML body — Resend only. If set, sent as html and body is ignored. |
Resend fields
| Field | Type | Default | Description |
|---|---|---|---|
api_key | string | — | {{ secret.RESEND_API_KEY }}. Required. |
SMTP fields
| Field | Type | Default | Description |
|---|---|---|---|
host | string | — | SMTP host, e.g. smtp.gmail.com. Required. |
port | string | "587" | SMTP port. "465" connects with implicit TLS from the start; other ports use STARTTLS/plain smtp.SendMail. |
username | string | — | SMTP auth username, e.g. you@gmail.com. |
password | string | — | SMTP auth password / app password, e.g. {{ secret.GMAIL_APP_PASSWORD }}. |
There is no dedicated attachments field — for attachments, use the html field for rich content or send via the connector node for providers with attachment support.
Output (Resend): { "ok": true, "id": "<resend message id>", "to": ["recipient@example.com"], "provider": "resend" }
Output (SMTP): { "ok": true, "to": ["recipient@example.com"], "provider": "smtp" }
rss
Fetches and parses an RSS 2.0 or Atom 1.0 feed, returning normalized items.
{
"id": "fetch_feed",
"type": "rss",
"config": {
"url": "https://example.com/feed.xml",
"max_items": 10
}
}
| Field | Type | Default | Description |
|---|---|---|---|
url | string | — | Feed URL. Required. Supports {{...}} expressions. |
max_items | number | 20 | Maximum items to return, taken from the start of the feed. |
Output:
{
"feed_title": "Example Blog",
"items": [
{
"title": "Post title",
"link": "https://example.com/post",
"description": "Summary or excerpt",
"pub_date": "Mon, 02 Jan 2006 15:04:05 -0700",
"guid": "https://example.com/post",
"author": "Jane Doe"
}
],
"count": 1
}
description/summary, pub_date/updated, guid/id, and author are normalized across RSS and Atom into the same field names. For Atom feeds, link is taken from the entry's alternate link (or its first link if none is marked alternate).