Slack
Connect Slack so your agents can list channels, read a thread and post to your workspace - with a confirmation card before every single message.
Esta página aún no está disponible en tu idioma, mostramos la versión en inglés.
Your agents can read your channels and post to them. They just can't do it behind your back.
Connect your Slack workspace and any agent can pull up what's being discussed in #launch, catch up on a thread, react to a message, and write the update you were going to write yourself. Then it stops and shows you the message.
Nothing reaches your workspace until you click Post.
The gate is real, not a promise
slack.post_message is marked requires_confirmation in Unyo's tool-policy table - it's database configuration, not a line in a prompt an agent could talk itself out of. When an agent wants to post, the run stops, a confirmation card appears with the exact channel and the exact text, and the message is only sent by the separate action that your click triggers. Ignore the card for 15 minutes and it expires.
What it unlocks
Once Slack is connected, five tools appear in your agents' toolboxes:
| Ask for this | The tool | What actually happens |
|---|---|---|
| "Which channels do I have?" | slack.list_channels | Lists your public and private channels (up to 50 by default) |
| "What's been said in #launch today?" | slack.read_channel | Reads the last messages in a channel (20 by default, 50 max) |
| "Catch me up on that thread" | slack.read_thread | Reads a full thread from its timestamp |
| "Post the summary to #marketing" | slack.post_message | Shows you a confirmation card. Posts only when you click |
| "React with 🎉 to Sam's message" | slack.react | Adds an emoji reaction |
Slack isn't one agent's private toy - it's mounted for your team, so each agent uses it for its own job:
- Ashley posts the week's content plan into
#marketingand reacts to the thread where the team signed off on it. - Blake drops a revenue snapshot into
#leadership- with the numbers he actually computed, not estimated. - Riley reads
#product-feedbackand turns the recurring complaints into a written brief. - Sam reads a support escalation thread and drafts the reply you'll send to the customer.
- Ema reads the channel you've been ignoring and tells you what actually needs you.
Reading Slack is free. Posting costs 10 credits.
slack.list_channels costs 0 credits, and reading a channel, reading a thread and reacting are free today. slack.post_message costs 10 credits. The credits are reserved when the confirmation card appears, so you can see the cost blocked while you decide, and refunded automatically if you cancel or let the card expire. You are never charged for a message you didn't send.
The three-step posting flow
Slack is one of the integrations where Unyo deliberately slows down. Agents follow a GATHER → PROPOSE → EXECUTE sequence:
- GATHER - the agent works out where the message should go. If it doesn't know your channels, it calls
slack.list_channelsfirst. Your real channel list is attached to the confirmation card so you can redirect it before posting. - PROPOSE - the confirmation card appears with the channel and the message text, formatted the way Slack will render it. The run pauses here.
- EXECUTE - you click. Only then does the message go to Slack.
An agent that misspells a tool name can't post by accident
If the model garbles a write tool's name - slack.postmsg, slack.post_mesage - the call is refused rather than guessed into an action. And even a perfectly spelled post still stops at the confirmation card. Fuzzy matching is allowed to help a harmless read; it is never allowed to reach your workspace.
Connect Slack
- Open Integrations from the sidebar (it's a top-level page - not inside Settings).
- Filter to Productivity, or search for Slack.
- Click Connect on the Slack card.
- Sign in to Slack and pick the workspace you want Unyo in.
- Review the permissions Slack shows you, then click Allow.
- You land back on Integrations with the Slack card marked Connected.
If an agent needs Slack mid-conversation and you haven't connected it, you don't have to go hunting - a Connect card appears right in the chat, takes you straight into the Slack sign-in, and drops you back in the same conversation. The run picks up where it paused and re-runs the exact action it was waiting on. Nothing to retype.
Permissions - what we ask for, and what we refuse
Slack issues Unyo a bot token. Here's every scope in the request, in plain English:
| Scope | What it lets your agents do |
|---|---|
channels:read | See your public channels, so an agent can list them and pick the right one |
groups:read | See the private channels Unyo has been invited to |
channels:history | Read messages in a public channel to catch you up |
groups:history | Read messages in a private channel Unyo has been invited to |
chat:write | Post a message - gated behind your click, every time |
reactions:write | Add an emoji reaction to a message |
files:write | Upload an image alongside a post (used by the publish announcement below) |
users:read | Turn a user ID into a name, so "who said that?" has an answer |
users:read.email | Match a Slack member to the right person |
team:read | Read your workspace name, to show you which workspace is connected |
channels:manage | Channel management |
reminders:read / reminders:write | Reminder management |
What we deliberately did not ask for:
| Not requested | What that means for you |
|---|---|
files:read | Unyo cannot read the files in your Slack workspace. Not the contract PDF in #legal, not the export someone dumped in #data. Unyo can attach an image to a message it sends; it cannot open one you sent. The capability was never granted, so it can't be misused. |
im:history, mpim:history | No DM access. Your direct messages are not visible to any agent. |
| Message search | Slack's search.messages API only works with a user token - a token that acts as you. Unyo's OAuth issues bot tokens only, so the search tool was removed from the codebase entirely. Your agents can read a channel you name; they cannot go trawling your workspace history. |
A private channel is invisible to Unyo until someone invites the Unyo app into it. groups:read doesn't grant access to private channels - it grants access to the private channels you've already let it into.
Announce your published posts in Slack (optional, off by default)
If you publish social posts through Unyo, you can have the workspace told automatically. Open Automation settings from the sidebar and turn on Slack Post Announce, then pick the destination channel.
When a post goes live, Unyo posts a formatted card to that channel: what was published, on which platforms, the caption, real permalinks to each live post, and the images attached.
This is opt-in and off unless you turn it on, and it fires on publication - a post you never published never gets announced. It's the one place files:write earns its keep.
Example prompts
What are people saying in #product-feedback this week? Give me the three complaints that came up more than once.
Read the thread in #launch about the pricing change and summarise where we landed, then post that summary back to the thread.
Post to #marketing: this week's content plan is ready, three posts scheduled for Tue/Thu/Fri. Keep it short.
What Unyo does with your Slack data
- Your token is encrypted at rest. It goes through Unyo's
encrypt_token/decrypt_tokendatabase functions and is never written to or read from a plain column. As of 16 July 2026, every populated OAuth token column in the production database was verified encrypted at the cipher-byte level - zero plaintext tokens exist. - Your token never appears anywhere you could leak it. Not in a log, not in an error message, not in an HTTP response, not in the live activity stream. It's resolved for the length of one outbound call to Slack and discarded.
- Nothing you write in Slack is used to train a model. Every model Unyo runs is under a no-training, zero-retention guarantee. Your channel messages are read to answer the question you asked, and that's the end of them.
- Your data is yours alone. The Slack connection row is protected by row-level security - 100% of Unyo's public tables carry it, verified live on 16 July 2026 - so no other account can reach it, by construction rather than by convention.
- Deleting your account deletes it. Account deletion purges roughly 80 tables atomically and calls Slack's revoke endpoint to kill the token at the source.
Can an agent post to Slack without me seeing it first?
No. slack.post_message requires a confirmation in Unyo's tool-policy table, so the run halts and renders a card with the channel and the full message text. The message is only sent by the action your click triggers. There is no setting that turns this off, and there's no auto-post mode - unattended sending doesn't exist anywhere in Unyo. The one exception is the Slack Post Announce automation, which you turn on yourself, point at a channel yourself, and which only ever fires on a post you published.
Can Unyo read my DMs or my private channels?
Not your DMs - the DM scopes were never requested. Private channels only if you invite the Unyo app into them; until then they're invisible. And it can't read your Slack files at all: files:read was deliberately left out of the request.
Can I ask an agent to search my Slack history?
No, and that's a Slack constraint we chose not to work around. Slack's search API only accepts a user token - a token that acts as you, with your access to everything. Unyo's OAuth issues bot tokens only, so search was removed from the codebase rather than shipped by escalating what we ask for. Agents can read a channel or a thread you name; they can't crawl your workspace.
What does it cost?
Posting a message costs 10 credits. Listing your channels costs nothing, and reading a channel, reading a thread and reacting are free today. The credits are reserved while the confirmation card is up, and refunded automatically if you cancel or let it expire. Connecting Slack itself is free.
What happens if I disconnect Slack mid-task?
The agent doesn't crash and it doesn't invent an answer. It pauses with a "Waiting for connection" notice and holds the exact action it was about to take. Reconnect, and it replays that action once - with a guard that makes double-charging impossible.
Disconnecting and revoking
Open Integrations from the sidebar and click Disconnect on the Slack card. The connection is deleted from Unyo immediately and your agents lose every Slack tool on their next run.
Be aware of exactly what that does and doesn't do. Disconnecting removes Unyo's stored token - we can no longer reach your workspace. It does not call Slack's revoke endpoint, so the Unyo app may still appear in your workspace's installed-apps list. To remove it at the source, go to your Slack workspace's Settings & administration → Manage apps, find Unyo, and remove it.
Two cases where Unyo does revoke at Slack for you:
- Deleting your Unyo account calls Slack's
auth.revokeendpoint before purging your data. Killing the grant is unambiguously the right thing to do there, so we do it. - Removing Unyo from Slack's own app settings invalidates the token immediately; Unyo's next call fails cleanly and the card asks you to reconnect.
Troubleshooting
"Slack isn't connected" even though the card says Connected. The token was revoked at Slack's end - usually because someone removed the app from the workspace. Disconnect and reconnect.
The agent can't find a channel you know exists. It's private and the Unyo app hasn't been invited in. Type /invite @Unyo in that channel and ask again.
The agent listed a channel but says it can't read it. Same cause. channels:read shows public channels; reading a private one needs Unyo to be a member.
The confirmation card disappeared before you clicked. Cards expire after 15 minutes and the credits are refunded. Ask the agent again.
Nothing happens when you click Connect. The Slack sign-in opens in a new window - allow pop-ups for unyo.app.
Slack Post Announce isn't firing. Check two things in Automation settings: the toggle is on, and a destination channel is selected. With the toggle on but no channel picked, there's nowhere to post.