> ## Documentation Index
> Fetch the complete documentation index at: https://docs.modulex.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Slack Integration for AI Agents & Workflows

> Team communication and collaboration platform for messaging, channels, and workspace management

{/* Self-hosted logo — build-time vendored from modulex.json / Iconify (see scripts/lib/logo.js). */}

<img src="https://mintcdn.com/modulexaillc/df8MOr-hXotYLTh5/logos/slack.svg?fit=max&auto=format&n=df8MOr-hXotYLTh5&q=85&s=d4b840e73b4ae3ae85c95289aa2a4fb1" alt="Slack logo" width="72" height="72" data-path="logos/slack.svg" />

## Overview

Add **Slack** to any ModuleX agent or workflow. Channels, messages, threads, reactions, and user management against the Slack Web API (`slack.com/api`).

<Info>
  **Categories**: Communication · Communication & Collaboration · Collaboration · Messaging · **Auth**: OAuth2, Bot Token · **Actions**: 8
</Info>

## Authentication

<Tabs>
  <Tab title="OAuth2">
    ### OAuth2 Authentication

    Connect using Slack OAuth (recommended for most use cases)

    <Steps>
      <Step title="Step 1">
        Create a Slack App at [https://api.slack.com/apps](https://api.slack.com/apps)
      </Step>

      <Step title="Step 2">
        Go to 'OAuth & Permissions'
      </Step>

      <Step title="Step 3">
        Add required scopes (see below)
      </Step>

      <Step title="Step 4">
        Install app to workspace
      </Step>

      <Step title="Step 5">
        Copy the Bot User OAuth Token
      </Step>
    </Steps>

    #### Required Credentials

    | Field         | Description             | Required | Format                             |
    | ------------- | ----------------------- | -------- | ---------------------------------- |
    | Client ID     | Slack App Client ID     | Yes      | `1234567890.1234567890`            |
    | Client Secret | Slack App Client Secret | Yes      | `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` |

    #### OAuth Configuration

    * **Authorization URL**: `https://slack.com/oauth/v2/authorize`
    * **Token URL**: `https://slack.com/api/oauth.v2.access`
    * **Scopes**: `channels:read`, `channels:history`, `chat:write`, `reactions:write`, `users:read`, `users.profile:read`
  </Tab>

  <Tab title="Bot Token">
    ### Bot Token

    Use your Slack Bot User OAuth Token (xoxb-...)

    <Steps>
      <Step title="Step 1">
        Go to [https://api.slack.com/apps](https://api.slack.com/apps) and create or select your app
      </Step>

      <Step title="Step 2">
        Navigate to 'OAuth & Permissions' in the sidebar
      </Step>

      <Step title="Step 3">
        Add the required Bot Token Scopes
      </Step>

      <Step title="Step 4">
        Install the app to your workspace
      </Step>

      <Step title="Step 5">
        Copy the 'Bot User OAuth Token' (starts with xoxb-)
      </Step>
    </Steps>

    #### Required Credentials

    | Field                | Description                                         | Required | Format                                                    |
    | -------------------- | --------------------------------------------------- | -------- | --------------------------------------------------------- |
    | Bot User OAuth Token | Your Slack Bot User OAuth Token (starts with xoxb-) | Yes      | `xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx` |
  </Tab>
</Tabs>

## Available Actions

<AccordionGroup>
  <Accordion title="list_channels — List public channels in the Slack workspace with pagination">
    ### Parameters

    <ResponseField name="team_id" type="string">
      Team/workspace ID to filter channels
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Maximum number of channels to return (max 200) (Default: `100`)
    </ResponseField>

    <ResponseField name="cursor" type="string">
      Pagination cursor for next page of results
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "Channel": {
          "additionalProperties": false,
          "description": "One row in ``list_channels``.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Name"
            },
            "is_channel": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Is Channel"
            },
            "is_private": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Is Private"
            },
            "is_archived": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Is Archived"
            },
            "is_member": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Is Member"
            },
            "num_members": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Num Members"
            },
            "topic": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Topic"
            },
            "purpose": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Purpose"
            },
            "created": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Created"
            }
          },
          "title": "Channel",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "channels": {
          "items": {
            "$ref": "#/$defs/Channel"
          },
          "title": "Channels",
          "type": "array"
        },
        "total": {
          "default": 0,
          "title": "Total",
          "type": "integer"
        },
        "next_cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Next Cursor"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListChannelsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="post_message — Post a new message to a Slack channel">
    ### Parameters

    <ResponseField name="channel_id" type="string" required>
      The ID of the channel to post to
    </ResponseField>

    <ResponseField name="text" type="string" required>
      The message text to post
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "Message": {
          "additionalProperties": false,
          "description": "Compact message representation returned by post/reply actions.",
          "properties": {
            "text": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Text"
            },
            "user": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "User"
            },
            "type": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Type"
            },
            "ts": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Ts"
            }
          },
          "title": "Message",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "channel": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Channel"
        },
        "ts": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Ts"
        },
        "message": {
          "anyOf": [
            {
              "$ref": "#/$defs/Message"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "PostMessageOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="reply_to_thread — Reply to a specific message thread in Slack">
    ### Parameters

    <ResponseField name="channel_id" type="string" required>
      The ID of the channel containing the thread
    </ResponseField>

    <ResponseField name="thread_ts" type="string" required>
      The timestamp of the parent message (format: '1234567890.123456')
    </ResponseField>

    <ResponseField name="text" type="string" required>
      The reply text
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "Message": {
          "additionalProperties": false,
          "description": "Compact message representation returned by post/reply actions.",
          "properties": {
            "text": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Text"
            },
            "user": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "User"
            },
            "type": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Type"
            },
            "ts": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Ts"
            }
          },
          "title": "Message",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "channel": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Channel"
        },
        "ts": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Ts"
        },
        "thread_ts": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Thread Ts"
        },
        "message": {
          "anyOf": [
            {
              "$ref": "#/$defs/Message"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "ReplyToThreadOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="add_reaction — Add a reaction emoji to a message">
    ### Parameters

    <ResponseField name="channel_id" type="string" required>
      The ID of the channel containing the message
    </ResponseField>

    <ResponseField name="timestamp" type="string" required>
      The timestamp of the message to react to
    </ResponseField>

    <ResponseField name="reaction" type="string" required>
      The name of the emoji reaction (without colons)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "channel": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Channel"
        },
        "timestamp": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Timestamp"
        },
        "reaction": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Reaction"
        }
      },
      "required": [
        "success"
      ],
      "title": "AddReactionOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_channel_history — Get recent messages from a Slack channel">
    ### Parameters

    <ResponseField name="channel_id" type="string" required>
      The ID of the channel
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Number of messages to retrieve (Default: `10`)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "ChannelMessage": {
          "additionalProperties": false,
          "description": "A row in ``get_channel_history``.",
          "properties": {
            "type": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Type"
            },
            "user": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "User"
            },
            "text": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Text"
            },
            "ts": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Ts"
            },
            "thread_ts": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Thread Ts"
            },
            "reply_count": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Reply Count"
            },
            "reactions": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Reactions",
              "type": "array"
            }
          },
          "title": "ChannelMessage",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "channel": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Channel"
        },
        "messages": {
          "items": {
            "$ref": "#/$defs/ChannelMessage"
          },
          "title": "Messages",
          "type": "array"
        },
        "total": {
          "default": 0,
          "title": "Total",
          "type": "integer"
        },
        "has_more": {
          "default": false,
          "title": "Has More",
          "type": "boolean"
        }
      },
      "required": [
        "success"
      ],
      "title": "GetChannelHistoryOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_thread_replies — Get all replies in a message thread">
    ### Parameters

    <ResponseField name="channel_id" type="string" required>
      The ID of the channel containing the thread
    </ResponseField>

    <ResponseField name="thread_ts" type="string" required>
      The timestamp of the parent message (format: '1234567890.123456')
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "ThreadMessage": {
          "additionalProperties": false,
          "description": "A row in ``get_thread_replies``.",
          "properties": {
            "type": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Type"
            },
            "user": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "User"
            },
            "text": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Text"
            },
            "ts": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Ts"
            },
            "thread_ts": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Thread Ts"
            },
            "parent_user_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Parent User Id"
            },
            "reactions": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Reactions",
              "type": "array"
            }
          },
          "title": "ThreadMessage",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "channel": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Channel"
        },
        "thread_ts": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Thread Ts"
        },
        "messages": {
          "items": {
            "$ref": "#/$defs/ThreadMessage"
          },
          "title": "Messages",
          "type": "array"
        },
        "total": {
          "default": 0,
          "title": "Total",
          "type": "integer"
        },
        "has_more": {
          "default": false,
          "title": "Has More",
          "type": "boolean"
        }
      },
      "required": [
        "success"
      ],
      "title": "GetThreadRepliesOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_users — Get a list of all users in the Slack workspace with their basic profile information">
    ### Parameters

    <ResponseField name="team_id" type="string">
      Team/workspace ID
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Maximum number of users to return (max 200) (Default: `100`)
    </ResponseField>

    <ResponseField name="cursor" type="string">
      Pagination cursor for next page of results
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "User": {
          "additionalProperties": false,
          "description": "A row in ``get_users``.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Name"
            },
            "real_name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Real Name"
            },
            "display_name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Display Name"
            },
            "email": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Email"
            },
            "is_admin": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Is Admin"
            },
            "is_owner": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Is Owner"
            },
            "is_bot": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Is Bot"
            },
            "deleted": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Deleted"
            },
            "tz": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Tz"
            },
            "updated": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Updated"
            }
          },
          "title": "User",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "users": {
          "items": {
            "$ref": "#/$defs/User"
          },
          "title": "Users",
          "type": "array"
        },
        "total": {
          "default": 0,
          "title": "Total",
          "type": "integer"
        },
        "next_cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Next Cursor"
        }
      },
      "required": [
        "success"
      ],
      "title": "GetUsersOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_user_profile — Get detailed profile information for a specific user">
    ### Parameters

    <ResponseField name="user_id" type="string" required>
      The ID of the user
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "UserProfile": {
          "additionalProperties": false,
          "description": "The ``profile`` block of ``get_user_profile``.",
          "properties": {
            "real_name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Real Name"
            },
            "display_name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Display Name"
            },
            "email": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Email"
            },
            "phone": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Phone"
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Title"
            },
            "status_text": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Status Text"
            },
            "status_emoji": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Status Emoji"
            },
            "image_24": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Image 24"
            },
            "image_48": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Image 48"
            },
            "image_72": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Image 72"
            },
            "image_192": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Image 192"
            },
            "image_512": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Image 512"
            }
          },
          "title": "UserProfile",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "user_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "User Id"
        },
        "profile": {
          "anyOf": [
            {
              "$ref": "#/$defs/UserProfile"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "GetUserProfileOutput",
      "type": "object"
    }
    ```
  </Accordion>
</AccordionGroup>

## Limits & Quotas

* **Tier 1** (most read endpoints): \~60 req/min.
* **Tier 2** (`chat.postMessage`, `reactions.add`): \~20 req/min.
* **Tier 3** (`conversations.history`, `users.list`): \~100 req/min.
* Slack reports errors as HTTP 200 with `ok: false` and an `error`
  field — the tools surface this in the output as `success: False` +
  `error`, *not* an exception. Plan for retry/back-off based on the
  string error code (e.g. `ratelimited`, `channel_not_found`).

## Related integrations

<CardGroup cols={3}>
  <Card title="Telegram Bot" href="/integrations/tools/telegram" />

  <Card title="Gmail" href="/integrations/tools/gmail" />

  <Card title="Twilio Voice" href="/integrations/tools/twilio-voice" />
</CardGroup>

## Links

* [Slack](https://slack.com)
