# Slack

> Post, schedule and edit Slack messages with Markdown or Block Kit, share and download files, and manage channels, reactions, pins and bookmarks. Look people up by email or name, and work with user groups, canvases, Lists and Workflow Builder workflows.

App · Messaging · 79 actions · 6 triggers. Web page: https://docs.lodol.com/docs/integrations/slack

## Triggers

Start a workflow when something happens in Slack. See [how triggers work](https://docs.lodol.com/docs/concepts/triggers.md).

### New Slack message

Runs when a new message is posted in a Slack channel.

**Filters**: Narrow which events start a run.

- `channel_id` (required)
- `from_user`
- `keyword`

**Event fields**: What a run starts with. Later steps read each field with an @ reference.

- `message_ts` (text)
- `channel_id` (text)
- `user_id` (text)
- `text` (text)

### Channel created

Runs when a new Slack channel is created.

**Event fields**: What a run starts with. Later steps read each field with an @ reference.

- `channel_id` (text)
- `name` (text)
- `is_private` (true/false)
- `creator_id` (text)
- `created` (number)

### New command in channel

Runs when a message in a Slack channel starts with a command word.

**Filters**: Narrow which events start a run.

- `channel_id` (required)
- `command` (required)
- `from_user`

**Event fields**: What a run starts with. Later steps read each field with an @ reference.

- `message_ts` (text)
- `channel_id` (text)
- `user_id` (text)
- `text` (text)
- `command` (text)
- `arguments` (text)

### New mention in channel

Runs when someone is mentioned in a Slack channel.

**Filters**: Narrow which events start a run.

- `channel_id` (required)
- `user_id`
- `from_user`

**Event fields**: What a run starts with. Later steps read each field with an @ reference.

- `message_ts` (text)
- `channel_id` (text)
- `user_id` (text)
- `text` (text)
- `mentioned_user_id` (text)

### Reaction added to message

Runs when an emoji reaction is added to a Slack message.

**Filters**: Narrow which events start a run.

- `channel_id` (required)
- `emoji`
- `from_user`

**Event fields**: What a run starts with. Later steps read each field with an @ reference.

- `message_ts` (text)
- `channel_id` (text)
- `emoji` (text)
- `user_id` (text)
- `text` (text)

### Reaction removed from message

Runs when an emoji reaction is removed from a Slack message.

**Filters**: Narrow which events start a run.

- `channel_id` (required)
- `emoji`
- `from_user`

**Event fields**: What a run starts with. Later steps read each field with an @ reference.

- `message_ts` (text)
- `channel_id` (text)
- `emoji` (text)
- `user_id` (text)
- `text` (text)

## Actions

### Add a bookmark

Add a link to the bookmarks bar under a channel's name, such as this week's dashboard or the current release notes. A channel holds up to 100 bookmarks.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Title (`title`, text, required): The bookmark's title.
- Link (`link`, text, required): The web address to bookmark, starting with https://.
- Emoji (`emoji`, text): An emoji to show beside the bookmark, e.g. pushpin or :pushpin:.

**Outputs**

- `bookmark` (object): The bookmark.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "bookmark": {
    "channel_id": "example_value",
    "date_created": 1,
    "date_updated": 1,
    "emoji": "example_value",
    "icon_url": "example_value",
    "id": "example_value",
    "link": "example_value",
    "title": "example_value",
    "type": "example_value"
  },
  "status": "example_value"
}
```

### Add a List item

Add an item to a Slack List, filling in the columns you give. Needs a paid Slack plan.

**Inputs**

- List (`list_id`, text, required): The List's ID (it starts with F), as Create a List returns it, or the List's link from Slack (Copy link).
- Values (`fields`, object): Values by column. A choice column takes the choice's name, a people or channel column takes member or channel IDs, and several values are separated by commas. Dates are YYYY-MM-DD and checkboxes true or false.
- Subtask of (`parent_item_id`, text): To add a subtask, the ID of the item it belongs under.

**Outputs**

- `item` (object): The List item.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "item": {
    "archived": true,
    "created_by": "example_value",
    "date_created": 1,
    "fields": {},
    "id": "example_value",
    "list_id": "example_value",
    "parent_item_id": "example_value",
    "updated_by": "example_value"
  },
  "status": "example_value"
}
```

### Add a reaction

Add an emoji reaction to a Slack message.

**Inputs**

- Channel (`channel_id`, text, required): The channel that contains the message to react to.
- Message timestamp (`timestamp`, text, required): The timestamp of the message to react to (the value returned when the message was sent).
- Emoji (`emoji`, text, required): The emoji name, for example thumbsup or :thumbsup: (surrounding colons are optional).

**Outputs**

- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "status": "example_value"
}
```

### Add people to a user group

Add people to a user group, keeping everyone already in it. People already in the group are left as they are. Needs a paid Slack plan, and a workspace setting that lets everyone manage user groups (by default only admins can).

**Inputs**

- User group (`user_group_id`, text, required): The user group (an @team handle) to act on.
- People (`user_ids`, list, required): The people to act on. Guests and bots can't be in a user group.

**Outputs**

- `added` (list): IDs of the people who were added.
- `already_members` (list): IDs of the people who were already in it.
- `status` (text): Operation status (typically 'success').
- `user_group_id` (text): Group ID.
- `user_ids` (list): IDs of everyone in the group now.

**Example output**

```json
{
  "added": [],
  "already_members": [],
  "status": "example_value",
  "user_group_id": "example_value",
  "user_ids": []
}
```

### Archive a channel

Archive a Slack channel.

**Inputs**

- Channel (`channel_id`, text, required): The channel to archive.

**Outputs**

- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "status": "example_value"
}
```

### Create a canvas

Create a canvas from Markdown, such as a weekly report or an incident summary. With a channel it is added to that channel as a tab its members can edit. Without one it is a standalone canvas that only the app can see until you share it, which needs a paid Slack plan. The app can write canvases but can't read their content back.

**Inputs**

- Title (`title`, text, required): The canvas's title.
- Content (`content`, text, required): The content, in Markdown: headings (up to ###), lists, checklists, tables, quotes, code and links. Mention someone with `![](@U123)` and a channel with `![](#C123)`. Up to about a million characters.
- Add to channel (`channel_id`, text): A channel to add the canvas to as a tab. Required on free Slack plans, which allow one such canvas per channel.

**Outputs**

- `canvas_id` (text): Canvas ID, for the other canvas steps.
- `channel_id` (text): Channel it was added to, if any.
- `permalink` (text): Link to the canvas, when Slack returns one.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "canvas_id": "example_value",
  "channel_id": "example_value",
  "permalink": "example_value",
  "status": "example_value"
}
```

### Create a channel

Create a new public or private Slack channel.

**Inputs**

- Channel name (`name`, text, required): The name for the new channel. Capitals become lowercase and spaces become hyphens automatically.
- Private channel (`is_private`, true/false): Set to true to make the channel private. Default: `false`.
- Topic (`topic`, text): A topic to set for the channel.
- Description (`description`, text): A description of what the channel is for, shown in its details (Slack calls this the channel's purpose).

**Outputs**

- `channel` (object)
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channel": {
    "id": "example_value",
    "is_archived": true,
    "is_private": true,
    "name": "example_value"
  },
  "status": "example_value"
}
```

### Create a channel canvas

