Slack Integration
Send messages from your VM to a Slack channel
The Slack integration lets your VM post messages to a Slack channel with a
plain HTTP request — no Slack tokens on the VM, no Slack SDK required. It's
handy for build notifications, long-running job completions, or anything an
agent wants to tell you about.
If you want a bot that can *respond* to Slack — read messages, react to
mentions, call the full Slack Web API — see the
[Slack Bot Integration](integrations-slack-bot) instead.
## Setup
Click the **Slack** tile on the [Integrations page](/integrations), or run:
```
exe.dev ▶ integrations setup slack
```
Either way, you'll be sent to Slack to authorize the exe.dev app. Slack shows
a channel picker: choose the workspace and channel the integration should post
to, then click **Allow**. That's the whole dance — exe.dev stores the
resulting webhook server-side, and the integration is created for you.
Each integration posts to exactly one channel. To post to a second channel,
run setup again and pick a different channel.
## Sending messages
Attach the integration to a VM, then POST JSON to the integration hostname:
```
exe.dev ▶ integrations attach slack-hook vm:my-vm
Attached slack-hook to vm:my-vm
exe.dev ▶ ssh my-vm curl --json '{"text":"build finished ✅"}' https://slack-hook.int.exe.xyz/
ok
```
The request body is Slack's [incoming webhook
payload](https://api.slack.com/messaging/webhooks), so anything Slack
supports there works — including Block Kit:
```
curl --json '{"blocks":[{"type":"section","text":{"type":"mrkdwn","text":"*deploy done* :rocket:"}}]}' \
https://slack-hook.int.exe.xyz/
```
## Notes
- The webhook URL is a secret, and it never touches your VM. exe.dev holds it
server-side and injects it when proxying your request.
- Messages are rate limited to 5 per minute per user.
- If the webhook is revoked on the Slack side (app removed from the
workspace), requests return 404 — re-run `integrations setup slack`.
- If a workspace requires admin approval for apps, clicking Allow files an
approval request; the integration is created once an admin approves.
## Manual webhook
Already have a Slack incoming webhook URL from your own app? Skip OAuth and
add it directly:
```
exe.dev ▶ integrations add slack --name my-slack --webhook-url https://hooks.slack.com/services/T000/B000/XXXX
```