Slack
Slack API integration with managed OAuth. Send messages, manage channels, search conversations, and interact with Slack workspaces. Use this skill when users...
Slack API integration with managed OAuth. Send messages, manage channels, search conversations, and interact with Slack workspaces. Use this skill when users...
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Access the Slack API with managed OAuth authentication. Send messages, manage channels, list users, and automate Slack workflows.
# Post a message to a channel python <<'EOF' import urllib.request, os, json data = json.dumps({'channel': 'C0123456789', 'text': 'Hello from Maton!'}).encode() req = urllib.request.Request('https://gateway.maton.ai/slack/api/chat.postMessage', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
https://gateway.maton.ai/slack/{method}
The gateway proxies requests to
slack.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as
MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Slack OAuth connections at
https://ctrl.maton.ai.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=slack&status=ACTIVE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json data = json.dumps({'app': 'slack'}).encode() req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Response:
{ "connection": { "connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80", "status": "ACTIVE", "creation_time": "2025-12-08T07:20:53.488460Z", "last_updated_time": "2026-01-31T20:03:32.593153Z", "url": "https://connect.maton.ai/?session_token=...", "app": "slack", "metadata": {} } }
Open the returned
url in a browser to complete OAuth authorization.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If you have multiple Slack connections, specify which one to use with the
Maton-Connection header:
python <<'EOF' import urllib.request, os, json data = json.dumps({'channel': 'C0123456789', 'text': 'Hello!'}).encode() req = urllib.request.Request('https://gateway.maton.ai/slack/api/chat.postMessage', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
GET /slack/api/auth.test
Returns current user and team info.
POST /slack/api/chat.postMessage Content-Type: application/json{ "channel": "C0123456789", "text": "Hello, world!" }
With blocks:
POST /slack/api/chat.postMessage Content-Type: application/json{ "channel": "C0123456789", "blocks": [ {"type": "section", "text": {"type": "mrkdwn", "text": "Bold and italic"}} ] }
POST /slack/api/chat.postMessage Content-Type: application/json{ "channel": "C0123456789", "thread_ts": "1234567890.123456", "text": "This is a reply in a thread" }
POST /slack/api/chat.update Content-Type: application/json{ "channel": "C0123456789", "ts": "1234567890.123456", "text": "Updated message" }
POST /slack/api/chat.delete Content-Type: application/json{ "channel": "C0123456789", "ts": "1234567890.123456" }
POST /slack/api/chat.scheduleMessage Content-Type: application/json{ "channel": "C0123456789", "text": "Scheduled message", "post_at": 1734567890 }
GET /slack/api/chat.scheduledMessages.list
POST /slack/api/chat.deleteScheduledMessage Content-Type: application/json{ "channel": "C0123456789", "scheduled_message_id": "Q1234567890" }
GET /slack/api/chat.getPermalink?channel=C0123456789&message_ts=1234567890.123456
GET /slack/api/conversations.list?types=public_channel,private_channel&limit=100
Types:
public_channel, private_channel, im, mpim
GET /slack/api/conversations.info?channel=C0123456789
GET /slack/api/conversations.history?channel=C0123456789&limit=100
With time range:
GET /slack/api/conversations.history?channel=C0123456789&oldest=1234567890&latest=1234567899
GET /slack/api/conversations.replies?channel=C0123456789&ts=1234567890.123456
GET /slack/api/conversations.members?channel=C0123456789&limit=100
POST /slack/api/conversations.create Content-Type: application/json{ "name": "new-channel-name", "is_private": false }
POST /slack/api/conversations.join Content-Type: application/json{ "channel": "C0123456789" }
POST /slack/api/conversations.leave Content-Type: application/json{ "channel": "C0123456789" }
POST /slack/api/conversations.archive Content-Type: application/json{ "channel": "C0123456789" }
POST /slack/api/conversations.unarchive Content-Type: application/json{ "channel": "C0123456789" }
POST /slack/api/conversations.rename Content-Type: application/json{ "channel": "C0123456789", "name": "new-name" }
POST /slack/api/conversations.setTopic Content-Type: application/json{ "channel": "C0123456789", "topic": "Channel topic here" }
POST /slack/api/conversations.setPurpose Content-Type: application/json{ "channel": "C0123456789", "purpose": "Channel purpose here" }
POST /slack/api/conversations.invite Content-Type: application/json{ "channel": "C0123456789", "users": "U0123456789,U9876543210" }
POST /slack/api/conversations.kick Content-Type: application/json{ "channel": "C0123456789", "user": "U0123456789" }
POST /slack/api/conversations.mark Content-Type: application/json{ "channel": "C0123456789", "ts": "1234567890.123456" }
POST /slack/api/conversations.open Content-Type: application/json{ "users": "U0123456789" }
For group DM:
POST /slack/api/conversations.open Content-Type: application/json{ "users": "U0123456789,U9876543210" }
GET /slack/api/conversations.list?types=im
GET /slack/api/conversations.list?types=mpim
GET /slack/api/users.conversations?limit=100
GET /slack/api/users.list?limit=100
GET /slack/api/users.info?user=U0123456789
GET /slack/api/users.getPresence?user=U0123456789
POST /slack/api/users.setPresence Content-Type: application/json{ "presence": "away" }
GET /slack/api/users.lookupByEmail?email=user@example.com
POST /slack/api/reactions.add Content-Type: application/json{ "channel": "C0123456789", "name": "thumbsup", "timestamp": "1234567890.123456" }
POST /slack/api/reactions.remove Content-Type: application/json{ "channel": "C0123456789", "name": "thumbsup", "timestamp": "1234567890.123456" }
GET /slack/api/reactions.get?channel=C0123456789×tamp=1234567890.123456
GET /slack/api/reactions.list?limit=100
GET /slack/api/stars.list?limit=100
POST /slack/api/stars.add Content-Type: application/json{ "channel": "C0123456789", "timestamp": "1234567890.123456" }
POST /slack/api/stars.remove Content-Type: application/json{ "channel": "C0123456789", "timestamp": "1234567890.123456" }
GET /slack/api/bots.info?bot=B0123456789
POST /slack/api/files.upload Content-Type: multipart/form-datachannels=C0123456789 content=file content here filename=example.txt title=Example File
GET /slack/api/files.getUploadURLExternal?filename=example.txt&length=1024
POST /slack/api/files.completeUploadExternal Content-Type: application/json{ "files": [{"id": "F0123456789", "title": "My File"}], "channel_id": "C0123456789" }
POST /slack/api/files.delete Content-Type: application/json{ "file": "F0123456789" }
GET /slack/api/files.info?file=F0123456789
GET /slack/api/search.messages?query=keyword
const response = await fetch('https://gateway.maton.ai/slack/api/chat.postMessage', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.MATON_API_KEY}` }, body: JSON.stringify({ channel: 'C0123456', text: 'Hello!' }) }); const result = await response.json(); console.log(result);
import os import requestsresponse = requests.post( 'https://gateway.maton.ai/slack/api/chat.postMessage', headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}, json={'channel': 'C0123456', 'text': 'Hello!'} ) print(response.json())
C (public), G (private/group), D (DM)U, Bot IDs start with B, Team IDs start with Tts) are unique identifiersmrkdwn type for Slack-flavored markdown formattingthread_ts to reference the parent messagecursor from response_metadata.next_cursorcurl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.| Status | Meaning |
|---|---|
| 400 | Missing Slack connection |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Slack API |
Missing Scope Errors: If you encounter
missing_scope errors, contact Maton Support to request additional scopes for your connection.
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
slack. For example:https://gateway.maton.ai/slack/api/chat.postMessagehttps://gateway.maton.ai/api/chat.postMessageNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.