Create a channel's own canvas, the one shown in the channel's header, for example to hold a project's plan or a team's links. A channel has only one. If it already has one, nothing is written and its ID comes back with created set to false, so you can change it with Edit a canvas.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Content (`content`, text, required): The content, in Markdown: headings (up to ###), lists, checklists, tables, quotes, code and links. Mention someone with `![](@U123)` and a channel with `![](#C123)`. Up to about a million characters.
- Title (`title`, text): The canvas's title.

**Outputs**

- `canvas_id` (text): ID of the channel's canvas.
- `channel_id` (text): Channel ID.
- `created` (true/false): False when the channel already had a canvas.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "canvas_id": "example_value",
  "channel_id": "example_value",
  "created": true,
  "status": "example_value"
}
```

### Create a List

Create a Slack List, a table of items people can track together, with the columns you name or copied from another List. A List the app creates is visible only to the app until it is shared, so give channels to share it with. Needs a paid Slack plan.

**Inputs**

- Name (`name`, text, required): The List's name.
- Columns (`columns`, list): The List's columns, in order. The first is its main column and must be text. A choice column lists its choices separated by commas. Leave empty for a single text column, or when copying a List.
- Description (`description`, text): What the List is for.
- Track tasks (`todo_mode`, true/false): Set to true to add Completed, Assignee and Due date columns for tracking tasks. Default: `false`.
- Copy columns from List (`copy_from_list_id`, text): A List to copy the columns from, by ID or link. Columns above are then ignored.
- Copy its items too (`include_copied_items`, true/false): When copying a List, set to true to copy its items too. Default: `false`.
- Share with channels (`share_with_channel_ids`, list): Channels whose members can view and edit the new List.

**Outputs**

- `columns` (list): The List's columns.
- `list_id` (text): List ID, for the other List steps.
- `permalink` (text): Link to the List, when Slack returns one.
- `shared_with_channel_ids` (list): IDs of the channels it was shared with.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "columns": [],
  "list_id": "example_value",
  "permalink": "example_value",
  "shared_with_channel_ids": [],
  "status": "example_value"
}
```

### Create a user group

Create a user group, an @team handle that notifies everyone in it. Add people afterwards with Set user group members. Needs a paid Slack plan, and a workspace setting that lets everyone manage user groups (by default only admins can).

**Inputs**

- Name (`name`, text, required): The group's name, e.g. On-call Engineers. Must be unique.
- Handle (`handle`, text): The handle people mention, e.g. oncall for @oncall. Must not match a channel, a member or another group.
- Description (`description`, text): What the group is for.
- Default channels (`default_channel_ids`, list): Channels that people added to the group are added to as well.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `user_group` (object): The user group.

**Example output**

```json
{
  "status": "example_value",
  "user_group": {
    "created_by": "example_value",
    "date_create": 1,
    "date_update": 1,
    "default_channel_ids": [],
    "description": "example_value",
    "handle": "example_value",
    "id": "example_value",
    "is_disabled": true,
    "name": "example_value",
    "user_count": 1,
    "user_ids": []
  }
}
```

### Delete a canvas

Delete a canvas. Slack has no way to get a deleted canvas back.

**Inputs**

- Canvas (`canvas_id`, text, required): The canvas: pick one the app can see, or enter its ID (it starts with F) or its link.

**Outputs**

- `canvas_id` (text): ID of the deleted canvas.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "canvas_id": "example_value",
  "status": "example_value"
}
```

### Delete a file

Delete a file from Slack. The Lodol app can delete files it uploaded; Slack refuses files other people shared.

**Inputs**

- File ID (`file_id`, text, required): The ID of a Slack file, such as the 'id' Upload a file or List files returns (it starts with F).

**Outputs**

- `file_id` (text): ID of the deleted file.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "file_id": "example_value",
  "status": "example_value"
}
```

### Delete a List item

Delete an item from a Slack List. Needs a paid Slack plan.

**Inputs**

- List (`list_id`, text, required): The List's ID (it starts with F), as Create a List returns it, or the List's link from Slack (Copy link).
- Item ID (`item_id`, text, required): The item's ID (it starts with Rec), as Add a List item returns it.

**Outputs**

- `item_id` (text): ID of the deleted item.
- `list_id` (text): List ID.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "item_id": "example_value",
  "list_id": "example_value",
  "status": "example_value"
}
```

### Delete a message

Delete a Slack message. A bot connection can only delete messages it posted itself.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Message timestamp (`timestamp`, text, required): The timestamp of the message (the 'ts' value returned when the message was sent).

**Outputs**

- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "status": "example_value"
}
```

### Delete a scheduled message

Cancel a message scheduled with Schedule a message before it is sent. Slack can't cancel one due within the next 60 seconds.

**Inputs**

- Channel (`channel_id`, text, required): The channel the message is scheduled for.
- Scheduled message ID (`scheduled_message_id`, text, required): The 'scheduled_message_id' Schedule a message returned, or an 'id' from List scheduled messages.

**Outputs**

- `channel_id` (text): Channel the message was scheduled for.
- `scheduled_message_id` (text): ID of the cancelled message.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channel_id": "example_value",
  "scheduled_message_id": "example_value",
  "status": "example_value"
}
```

### Disable a user group

Disable a user group so its handle stops notifying anyone. Enable a user group brings it back. Needs a paid Slack plan, and a workspace setting that lets everyone manage user groups (by default only admins can).

**Inputs**

- User group (`user_group_id`, text, required): The user group (an @team handle) to act on.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `user_group` (object): The user group.

**Example output**

```json
{
  "status": "example_value",
  "user_group": {
    "created_by": "example_value",
    "date_create": 1,
    "date_update": 1,
    "default_channel_ids": [],
    "description": "example_value",
    "handle": "example_value",
    "id": "example_value",
    "is_disabled": true,
    "name": "example_value",
    "user_count": 1,
    "user_ids": []
  }
}
```

### Download a file

Save a file shared in Slack as a Lodol document, so later steps can read or attach it (an invoice to extract data from, say). Files up to 100 MB. A file only linked from another service, like Google Drive, can't be downloaded through Slack.

**Inputs**

- File ID (`file_id`, text, required): The ID of a Slack file, such as the 'id' Upload a file or List files returns (it starts with F).

**Outputs**

- `content_type` (text): MIME type of the file.
- `document_ref` (text): Reference to the saved document, for steps that take a file.
- `documents` (list): The saved document, as a one-item list for steps that take several.
- `file` (object): The file's details in Slack.
- `filename` (text): File name.
- `size_bytes` (number): Size in bytes.
- `status` (text): Operation status (typically 'success').
- `url` (text): Lodol address that serves the saved document.

**Example output**

```json
{
  "content_type": "example_value",
  "document_ref": "example_value",
  "documents": [],
  "file": {
    "created": 1,
    "filetype": "example_value",
    "id": "example_value",
    "is_external": true,
    "is_public": true,
    "mimetype": "example_value",
    "name": "example_value",
    "permalink": "example_value",
    "pretty_type": "example_value",
    "public_url_shared": true,
    "shared_in": [],
    "size": 1,
    "title": "example_value",
    "url_private": "example_value",
    "url_private_download": "example_value",
    "user": "example_value"
  },
  "filename": "example_value",
  "size_bytes": 1,
  "status": "example_value",
  "url": "example_value"
}
```

### Edit a bookmark

Change a bookmark's title, link or emoji. Anything left empty stays as it is.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Bookmark (`bookmark_id`, text, required): The bookmark to change, from the channel chosen above.
- New title (`title`, text): The bookmark's new title.
- New link (`link`, text): The new web address, starting with https://.
- Emoji (`emoji`, text): An emoji to show beside the bookmark, e.g. pushpin or :pushpin:.

**Outputs**

- `bookmark` (object): The bookmark.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "bookmark": {
    "channel_id": "example_value",
    "date_created": 1,
    "date_updated": 1,
    "emoji": "example_value",
    "icon_url": "example_value",
    "id": "example_value",
    "link": "example_value",
    "title": "example_value",
    "type": "example_value"
  },
  "status": "example_value"
}
```

### Edit a canvas

Make one change to a canvas: add Markdown at the start or end, before or after a section, replace a section or the whole canvas, delete a section, or rename it. Name a section by text only it contains, or by an ID from Find canvas sections.

**Inputs**

- Canvas (`canvas_id`, text, required): The canvas: pick one the app can see, or enter its ID (it starts with F) or its link.
- Change (`operation`, text, required): What to do to the canvas. One of: `insert_at_end` (Add at the end), `insert_at_start` (Add at the start), `insert_after` (Add after a section), `insert_before` (Add before a section), `replace` (Replace a section or everything), `delete` (Delete a section), `rename` (Rename the canvas).
- Content (`content`, text): The Markdown to add or to replace with. Not used to delete a section or rename the canvas.
- Section with text (`section_contains_text`, text): For a change to one section: text that only that section contains, such as its heading. Leave empty to replace the whole canvas.
- Section ID (`section_id`, text): Instead of text, the section's ID from Find canvas sections.
- New title (`title`, text): For Rename the canvas: its new title.

