Skip to main content

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 }}"
}
}
FieldTypeDefaultDescription
connection_idstringOAuth Slack connection (preferred). Resolved upstream to auth.fields.token.
tokenstringBot token, e.g. {{ secret.SLACK_BOT_TOKEN }}. Fallback if no connection.
channelstringChannel ID or name, e.g. #general or C012AB3CD. Required unless user_id is set.
user_idstringSlack user ID. If set and channel is empty, opens a DM via conversations.open and sends there.
textstringMessage text.
thread_tsstringParent message timestamp — replies in that thread.
blocksstring (JSON)Slack Block Kit blocks as a JSON array string, e.g. "[{...}]".
usernamestringOverride the bot's display name for this message.
icon_emojistringOverride 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) → tokenapi_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 }}"
}
}
FieldTypeDefaultDescription
token / api_keystringSlack 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
}
}
FieldTypeDefaultDescription
token / api_keystringSlack bot token (or auth.fields.token).
channelstringChannel ID. Required.
limitnumber20Max 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"
}
}
FieldTypeDefaultDescription
token / api_keystringSlack bot token (or auth.fields.token).
channelstringChannel ID containing the message. Required.
timestampstringThe message's ts field, e.g. 1512085950.000216. Required.
emojistringEmoji 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 }}"
}
}
FieldTypeDefaultDescription
bot_tokenstringTelegram bot token, e.g. {{ secret.TELEGRAM_BOT_TOKEN }}. Required.
chat_idstringChat ID (numeric) or @username. Required.
textstring"(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_modestring"Markdown"Markdown, HTML, or "" (plain text).
photo_urlstringPublic URL of a photo to send via sendPhoto. text becomes the caption.
audio_base64stringBase64-encoded audio. If set, sent via sendVoice or sendAudio instead of text/photo.
send_as_voicestring"false""true" sends audio_base64 via sendVoice (round voice bubble, requires OGG/OPUS); otherwise sent via sendAudio as an audio file.
disable_previewstring"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_tokentoken.

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
}
}
FieldTypeDefaultDescription
bot_token / tokenstringTelegram bot token. Required.
limitnumber20Max updates to return.
offsetnumberUpdate 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 }}"
}
}
FieldTypeDefaultDescription
bot_token / tokenstringTelegram bot token. Required.
chat_idstringChat 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 }}"
}
}
FieldTypeDefaultDescription
providerstring"twilio""twilio" or "meta".
tostringRecipient phone number. Required. For Twilio, the whatsapp: prefix is added automatically if missing. For Meta, non-digit/+ characters are stripped.
bodystringFree-form message text. For Meta, only deliverable within the 24-hour customer service window unless template_name is set.

Twilio fields

FieldTypeDefaultDescription
account_sidstring{{ secret.TWILIO_ACCOUNT_SID }}. Required.
auth_tokenstring{{ secret.TWILIO_AUTH_TOKEN }}. Required.
fromstringSender, e.g. whatsapp:+14155238886 (sandbox or approved number).
media_urlstringPublic URL of an image/document to attach.

Meta fields

FieldTypeDefaultDescription
access_tokenstringLong-lived Meta access token, e.g. {{ secret.META_WHATSAPP_TOKEN }}. Required (or auth.fields.token from an OAuth connection).
phone_number_idstringWhatsApp phone number ID from Meta Business Manager. Required.
template_namestringPre-approved message template name — required to message outside the 24-hour window.
template_langstring"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 }}"
}
}
FieldTypeDefaultDescription
access_tokenstringLong-lived Page access token from Meta Developer Console. Required (or auth.fields.token from an OAuth connection).
instagram_account_idstringInstagram Business Account ID, from Meta Business Manager → Instagram. Required.
actionstring"post_photo"One of post_photo, post_reel, reply_comment, send_dm.
media_urlstringPublic image/video URL. Required for post_photo and post_reel.
captionstringPost caption with hashtags. Used for post_photo and post_reel.
comment_idstringComment ID to reply to. Required for reply_comment.
recipient_idstringInstagram-scoped user ID. Required for send_dm.
messagestringText 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 }}"
}
}
FieldTypeDefaultDescription
api_keystringTwitter API Consumer Key from developer.twitter.com. Required.
api_secretstringTwitter API Consumer Secret. Required.
access_tokenstringOAuth 1.0a Access Token for the posting account. Required.
access_token_secretstringOAuth 1.0a Access Token Secret. Required.
textstringTweet text, max 280 characters. Required.
reply_to_idstringTweet 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"
}
}
FieldTypeDefaultDescription
access_tokenstringMicrosoft Graph Bearer token, e.g. {{ secret.TEAMS_ACCESS_TOKEN }}. Required.
send_tostring"channel""channel" or "chat".
team_idstringTeam GUID. Required when send_to is "channel".
channel_idstringChannel ID. Required when send_to is "channel".
chat_idstringChat ID (1:1 or group). Required when send_to is "chat".
contentstringMessage body — text or HTML depending on content_type. Required.
content_typestring"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 }}"
}
}
FieldTypeDefaultDescription
access_tokenstringMicrosoft 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 }}"
}
}
FieldTypeDefaultDescription
access_tokenstringMicrosoft Graph Bearer token. Required.
team_idstringTeam 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 }}"
}
}
FieldTypeDefaultDescription
access_tokenstringMicrosoft 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 }}"
}
}
FieldTypeDefaultDescription
providerstring"resend""resend" or "smtp".
tostringRecipient address(es), comma-separated for multiple. Required.
fromstringSender address, e.g. "OrcFlows <noreply@yourdomain.com>".
subjectstringEmail subject.
bodystringPlain-text body.
htmlstringHTML body — Resend only. If set, sent as html and body is ignored.

Resend fields

FieldTypeDefaultDescription
api_keystring{{ secret.RESEND_API_KEY }}. Required.

SMTP fields

FieldTypeDefaultDescription
hoststringSMTP host, e.g. smtp.gmail.com. Required.
portstring"587"SMTP port. "465" connects with implicit TLS from the start; other ports use STARTTLS/plain smtp.SendMail.
usernamestringSMTP auth username, e.g. you@gmail.com.
passwordstringSMTP 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
}
}
FieldTypeDefaultDescription
urlstringFeed URL. Required. Supports {{...}} expressions.
max_itemsnumber20Maximum 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).

Next