Slack API
Send messages, read channels, and interact with Slack workspaces.
When to Use
- Send messages to channels or users
- Read channel message history
- Upload files to Slack
- List channels and users
- Add reactions to messages
Prerequisites
export SLACK_BOT_TOKEN=xoxb-your-bot-token
Get Token
- Create app: https://api.slack.com/apps
- Add Bot Token Scopes (OAuth & Permissions):
chat:write- Send messageschannels:read- List public channelschannels:history- Read channel messagesfiles:write- Upload filesusers:read- List usersreactions:write- Add reactions
- Install to Workspace
- Copy "Bot User OAuth Token" (
xoxb-...)
Important: When using
$VARin a command that pipes to another command, wrap the command containing$VARinbash -c '...'. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"'
Core APIs
List Channels
bash -c 'curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" "https://slack.com/api/conversations.list?types=public_channel"' | jq '.channels[] | {id, name}'
Docs: https://docs.slack.dev/reference/methods/conversations.list
Get Channel History
Replace <channel-id> with the actual channel ID:
bash -c 'curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" "https://slack.com/api/conversations.history?channel=<channel-id>&limit=10"' | jq '.messages[] | {ts, user, text}'
Docs: https://docs.slack.dev/reference/methods/conversations.history
Send Message
Write to /tmp/request.json:
{
"channel": "<channel-id>",
"text": "Hello, World"
}
bash -c 'curl -s -X POST "https://slack.com/api/chat.postMessage" -H "Authorization: Bearer $SLACK_BOT_TOKEN" -H "Content-Type: application/json" -d @/tmp/request.json'
Docs: https://docs.slack.dev/reference/methods/chat.postmessage
Send with Blocks
Write to /tmp/request.json:
{
"channel": "<channel-id>",
"text": "Notification",
"blocks": [
{
"type": "section",
"text": {"type": "mrkdwn", "text": "*Alert:* Something happened"}
},
{
"type": "section",
"fields": [
{"type": "mrkdwn", "text": "*Status:*\nActive"},
{"type": "mrkdwn", "text": "*Priority:*\nHigh"}
]
}
]
}
bash -c 'curl -s -X POST "https://slack.com/api/chat.postMessage" -H "Authorization: Bearer $SLACK_BOT_TOKEN" -H "Content-Type: application/json" -d @/tmp/request.json'
Block Kit Builder: https://app.slack.com/block-kit-builder
Reply in Thread
Write to /tmp/request.json:
{
"channel": "<channel-id>",
"thread_ts": "<thread-timestamp>",
"text": "Thread reply"
}
bash -c 'curl -s -X POST "https://slack.com/api/chat.postMessage" -H "Authorization: Bearer $SLACK_BOT_TOKEN" -H "Content-Type: application/json" -d @/tmp/request.json'
Update Message
Write to /tmp/request.json:
{
"channel": "<channel-id>",
"ts": "<message-timestamp>",
"text": "Updated message"
}
bash -c 'curl -s -X POST "https://slack.com/api/chat.update" -H "Authorization: Bearer $SLACK_BOT_TOKEN" -H "Content-Type: application/json" -d @/tmp/request.json'
Docs: https://docs.slack.dev/reference/methods/chat.update
Delete Message
Write to /tmp/request.json:
{
"channel": "<channel-id>",
"ts": "<message-timestamp>"
}
bash -c 'curl -s -X POST "https://slack.com/api/chat.delete" -H "Authorization: Bearer $SLACK_BOT_TOKEN" -H "Content-Type: application/json" -d @/tmp/request.json'
List Users
bash -c 'curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" "https://slack.com/api/users.list"' | jq '.members[] | {id, name, real_name}'
Docs: https://docs.slack.dev/reference/methods/users.list
Get User by Email
Replace <user-email> with the actual email address:
bash -c 'curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" "https://slack.com/api/users.lookupByEmail?email=<user-email>"'
Docs: https://docs.slack.dev/reference/methods/users.lookupbyemail
Upload File
curl -s -X POST 'https://slack.com/api/files.upload' -H "Authorization: Bearer $SLACK_BOT_TOKEN" -F 'channels=C1234567890' -F 'file=@/path/to/file.txt' -F 'title=My File'
Docs: https://docs.slack.dev/reference/methods/files.upload
Add Reaction
Write to /tmp/request.json:
{
"channel": "<channel-id>",
"timestamp": "<message-timestamp>",
"name": "thumbsup"
}
bash -c 'curl -s -X POST "https://slack.com/api/reactions.add" -H "Authorization: Bearer $SLACK_BOT_TOKEN" -H "Content-Type: application/json" -d @/tmp/request.json'
Docs: https://docs.slack.dev/reference/methods/reactions.add
Message Formatting
| Syntax | Result |
|--------|--------|
| *bold* | bold |
| _italic_ | italic |
| ~strike~ | ~~strike~~ |
| `code` | code |
| <URL\|text> | hyperlink |
| <@U123> | @mention user |
| <#C123> | #channel link |
Rate Limits
- Tier 1: 1 request/second
- Tier 2: 20 requests/minute
- Tier 3: 50 requests/minute
- Tier 4: 100 requests/minute
See: https://docs.slack.dev/apis/web-api/rate-limits
API Reference
- All Methods: https://docs.slack.dev/reference/methods
- Scopes: https://docs.slack.dev/reference/scopes
- Block Kit: https://docs.slack.dev/reference/block-kit
- App Management: https://api.slack.com/apps