**Outputs**

- `canvas_id` (text): Canvas ID.
- `operation` (text): The change that was made.
- `section_id` (text): ID of the section changed or used, if any.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "canvas_id": "example_value",
  "operation": "example_value",
  "section_id": "example_value",
  "status": "example_value"
}
```

### Edit a message

Replace the text of a message the app has already posted. A message with Block Kit blocks loses them unless the edit sends blocks again.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Message timestamp (`timestamp`, text, required): The timestamp of the message (the 'ts' value returned when the message was sent).
- New message (`text`, text, required): The text that replaces the message's current text.
- Text format (`text_format`, text): How the message text is written. Slack formatting, the default, uses Slack's own markup: *bold*, _italic_ and <https://example.com|a link>. Markdown takes standard Markdown, such as the output of an AI step: **bold**, [a link](https://example.com), headings, lists and tables, up to 12,000 characters. Markdown can't be combined with Block Kit blocks. One of: `slack` (Slack formatting), `markdown`. Default: `slack`.
- Block Kit blocks (`blocks`, text): Optional Block Kit layout as JSON: a list of blocks, or the whole payload Block Kit Builder exports. The message text is still required, because Slack shows it in notifications, which don't display blocks. At most 50 blocks.
- Also send to channel (`reply_broadcast`, true/false): For a reply in a thread, set to true to also show it in the channel. Default: `false`.

**Outputs**

- `channel` (text): ID of the channel holding the edited message.
- `status` (text): Operation status (typically 'success').
- `ts` (text): Timestamp of the edited message.

**Example output**

```json
{
  "channel": "example_value",
  "status": "example_value",
  "ts": "example_value"
}
```

### Enable a user group

Re-enable a disabled user group. Needs a paid Slack plan, and a workspace setting that lets everyone manage user groups (by default only admins can).

**Inputs**

- User group (`user_group_id`, text, required): The user group (an @team handle) to act on.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `user_group` (object): The user group.

**Example output**

```json
{
  "status": "example_value",
  "user_group": {
    "created_by": "example_value",
    "date_create": 1,
    "date_update": 1,
    "default_channel_ids": [],
    "description": "example_value",
    "handle": "example_value",
    "id": "example_value",
    "is_disabled": true,
    "name": "example_value",
    "user_count": 1,
    "user_ids": []
  }
}
```

### Export a List

Export a Slack List as a CSV or JSON file saved as a Lodol document, for a spreadsheet, a report or another step. Needs a paid Slack plan.

**Inputs**

- List (`list_id`, text, required): The List's ID (it starts with F), as Create a List returns it, or the List's link from Slack (Copy link).
- Format (`format`, text): The file format. One of: `csv`, `json`. Default: `csv`.
- Include archived items (`include_archived`, true/false): Set to true to include archived items. Default: `false`.

**Outputs**

- `content_type` (text): text/csv or application/json.
- `document_ref` (text): Reference to the saved export, for steps that take a file.
- `filename` (text): File name.
- `list_id` (text): List ID.
- `size_bytes` (number): Size in bytes.
- `status` (text): Operation status (typically 'success').
- `url` (text): Lodol address that serves the saved export.

**Example output**

```json
{
  "content_type": "example_value",
  "document_ref": "example_value",
  "filename": "example_value",
  "list_id": "example_value",
  "size_bytes": 1,
  "status": "example_value",
  "url": "example_value"
}
```

### Find a channel by name

Find a channel by its name and get its ID, for example to post in a channel named in a form or spreadsheet. Private channels are found only if the Lodol app is a member.

**Inputs**

- Channel name (`name`, text, required): The channel's name, with or without the #. Matching ignores capitals, and spaces match hyphens.
- Include archived channels (`include_archived`, true/false): Set to true to also match archived channels. Default: `false`.

**Outputs**

- `channel` (object): The matching channel, or null when none was found.
- `found` (true/false): Whether a match was found. The other fields are empty when not.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channel": {
    "created": 1,
    "creator": "example_value",
    "description": "example_value",
    "id": "example_value",
    "is_archived": true,
    "is_general": true,
    "is_member": true,
    "is_private": true,
    "is_shared": true,
    "name": "example_value",
    "num_members": 1,
    "topic": "example_value"
  },
  "found": true,
  "status": "example_value"
}
```

### Find a user by email

Find the workspace member with an email address, for example to message the person behind a form entry or CRM record. Deactivated accounts aren't found.

**Inputs**

- Email (`email`, text, required): The member's email address.

**Outputs**

- `found` (true/false): Whether a match was found. The other fields are empty when not.
- `status` (text): Operation status (typically 'success').
- `user` (object): The matching member, or null when none was found.

**Example output**

```json
{
  "found": true,
  "status": "example_value",
  "user": {
    "deleted": true,
    "display_name": "example_value",
    "email": "example_value",
    "id": "example_value",
    "image_url": "example_value",
    "is_admin": true,
    "is_bot": true,
    "name": "example_value",
    "real_name": "example_value",
    "status_emoji": "example_value",
    "status_text": "example_value",
    "timezone": "example_value",
    "title": "example_value"
  }
}
```

### Find a user by name

Find a workspace member by handle, display name or full name, ignoring capitals. Names aren't unique, so the first match is returned with a count of all matches; use an ID or email when you have one.

**Inputs**

- Name (`name`, text, required): The name to look for, with or without the @.
- Include deactivated accounts (`include_deactivated`, true/false): Set to true to also match deactivated members. Default: `false`.

**Outputs**

- `found` (true/false): Whether a match was found. The other fields are empty when not.
- `match_count` (number): How many members matched the name.
- `status` (text): Operation status (typically 'success').
- `user` (object): The matching member, or null when none was found.

**Example output**

```json
{
  "found": true,
  "match_count": 1,
  "status": "example_value",
  "user": {
    "deleted": true,
    "display_name": "example_value",
    "email": "example_value",
    "id": "example_value",
    "image_url": "example_value",
    "is_admin": true,
    "is_bot": true,
    "name": "example_value",
    "real_name": "example_value",
    "status_emoji": "example_value",
    "status_text": "example_value",
    "timezone": "example_value",
    "title": "example_value"
  }
}
```

### Find canvas sections

Find the IDs of a canvas's sections by kind (headings, lists, tables and so on) or by the text they contain, for Edit a canvas. Slack returns IDs only, not the sections' text.

**Inputs**

- Canvas (`canvas_id`, text, required): The canvas: pick one the app can see, or enter its ID (it starts with F) or its link.
- Kinds of section (`section_types`, list): Only find these kinds of section. One or more of: `any_header` (Any heading), `h1` (Heading 1), `h2` (Heading 2), `h3` (Heading 3), `list`, `table`, `blockquote` (Quote), `callout`, `horizontal_line` (Divider), `user_mention` (Mention).
- Containing text (`contains_text`, text): Only find sections containing this text.

**Outputs**

- `canvas_id` (text): Canvas ID.
- `section_ids` (list): IDs of the matching sections, in order.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "canvas_id": "example_value",
  "section_ids": [],
  "status": "example_value"
}
```

### Find messages

Return every recent message matching your search criteria. Searches one channel when you pick one, otherwise the recent history of the channels the Lodol app belongs to.

**Inputs**

- Search text (`query`, text, required): Text to look for in the message. Matching ignores upper/lower case.
- Channel (`channel_id`, text): Limit the search to one channel. Leave empty to search every channel the Lodol app is a member of.
- From user (`from_user`, text): Only return messages from this person. Leave empty to match any sender.
- Max results (`limit`, number): The maximum number of messages to return, from 1 to 1000. From 1 to 1000. Default: `20`.

**Outputs**

- `messages` (list): The matching messages.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "messages": [],
  "status": "example_value"
}
```

### Get a channel

Get a channel's details: name, topic, description, creator, whether it is private or archived, and its member count.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.

**Outputs**

