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

# Chat

> List users, channels and messages, and send messages, across chat providers with one API.

The Chat category covers the operations most products need from a team chat tool: find people and channels, read recent messages, and post a message.

**Use it to:** let customers pick a channel for notifications, post updates from your product, or read a channel’s recent messages.

## Endpoints

| Endpoint | What it does |
| - | - |
| `GET /v1/chat/users` | List users in the workspace |
| `GET /v1/chat/channels` | List channels |
| `GET /v1/chat/channels/{channel_id}/messages` | List messages in a channel, newest first |
| `POST /v1/chat/channels/{channel_id}/message` | Send a message to a channel |

Parameters and full schemas: [Unified API reference](/docs/api-reference/unified-api). Which chat providers support which endpoints: [bundleup.io/integrations](https://www.bundleup.io/integrations).

## Example: let a customer pick a channel, then post to it

<CodeGroup>
  ```bash cURL theme={null}
  # 1. List channels for a picker
  curl "https://unify.bundleup.io/v1/chat/channels?limit=100" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "BU-Connection-Id: conn_abc123"

  # 2. Post to the channel the customer chose
  curl -X POST https://unify.bundleup.io/v1/chat/channels/C024BE91L/message \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "BU-Connection-Id: conn_abc123" \
    -H "Content-Type: application/json" \
    -d '{"text": "Deploy *v2.4.0* finished successfully"}'
  ```

  ```typescript JavaScript theme={null}
  const unify = client.unify('conn_abc123');

  const channels = await unify.chat.channels({ limit: 100 });
  // channels.data → [{ id: 'C024BE91L', name: 'general' }, ...]
  ```

  ```python Python theme={null}
  unify = client.unify("conn_abc123")

  channels = unify.chat.channels({"limit": 100})
  # channels["data"] → [{"id": "C024BE91L", "name": "general"}, ...]
  ```

  ```ruby Ruby theme={null}
  unify = client.unify('conn_abc123')

  channels = unify.chat.channels(limit: 100)
  # channels['data'] → [{ 'id' => 'C024BE91L', 'name' => 'general' }, ...]
  ```
</CodeGroup>

## Response shapes

**Users and channels:** `{ id, name }`.

**Messages:**

```json theme={null}
{
  "data": [
    {
      "id": "1726233600.000200",
      "text": "Has anyone looked at the login bug?",
      "author": { "id": "U012AB3CD", "name": null },
      "created_at": "2026-09-13T13:20:00Z",
      "thread_id": null
    }
  ],
  "metadata": { "next": "bmV4dA==" }
}
```

`thread_id` is the ID of the message this one replies to, or `null` for a top-level message.

**Sending a message:** the body is `{ "text": "..." }`, written in Markdown. The response’s `data` is the provider’s own response to the send, since providers return very different things here.

## Provider differences

* **Author names.** Some providers return only a user ID on a message. On Slack, `author.name` is `null`; look the ID up in `GET /v1/chat/users` if you need the name.
* **Formatting.** Message text is sent as Markdown. Providers render Markdown slightly differently. For rich layouts (Slack blocks, Discord embeds), use the [Proxy](/docs/guides/proxy/making-requests).
* **Bot vs user tokens.** What a connection can see and post depends on the integration’s scopes and whether it’s installed as a bot. A channel missing from the list usually means the bot isn’t a member.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.