- `channel` (object): The channel's details.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channel": {
    "created": 1,
    "creator": "example_value",
    "description": "example_value",
    "id": "example_value",
    "is_archived": true,
    "is_general": true,
    "is_member": true,
    "is_private": true,
    "is_shared": true,
    "name": "example_value",
    "num_members": 1,
    "topic": "example_value"
  },
  "status": "example_value"
}
```

### Get a file

Get a file's details: name, type, size, who shared it and where. The Lodol app sees files shared in the channels it belongs to.

**Inputs**

- File ID (`file_id`, text, required): The ID of a Slack file, such as the 'id' Upload a file or List files returns (it starts with F).

**Outputs**

- `file` (object): The file's details.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "file": {
    "created": 1,
    "filetype": "example_value",
    "id": "example_value",
    "is_external": true,
    "is_public": true,
    "mimetype": "example_value",
    "name": "example_value",
    "permalink": "example_value",
    "pretty_type": "example_value",
    "public_url_shared": true,
    "shared_in": [],
    "size": 1,
    "title": "example_value",
    "url_private": "example_value",
    "url_private_download": "example_value",
    "user": "example_value"
  },
  "status": "example_value"
}
```

### Get a List item

Get one item from a Slack List, with its values by column name. Needs a paid Slack plan.

**Inputs**

- List (`list_id`, text, required): The List's ID (it starts with F), as Create a List returns it, or the List's link from Slack (Copy link).
- Item ID (`item_id`, text, required): The item's ID (it starts with Rec), as Add a List item returns it.

**Outputs**

- `item` (object): The List item.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "item": {
    "archived": true,
    "created_by": "example_value",
    "date_created": 1,
    "fields": {},
    "id": "example_value",
    "list_id": "example_value",
    "parent_item_id": "example_value",
    "updated_by": "example_value"
  },
  "status": "example_value"
}
```

### Get a message by timestamp

Fetch a single Slack message by its channel and timestamp.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Message timestamp (`timestamp`, text, required): The timestamp of the message (the 'ts' value returned when the message was sent).

**Outputs**

- `message` (object): The message at the requested timestamp.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "message": {
    "channel": "example_value",
    "reactions": [],
    "reply_count": 1,
    "text": "example_value",
    "thread_ts": "example_value",
    "ts": "example_value",
    "user": "example_value"
  },
  "status": "example_value"
}
```

### Get a message link

Get a shareable link to a message, including a reply in a thread. Only people who can see the channel can open it.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Message timestamp (`timestamp`, text, required): The timestamp of the message (the 'ts' value returned when the message was sent).

**Outputs**

- `channel` (text): Channel ID.
- `permalink` (text): Link to the message in Slack.
- `status` (text): Operation status (typically 'success').
- `timestamp` (text): Timestamp of the message.

**Example output**

```json
{
  "channel": "example_value",
  "permalink": "example_value",
  "status": "example_value",
  "timestamp": "example_value"
}
```

### Get a message's reactions

List every emoji reaction on a message and who added each one.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Message timestamp (`timestamp`, text, required): The timestamp of the message (the 'ts' value returned when the message was sent).

**Outputs**

- `channel` (text): Channel ID.
- `permalink` (text): Link to the message.
- `reactions` (list): Emoji reactions on the message.
- `status` (text): Operation status (typically 'success').
- `timestamp` (text): Timestamp of the message.
- `total_count` (number): Total number of reactions across all emoji.

**Example output**

```json
{
  "channel": "example_value",
  "permalink": "example_value",
  "reactions": [],
  "status": "example_value",
  "timestamp": "example_value",
  "total_count": 1
}
```

### Get a user

Look up one workspace member's profile details by ID.

**Inputs**

- Person (`user_id`, text, required): The workspace member to look up.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `user` (object): The requested workspace member.

**Example output**

```json
{
  "status": "example_value",
  "user": {
    "deleted": true,
    "display_name": "example_value",
    "email": "example_value",
    "id": "example_value",
    "image_url": "example_value",
    "is_admin": true,
    "is_bot": true,
    "name": "example_value",
    "real_name": "example_value",
    "status_emoji": "example_value",
    "status_text": "example_value",
    "timezone": "example_value",
    "title": "example_value"
  }
}
```

### Get a user's Do Not Disturb status

Check a member's Do Not Disturb schedule, for example before sending a non-urgent message. A snooze the person turned on by hand isn't visible to apps.

**Inputs**

- Person (`user_id`, text, required): The workspace member to act on.

**Outputs**

- `dnd_enabled` (true/false): Whether the member has a Do Not Disturb schedule on.
- `in_do_not_disturb_now` (true/false): True when the schedule is on and now falls inside that window.
- `next_dnd_end_ts` (number): End of that window, as a Unix timestamp.
- `next_dnd_start_ts` (number): Start of the scheduled window Slack reports, as a Unix timestamp.
- `status` (text): Operation status (typically 'success').
- `user_id` (text): Member ID.

**Example output**

```json
{
  "dnd_enabled": true,
  "in_do_not_disturb_now": true,
  "next_dnd_end_ts": 1,
  "next_dnd_start_ts": 1,
  "status": "example_value",
  "user_id": "example_value"
}
```

### Get a user's presence

Check whether a member is active in Slack right now or away.

**Inputs**

- Person (`user_id`, text, required): The workspace member to act on.

**Outputs**

- `is_active` (true/false): True when the member is active.
- `presence` (text): 'active' or 'away'.
- `status` (text): Operation status (typically 'success').
- `user_id` (text): Member ID.

**Example output**

```json
{
  "is_active": true,
  "presence": "example_value",
  "status": "example_value",
  "user_id": "example_value"
}
```

### Get a user's profile

Get a member's profile: name, title, contact details, status and the workspace's custom profile fields.

**Inputs**

- Person (`user_id`, text, required): The workspace member to act on.

**Outputs**

- `profile` (object): The member's profile.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "profile": {
    "custom_fields": [],
    "display_name": "example_value",
    "email": "example_value",
    "first_name": "example_value",
    "image_url": "example_value",
    "last_name": "example_value",
    "phone": "example_value",
    "pronouns": "example_value",
    "real_name": "example_value",
    "status_emoji": "example_value",
    "status_expiration": 1,
    "status_text": "example_value",
    "title": "example_value",
    "user_id": "example_value"
  },
  "status": "example_value"
}
```

### Get channel history

Read a channel's recent messages, newest first. Optionally restrict the read to a timestamp window.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Max messages (`limit`, number): The maximum number of messages to return, from 1 to 1000. From 1 to 1000. Default: `20`.
- Oldest timestamp (`oldest`, text): Only return messages at or after this message timestamp (the 'ts' value of an earlier message). Leave empty for no lower bound.
- Newest timestamp (`latest`, text): Only return messages at or before this message timestamp. Leave empty to start from the most recent message.

**Outputs**

- `messages` (list): The matching messages.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "messages": [],
  "status": "example_value"
}
```

### Get thread messages

List every message in a thread, starting with the message that started it.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Thread timestamp (`thread_ts`, text, required): The timestamp of the message that started the thread (the 'ts' value returned when that message was sent).
- Max messages (`limit`, number): The maximum number of messages to return, from 1 to 1000. From 1 to 1000. Default: `100`.

**Outputs**

- `messages` (list): The matching messages.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "messages": [],
  "status": "example_value"
}
```

### Get workspace info

Get the connected workspace's name, address, email domain and icon.

**Inputs**: None.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `workspace` (object): The workspace.

**Example output**

```json
{
  "status": "example_value",
  "workspace": {
    "domain": "example_value",
    "email_domain": "example_value",
    "enterprise_id": "example_value",
    "enterprise_name": "example_value",
    "icon_url": "example_value",
    "id": "example_value",
    "name": "example_value",
    "url": "example_value"
  }
}
```

### Invite a user to a channel

Add one or more workspace members to a Slack channel.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- People (`user_ids`, text, required): The people to add to the channel. Enter one member, or several separated by commas.
- Skip people who can't be added (`skip_invalid`, true/false): By default Slack adds nobody if any one person can't be added (a deactivated account, say). Set to true to add everyone who can be and skip the rest. Default: `false`.

**Outputs**

- `channel_id` (text): ID of the channel the people were added to.
- `status` (text): Operation status (typically 'success').
- `user_ids` (list): IDs of the people who were added.

**Example output**

```json
{
  "channel_id": "example_value",
  "status": "example_value",
  "user_ids": []
}
```

### Join a channel

Add the Lodol app to a public channel so it can read the channel's messages. A private channel has to invite the app with /invite in Slack instead.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.

**Outputs**

- `already_member` (true/false): True when the app was already in the channel.
- `channel` (object): The channel joined.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "already_member": true,
  "channel": {
    "created": 1,
    "creator": "example_value",
    "description": "example_value",
    "id": "example_value",
    "is_archived": true,
    "is_general": true,
    "is_member": true,
    "is_private": true,
    "is_shared": true,
    "name": "example_value",
    "num_members": 1,
    "topic": "example_value"
  },
  "status": "example_value"
}
```

### Leave a channel

Take the Lodol app out of a channel. Its triggers and read actions stop seeing that channel's messages, and a private channel would have to invite it back. Leaving also gives up the channel manager role the app holds in channels it created, so after rejoining it may no longer be allowed to remove members.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.

**Outputs**

- `channel_id` (text): Channel ID.
- `status` (text): Operation status (typically 'success').
- `was_member` (true/false): False when the app wasn't in the channel.

**Example output**

```json
{
  "channel_id": "example_value",
  "status": "example_value",
  "was_member": true
}
```

### List a user's channels

List the channels a member belongs to: every public channel they're in, plus private channels the Lodol app shares with them.

**Inputs**

- Person (`user_id`, text, required): The workspace member to act on.
- Hide archived channels (`exclude_archived`, true/false): Set to false to include archived channels. Default: `true`.
- Max channels (`limit`, number): The maximum number of channels to return, from 1 to 1000. From 1 to 1000. Default: `200`.

**Outputs**

- `channels` (list): The member's channels.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channels": [],
  "status": "example_value"
}
```

### List bookmarks

List the bookmarks in a channel's bookmarks bar.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.

**Outputs**

- `bookmarks` (list): The channel's bookmarks.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "bookmarks": [],
  "status": "example_value"
}
```

### List channels

List the Slack channels you can access, optionally hiding archived ones.

**Inputs**

- Hide archived channels (`exclude_archived`, true/false): Set to true to leave out archived channels. Default: `true`.
- Max channels (`limit`, number): The maximum number of channels to return, from 1 to 1000. From 1 to 1000.
- Only channels the app is in (`member_only`, true/false): Set to true to list only the channels the Lodol app is a member of, which are the ones its read actions can see. Default: `false`.

**Outputs**

- `channels` (list): Channels visible to the bot.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channels": [],
  "status": "example_value"
}
```

### List custom emoji

List the workspace's custom emoji, alphabetically.

**Inputs**

- Include aliases (`include_aliases`, true/false): Set to false to leave out aliases (extra names for another emoji). Default: `true`.

**Outputs**

- `emoji` (list): The custom emoji.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "emoji": [],
  "status": "example_value"
}
```

### List files

List files shared in the workspace, newest first, optionally narrowed to a channel, a person, file types or a date range. Only files the Lodol app can see are listed, and a file shared in the last few seconds may not be listed yet.

**Inputs**

- Channel (`channel_id`, text): Only list files shared in this channel.
- Shared by (`from_user`, text): Only list files this person shared.
- File types (`types`, list): Only list these kinds of file. Leave empty for all. One or more of: `spaces` (Posts), `snippets`, `images`, `pdfs`, `gdocs` (Google Docs), `zips` (Zip files), `canvas` (Canvases).
- Shared after (`created_after`, date and time): Only list files shared at or after this time.
- Shared before (`created_before`, date and time): Only list files shared at or before this time.
- Max results (`limit`, number): The maximum number of results to return, from 1 to 1000. From 1 to 1000. Default: `100`.

**Outputs**

- `files` (list): The matching files, newest first.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "files": [],
  "status": "example_value"
}
```

### List items in a List

Get the items in a Slack List, with its title and columns. Needs a paid Slack plan.

**Inputs**

- List (`list_id`, text, required): The List's ID (it starts with F), as Create a List returns it, or the List's link from Slack (Copy link).
- Max items (`limit`, number): The maximum number of items to return, from 1 to 5000. From 1 to 5000. Default: `100`.
- Archived items (`archived`, true/false): Set to true to get the archived items instead. Default: `false`.

**Outputs**

- `columns` (list): The List's columns.
- `items` (list): The items.
- `list_id` (text): List ID.
- `status` (text): Operation status (typically 'success').
- `title` (text): The List's title.

**Example output**

```json
{
  "columns": [],
  "items": [],
  "list_id": "example_value",
  "status": "example_value",
  "title": "example_value"
}
```

### List pinned messages

List the messages pinned in a channel.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.

**Outputs**

- `items` (list): The pinned messages.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "items": [],
  "status": "example_value"
}
```

### List profile fields

List the custom profile fields the workspace defines, such as Team or Start date, with their IDs and allowed values.

**Inputs**: None.

**Outputs**

- `fields` (list): The fields, in display order.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "fields": [],
  "status": "example_value"
}
```

### List scheduled messages

List the messages this Slack connection has scheduled that haven't been sent yet. Messages people scheduled in Slack themselves are not included.

**Inputs**

- Channel (`channel_id`, text): Only list messages scheduled for this channel.
- Max results (`limit`, number): The maximum number of results to return, from 1 to 1000. From 1 to 1000. Default: `100`.

**Outputs**

- `scheduled_messages` (list): Pending scheduled messages, soonest first as Slack returns them.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "scheduled_messages": [],
  "status": "example_value"
}
```

### List user group members

List the IDs of the people in a user group. Needs a paid Slack plan.

**Inputs**

- User group (`user_group_id`, text, required): The user group (an @team handle) to act on.
- Include a disabled group (`include_disabled`, true/false): Set to true to list the members of a disabled group too. Default: `false`.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `user_group_id` (text): Group ID.
- `user_ids` (list): IDs of the group's members.

**Example output**

```json
{
  "status": "example_value",
  "user_group_id": "example_value",
  "user_ids": []
}
```

### List user groups

List the workspace's user groups, the @team handles that notify a set of people at once. Needs a paid Slack plan.

**Inputs**

- Include disabled groups (`include_disabled`, true/false): Set to true to also list disabled user groups. Default: `false`.
- Include members (`include_members`, true/false): Set to true to include each group's member IDs. Default: `false`.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `user_groups` (list): The user groups.

**Example output**

```json
{
  "status": "example_value",
  "user_groups": []
}
```

### List users in a channel

List the members of one Slack channel.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Max users (`limit`, number): The maximum number of members to return, from 1 to 1000. From 1 to 1000.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `users` (list): The matching workspace members.

**Example output**

```json
{
  "status": "example_value",
  "users": []
}
```

### List users in the workspace

List the members of the connected Slack workspace.

**Inputs**

- Max users (`limit`, number): The maximum number of members to return, from 1 to 1000. From 1 to 1000.
- Include bots (`include_bots`, true/false): Set to false to leave out bot and app users. Default: `true`.
- Include deactivated accounts (`include_deactivated`, true/false): Set to true to also return deactivated members. Default: `false`.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `users` (list): The matching workspace members.

**Example output**

```json
{
  "status": "example_value",
  "users": []
}
```

### Pin a message

Pin a message to its channel. Pinning a message that is already pinned succeeds.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Message timestamp (`timestamp`, text, required): The timestamp of the message (the 'ts' value returned when the message was sent).

**Outputs**

- `channel_id` (text): Channel ID.
- `pinned` (true/false): Always true.
- `status` (text): Operation status (typically 'success').
- `timestamp` (text): Timestamp of the pinned message.

**Example output**

```json
{
  "channel_id": "example_value",
  "pinned": true,
  "status": "example_value",
  "timestamp": "example_value"
}
```

### Remove a bookmark

Remove a bookmark from a channel's bookmarks bar.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Bookmark (`bookmark_id`, text, required): The bookmark to change, from the channel chosen above.

**Outputs**

- `bookmark_id` (text): ID of the removed bookmark.
- `channel_id` (text): Channel ID.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "bookmark_id": "example_value",
  "channel_id": "example_value",
  "status": "example_value"
}
```

### Remove a reaction

Remove an emoji reaction the Lodol app added to a message. Reactions other people added can't be removed. If the app hadn't reacted, the step succeeds with removed set to false.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Message timestamp (`timestamp`, text, required): The timestamp of the message (the 'ts' value returned when the message was sent).
- Emoji (`emoji`, text, required): The emoji name, for example thumbsup or :thumbsup: (surrounding colons are optional).

**Outputs**

- `emoji` (text): The emoji name.
- `removed` (true/false): False when the app had no such reaction to remove.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "emoji": "example_value",
  "removed": true,
  "status": "example_value"
}
```

### Remove a user from a channel

Remove a member from a Slack channel.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Person (`user_id`, text, required): The person to remove from the channel.

**Outputs**

- `channel_id` (text): ID of the channel the person was removed from.
- `status` (text): Operation status (typically 'success').
- `user_id` (text): ID of the person who was removed.

**Example output**

```json
{
  "channel_id": "example_value",
  "status": "example_value",
  "user_id": "example_value"
}
```

### Remove people from a user group

Take people out of a user group, keeping everyone else. Slack won't leave a group empty, so disable it instead of removing everyone. Needs a paid Slack plan, and a workspace setting that lets everyone manage user groups (by default only admins can).

**Inputs**

- User group (`user_group_id`, text, required): The user group (an @team handle) to act on.
- People (`user_ids`, list, required): The people to act on. Guests and bots can't be in a user group.

**Outputs**

- `not_members` (list): IDs of the people who weren't in it.
- `removed` (list): IDs of the people who were removed.
- `status` (text): Operation status (typically 'success').
- `user_group_id` (text): Group ID.
- `user_ids` (list): IDs of everyone in the group now.

**Example output**

```json
{
  "not_members": [],
  "removed": [],
  "status": "example_value",
  "user_group_id": "example_value",
  "user_ids": []
}
```

### Rename a channel

Rename a channel. Slack lets only a channel's creator, admins and channel managers rename it, so the Lodol app can rename channels it created.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- New name (`name`, text, required): The channel's new name. Capitals become lowercase and spaces become hyphens automatically.

**Outputs**

- `channel` (object): The renamed channel.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channel": {
    "created": 1,
    "creator": "example_value",
    "description": "example_value",
    "id": "example_value",
    "is_archived": true,
    "is_general": true,
    "is_member": true,
    "is_private": true,
    "is_shared": true,
    "name": "example_value",
    "num_members": 1,
    "topic": "example_value"
  },
  "status": "example_value"
}
```

### Schedule a message

Schedule a message to be posted at a future time.

**Inputs**

- Channel (`channel_id`, text, required): The channel to post the message to.
- Message (`text`, text, required): The message text to send.
- Send at (`post_at`, date and time, required): When to send the message. Pick a date and time in the future, at most 120 days ahead.
- Reply To (`thread_ts`, text): To schedule a reply inside a thread, enter the timestamp of the first message in that thread. Leave empty to schedule a new message.
- Text format (`text_format`, text): How the message text is written. Slack formatting, the default, uses Slack's own markup: *bold*, _italic_ and <https://example.com|a link>. Markdown takes standard Markdown, such as the output of an AI step: **bold**, [a link](https://example.com), headings, lists and tables, up to 12,000 characters. Markdown can't be combined with Block Kit blocks. One of: `slack` (Slack formatting), `markdown`. Default: `slack`.
- Block Kit blocks (`blocks`, text): Optional Block Kit layout as JSON: a list of blocks, or the whole payload Block Kit Builder exports. The message text is still required, because Slack shows it in notifications, which don't display blocks. At most 50 blocks.
- Also send to channel (`reply_broadcast`, true/false): For a reply in a thread, set to true to also show the reply in the channel, like ticking 'Also send to #channel' in Slack. Default: `false`.
- Show link previews (`unfurl_links`, true/false): Set to false to stop Slack adding a preview of web pages linked in the message. Leave empty to use Slack's default.
- Show media previews (`unfurl_media`, true/false): Set to false to stop Slack previewing linked images and videos. Leave empty to use Slack's default.

**Outputs**

- `channel` (text): ID of the channel where the message is scheduled.
- `post_at` (text): Scheduled post timestamp returned by Slack.
- `scheduled_message_id` (text): ID of the scheduled message. Pass it to Delete a scheduled message to cancel it.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channel": "example_value",
  "post_at": "example_value",
  "scheduled_message_id": "example_value",
  "status": "example_value"
}
```

### Send a direct message

Send a direct message to a Slack user.

**Inputs**

- Recipient (`user_id`, text, required): The person to send the direct message to.
- Message (`text`, text, required): The message text to send.
- Text format (`text_format`, text): How the message text is written. Slack formatting, the default, uses Slack's own markup: *bold*, _italic_ and <https://example.com|a link>. Markdown takes standard Markdown, such as the output of an AI step: **bold**, [a link](https://example.com), headings, lists and tables, up to 12,000 characters. Markdown can't be combined with Block Kit blocks. One of: `slack` (Slack formatting), `markdown`. Default: `slack`.
- Block Kit blocks (`blocks`, text): Optional Block Kit layout as JSON: a list of blocks, or the whole payload Block Kit Builder exports. The message text is still required, because Slack shows it in notifications, which don't display blocks. At most 50 blocks.
- Show link previews (`unfurl_links`, true/false): Set to false to stop Slack adding a preview of web pages linked in the message. Leave empty to use Slack's default.
- Show media previews (`unfurl_media`, true/false): Set to false to stop Slack previewing linked images and videos. Leave empty to use Slack's default.
- Sender name (`username`, text): A name to show on this message instead of the app's name, e.g. 'Deploy Bot'. Slack still marks the message as sent by an app. Needs the chat:write.customize scope.
- Sender icon (emoji) (`icon_emoji`, text): An emoji to show as the sender's picture on this message, e.g. rocket or :rocket:. Takes priority over an icon URL. Needs the chat:write.customize scope.
- Sender icon (image URL) (`icon_url`, text): The web address of an image to show as the sender's picture on this message. Needs the chat:write.customize scope.

**Outputs**

- `channel` (text): ID of the direct message channel created or used.
- `status` (text): Operation status (typically 'success').
- `ts` (text): Timestamp of the posted message. Use this for add-reaction or threading (thread_ts parameter).

**Example output**

```json
{
  "channel": "example_value",
  "status": "example_value",
  "ts": "example_value"
}
```

### Send a direct message by email

Send a direct message to the workspace member with an email address, without looking up their Slack ID first. Fails if no active member has that address.

**Inputs**

- Email (`email`, text, required): The recipient's email address.
- Message (`text`, text, required): The message text to send.
- Text format (`text_format`, text): How the message text is written. Slack formatting, the default, uses Slack's own markup: *bold*, _italic_ and <https://example.com|a link>. Markdown takes standard Markdown, such as the output of an AI step: **bold**, [a link](https://example.com), headings, lists and tables, up to 12,000 characters. Markdown can't be combined with Block Kit blocks. One of: `slack` (Slack formatting), `markdown`. Default: `slack`.
- Block Kit blocks (`blocks`, text): Optional Block Kit layout as JSON: a list of blocks, or the whole payload Block Kit Builder exports. The message text is still required, because Slack shows it in notifications, which don't display blocks. At most 50 blocks.
- Show link previews (`unfurl_links`, true/false): Set to false to stop Slack adding a preview of web pages linked in the message. Leave empty to use Slack's default.
- Show media previews (`unfurl_media`, true/false): Set to false to stop Slack previewing linked images and videos. Leave empty to use Slack's default.
- Sender name (`username`, text): A name to show on this message instead of the app's name, e.g. 'Deploy Bot'. Slack still marks the message as sent by an app. Needs the chat:write.customize scope.
- Sender icon (emoji) (`icon_emoji`, text): An emoji to show as the sender's picture on this message, e.g. rocket or :rocket:. Takes priority over an icon URL. Needs the chat:write.customize scope.
- Sender icon (image URL) (`icon_url`, text): The web address of an image to show as the sender's picture on this message. Needs the chat:write.customize scope.

**Outputs**

- `channel` (text): ID of the conversation the message was posted in.
- `status` (text): Operation status (typically 'success').
- `ts` (text): Timestamp of the posted message, which is also its ID.
- `user_id` (text): ID of the member the address belongs to.

**Example output**

```json
{
  "channel": "example_value",
  "status": "example_value",
  "ts": "example_value",
  "user_id": "example_value"
}
```

### Send a group direct message

Send one message to a group direct message with 2 to 8 people. Running it again for the same people posts in the same conversation.

**Inputs**

- People (`user_ids`, list, required): The 2 to 8 people to message together.
- Message (`text`, text, required): The message text to send.
- Text format (`text_format`, text): How the message text is written. Slack formatting, the default, uses Slack's own markup: *bold*, _italic_ and <https://example.com|a link>. Markdown takes standard Markdown, such as the output of an AI step: **bold**, [a link](https://example.com), headings, lists and tables, up to 12,000 characters. Markdown can't be combined with Block Kit blocks. One of: `slack` (Slack formatting), `markdown`. Default: `slack`.
- Block Kit blocks (`blocks`, text): Optional Block Kit layout as JSON: a list of blocks, or the whole payload Block Kit Builder exports. The message text is still required, because Slack shows it in notifications, which don't display blocks. At most 50 blocks.
- Show link previews (`unfurl_links`, true/false): Set to false to stop Slack adding a preview of web pages linked in the message. Leave empty to use Slack's default.
- Show media previews (`unfurl_media`, true/false): Set to false to stop Slack previewing linked images and videos. Leave empty to use Slack's default.
- Sender name (`username`, text): A name to show on this message instead of the app's name, e.g. 'Deploy Bot'. Slack still marks the message as sent by an app. Needs the chat:write.customize scope.
- Sender icon (emoji) (`icon_emoji`, text): An emoji to show as the sender's picture on this message, e.g. rocket or :rocket:. Takes priority over an icon URL. Needs the chat:write.customize scope.
- Sender icon (image URL) (`icon_url`, text): The web address of an image to show as the sender's picture on this message. Needs the chat:write.customize scope.

**Outputs**

- `channel` (text): ID of the conversation the message was posted in.
- `status` (text): Operation status (typically 'success').
- `ts` (text): Timestamp of the posted message, which is also its ID.
- `user_ids` (list): IDs of the people in the conversation.

**Example output**

```json
{
  "channel": "example_value",
  "status": "example_value",
  "ts": "example_value",
  "user_ids": []
}
```

### Send a message to a channel

Send a message to a public or private Slack channel.

**Inputs**

- Channel (`channel_id`, text, required): The channel to post the message to.
- Message (`text`, text, required): The message text to send.
- Reply To (`thread_ts`, text): To reply inside a thread, enter the timestamp of the first message in that thread (the 'ts' value returned when a message is sent). Leave empty to post a new message.
- Text format (`text_format`, text): How the message text is written. Slack formatting, the default, uses Slack's own markup: *bold*, _italic_ and <https://example.com|a link>. Markdown takes standard Markdown, such as the output of an AI step: **bold**, [a link](https://example.com), headings, lists and tables, up to 12,000 characters. Markdown can't be combined with Block Kit blocks. One of: `slack` (Slack formatting), `markdown`. Default: `slack`.
- Block Kit blocks (`blocks`, text): Optional Block Kit layout as JSON: a list of blocks, or the whole payload Block Kit Builder exports. The message text is still required, because Slack shows it in notifications, which don't display blocks. At most 50 blocks.
- Also send to channel (`reply_broadcast`, true/false): For a reply in a thread, set to true to also show the reply in the channel, like ticking 'Also send to #channel' in Slack. Default: `false`.
- Show link previews (`unfurl_links`, true/false): Set to false to stop Slack adding a preview of web pages linked in the message. Leave empty to use Slack's default.
- Show media previews (`unfurl_media`, true/false): Set to false to stop Slack previewing linked images and videos. Leave empty to use Slack's default.
- Sender name (`username`, text): A name to show on this message instead of the app's name, e.g. 'Deploy Bot'. Slack still marks the message as sent by an app. Needs the chat:write.customize scope.
- Sender icon (emoji) (`icon_emoji`, text): An emoji to show as the sender's picture on this message, e.g. rocket or :rocket:. Takes priority over an icon URL. Needs the chat:write.customize scope.
- Sender icon (image URL) (`icon_url`, text): The web address of an image to show as the sender's picture on this message. Needs the chat:write.customize scope.

**Outputs**

- `channel` (text): ID of the channel where the message was sent.
- `status` (text): Operation status (typically 'success').
- `ts` (text): Timestamp of the posted message. Use this for add-reaction or threading (thread_ts parameter).

**Example output**

```json
{
  "channel": "C0123456789",
  "status": "success",
  "ts": "1712345678.901234"
}
```

### Send an ephemeral message

Show a message in a channel that only one member can see. Slack delivers it only while that person is active in Slack and a member of the channel, and it disappears when they reload, so use it for a nudge rather than a record.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Visible to (`user_id`, text, required): The channel member who will see the message.
- Message (`text`, text, required): The message text to show.
- Reply To (`thread_ts`, text): To post inside a thread, enter the timestamp of the first message in that thread. Leave empty to post in the channel.
- Text format (`text_format`, text): How the message text is written. Slack formatting, the default, uses Slack's own markup: *bold*, _italic_ and <https://example.com|a link>. Markdown takes standard Markdown, such as the output of an AI step: **bold**, [a link](https://example.com), headings, lists and tables, up to 12,000 characters. Markdown can't be combined with Block Kit blocks. One of: `slack` (Slack formatting), `markdown`. Default: `slack`.
- Block Kit blocks (`blocks`, text): Optional Block Kit layout as JSON: a list of blocks, or the whole payload Block Kit Builder exports. The message text is still required, because Slack shows it in notifications, which don't display blocks. At most 50 blocks.
- Sender name (`username`, text): A name to show on this message instead of the app's name, e.g. 'Deploy Bot'. Slack still marks the message as sent by an app. Needs the chat:write.customize scope.
- Sender icon (emoji) (`icon_emoji`, text): An emoji to show as the sender's picture on this message, e.g. rocket or :rocket:. Takes priority over an icon URL. Needs the chat:write.customize scope.
- Sender icon (image URL) (`icon_url`, text): The web address of an image to show as the sender's picture on this message. Needs the chat:write.customize scope.

**Outputs**

- `channel` (text): ID of the channel it was shown in.
- `message_ts` (text): Timestamp Slack gave the ephemeral message.
- `status` (text): Operation status (typically 'success').
- `user_id` (text): ID of the member who can see it.

**Example output**

```json
{
  "channel": "example_value",
  "message_ts": "example_value",
  "status": "example_value",
  "user_id": "example_value"
}
```

### Set a channel description

Set the description shown in a channel's details, up to 250 characters. The Lodol app must be a member of the channel.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Description (`description`, text, required): What the channel is for. Send an empty value to clear it.

**Outputs**

- `channel_id` (text): Channel ID.
- `description` (text): The description that was set.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channel_id": "example_value",
  "description": "example_value",
  "status": "example_value"
}
```

### Set a channel topic

Set the topic shown at the top of a Slack channel.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Topic (`topic`, text, required): The topic text. Send an empty value to clear the topic.

**Outputs**

- `channel_id` (text): ID of the channel whose topic was set.
- `status` (text): Operation status (typically 'success').
- `topic` (text): The topic Slack stored.

**Example output**

```json
{
  "channel_id": "example_value",
  "status": "example_value",
  "topic": "example_value"
}
```

### Set user group members

Replace a user group's members with exactly these people, for example to hand @oncall to this week's rota. Slack won't empty a group; disable it instead. Needs a paid Slack plan, and a workspace setting that lets everyone manage user groups (by default only admins can).

**Inputs**

- User group (`user_group_id`, text, required): The user group (an @team handle) to act on.
- People (`user_ids`, list, required): The people to act on. Guests and bots can't be in a user group.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `user_group` (object): The user group.

**Example output**

```json
{
  "status": "example_value",
  "user_group": {
    "created_by": "example_value",
    "date_create": 1,
    "date_update": 1,
    "default_channel_ids": [],
    "description": "example_value",
    "handle": "example_value",
    "id": "example_value",
    "is_disabled": true,
    "name": "example_value",
    "user_count": 1,
    "user_ids": []
  }
}
```

### Share a canvas

Share a canvas with channels or people, as sharing it in Slack does: its link is posted to each channel and sent to each person, with an optional message, and they can then view or edit it. Slack requires the link to be sent before it grants access.

**Inputs**

- Canvas (`canvas_id`, text, required): The canvas: pick one the app can see, or enter its ID (it starts with F) or its link.
- Access (`access_level`, text): Whether they can only read it or also edit it. One of: `read` (Can view), `write` (Can edit). Default: `read`.
- Channels (`channel_ids`, list): Channels to act on. Direct messages can't be used here; choose people instead.
- People (`user_ids`, list): People to act on.
- Message (`message`, text): A message to post with the canvas's link.

**Outputs**

- `access_level` (text): 'read' or 'write'.
- `canvas_id` (text): Canvas ID.
- `channel_ids` (list): IDs of the channels given access.
- `permalink` (text): The canvas link that was sent.
- `status` (text): Operation status (typically 'success').
- `user_ids` (list): IDs of the people given access.

**Example output**

```json
{
  "access_level": "example_value",
  "canvas_id": "example_value",
  "channel_ids": [],
  "permalink": "example_value",
  "status": "example_value",
  "user_ids": []
}
```

### Share a List

Let channels or people view or edit a Slack List. Needs a paid Slack plan.

**Inputs**

- List (`list_id`, text, required): The List's ID (it starts with F), as Create a List returns it, or the List's link from Slack (Copy link).
- Access (`access_level`, text): Whether they can only read it or also edit it. One of: `read` (Can view), `write` (Can edit). Default: `read`.
- Channels (`channel_ids`, list): Channels to act on. Direct messages can't be used here; choose people instead.
- People (`user_ids`, list): People to act on.

**Outputs**

- `access_level` (text): 'read' or 'write'.
- `channel_ids` (list): IDs of the channels given access.
- `list_id` (text): List ID.
- `status` (text): Operation status (typically 'success').
- `user_ids` (list): IDs of the people given access.

**Example output**

```json
{
  "access_level": "example_value",
  "channel_ids": [],
  "list_id": "example_value",
  "status": "example_value",
  "user_ids": []
}
```

### Start a Slack workflow

Start a Workflow Builder workflow that begins 'From a webhook', passing it up to 20 variables. Workflow Builder webhooks need a paid Slack plan and start about one run a second.

**Inputs**

- Workflow webhook URL (`webhook_url`, text, required): The URL Workflow Builder shows for the workflow's webhook, starting with https://hooks.slack.com/triggers/. Anyone with it can start the workflow, so save it under Secrets and Values and use it here as @secrets.YOUR_NAME rather than pasting it.
- Variables (`variables`, object): Values for the variables the workflow's webhook defines, by name: text, a member ID, a channel ID or an email. Up to 20.

**Outputs**

- `started` (true/false): True once Slack accepted the start.
- `status` (text): Operation status (typically 'success').
- `variables_sent` (list): Names of the variables sent to the workflow.

**Example output**

```json
{
  "started": true,
  "status": "example_value",
  "variables_sent": []
}
```

### Unpin a message

Unpin a message from its channel. If it wasn't pinned, the step succeeds with was_pinned set to false.

**Inputs**

- Channel (`channel_id`, text, required): The channel to act on.
- Message timestamp (`timestamp`, text, required): The timestamp of the message (the 'ts' value returned when the message was sent).

**Outputs**

- `channel_id` (text): Channel ID.
- `status` (text): Operation status (typically 'success').
- `timestamp` (text): Timestamp of the message.
- `was_pinned` (true/false): False when the message wasn't pinned.

**Example output**

```json
{
  "channel_id": "example_value",
  "status": "example_value",
  "timestamp": "example_value",
  "was_pinned": true
}
```

### Unshare a canvas

Remove channels' or people's access to a canvas. Access given to a channel belongs to the channel, so one of its members can't lose access while the channel keeps it.

**Inputs**

- Canvas (`canvas_id`, text, required): The canvas: pick one the app can see, or enter its ID (it starts with F) or its link.
- Channels (`channel_ids`, list): Channels to act on. Direct messages can't be used here; choose people instead.
- People (`user_ids`, list): People to act on.

**Outputs**

- `canvas_id` (text): Canvas ID.
- `channel_ids` (list): IDs of the channels whose access was removed.
- `status` (text): Operation status (typically 'success').
- `user_ids` (list): IDs of the people whose access was removed.

**Example output**

```json
{
  "canvas_id": "example_value",
  "channel_ids": [],
  "status": "example_value",
  "user_ids": []
}
```

### Update a List item

Change some of a List item's values; columns you leave empty keep their values. Needs a paid Slack plan.

**Inputs**

- List (`list_id`, text, required): The List's ID (it starts with F), as Create a List returns it, or the List's link from Slack (Copy link).
- Item ID (`item_id`, text, required): The item's ID (it starts with Rec), as Add a List item returns it.
- New values (`fields`, object, required): Values by column. A choice column takes the choice's name, a people or channel column takes member or channel IDs, and several values are separated by commas. Dates are YYYY-MM-DD and checkboxes true or false.

**Outputs**

- `item` (object): The List item.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "item": {
    "archived": true,
    "created_by": "example_value",
    "date_created": 1,
    "fields": {},
    "id": "example_value",
    "list_id": "example_value",
    "parent_item_id": "example_value",
    "updated_by": "example_value"
  },
  "status": "example_value"
}
```

### Update a user group

Change a user group's name, handle, description or default channels. Anything left empty stays as it is. Needs a paid Slack plan, and a workspace setting that lets everyone manage user groups (by default only admins can).

**Inputs**

- User group (`user_group_id`, text, required): The user group (an @team handle) to act on.
- New name (`name`, text): The group's new name.
- New handle (`handle`, text): The new handle people mention, without the @.
- New description (`description`, text): The group's new description.
- Default channels (`default_channel_ids`, list): Channels that people added to the group are added to as well.

**Outputs**

- `status` (text): Operation status (typically 'success').
- `user_group` (object): The user group.

**Example output**

```json
{
  "status": "example_value",
  "user_group": {
    "created_by": "example_value",
    "date_create": 1,
    "date_update": 1,
    "default_channel_ids": [],
    "description": "example_value",
    "handle": "example_value",
    "id": "example_value",
    "is_disabled": true,
    "name": "example_value",
    "user_count": 1,
    "user_ids": []
  }
}
```

### Upload a file

Share a file in a channel or thread, with an optional message. Upload a file, pass a file from an earlier step, or turn text into a file (a CSV or report, say). The Lodol app must be a member of a private channel to share there.

**Inputs**

- Channel (`channel_id`, text, required): The channel to share the file in.
- File (`file`, text): The file to share: upload one, or pick a file from an earlier step. Leave empty to send File contents instead.
- File contents (`content`, text): Text to save as the file, such as a CSV or report an earlier step wrote. Used only when File is empty; File name is then required.
- File name (`filename`, text): The file's name in Slack, with its extension, e.g. report.csv. Defaults to the uploaded file's name.
- Title (`title`, text): A title to show instead of the file name.
- Message (`initial_comment`, text): A message to post with the file.
- Reply To (`thread_ts`, text): To post inside a thread, enter the timestamp of the first message in that thread. Leave empty to post in the channel.

**Outputs**

- `channel_id` (text): Channel the file was shared in.
- `file` (object): The uploaded file.
- `status` (text): Operation status (typically 'success').

**Example output**

```json
{
  "channel_id": "example_value",
  "file": {
    "id": "example_value",
    "name": "example_value",
    "title": "example_value"
  },
  "status": "example_value"
}
```
