# Join a group

`POST /group.join`

## Description

Join a public group as the calling identity (Slack `conversations.join`).

- Org tokens add the bot address as a member.
- Personal tokens add the **owner person**, never the PAT bot address.
- Private groups cannot be self-joined (`403`).
- Idempotent if the calling identity is already a member.
- Non-members of a group in another roam receive an opaque `403`
  (`group_not_found`) — archived / type / privacy are not distinguished.

**Access:** Organization and Personal.

**Required scope:** `group:write`

---

**OpenAPI Spec:** [chat-v1.json](https://developer.ro.am/chat-v1.json)

## Authentication

```
Authorization: Bearer YOUR_API_KEY
```

## Request Body

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `id` | string | Yes | Group ID |

### Example Request

```json
{
  "id": "88bebce7-6cbb-4666-96f9-5c02d73e6661"
}
```

## Responses

### 200 - Joined the group (or already a member)

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `id` | string | Yes | The group's unique identifier |
| `chatId` | string | No | The group's channel chat ID. Populated by `group.create` and `group.info` (the channel chat is created together with the group), and used to post to or read the channel via the chat endpoints.  |
| `name` | string | Yes | Name of the group |
| `type` | "standard" | "magicast" | "meeting" | "roam" | "onair" | "community" | Yes | The type of group: - `standard` - A regular channel created by users - `magicast` - A Magicast channel - `meeting` - A meeting channel - `roam` - The main Roam channel (one per workspace) - `onair` -  |
| `accessMode` | "public" | "private" | No | Whether the group is public or private |
| `groupManagement` | "allMembers" | "groupAdminsOnly" | No | Who can manage group settings and membership |
| `enforceThreadedMode` | boolean | No | Whether the group enforces threaded conversations |
| `dateCreated` | string | No | When the group was created |
| `imageUrl` | string | No | URL of the group's image |


#### Example Response

```json
{
  "id": "88bebce7-6cbb-4666-96f9-5c02d73e6661",
  "chatId": "757dfe66-37b4-4772-baa5-8c86ec68c176",
  "name": "Engineering Team",
  "type": "standard",
  "accessMode": "public",
  "groupManagement": "allMembers",
  "enforceThreadedMode": true,
  "dateCreated": "2026-01-21T10:30:00Z"
}
```

### 400 - Invalid request, e.g. missing id, archived group, or unsupported group type.

### 401 - Unauthorized.

### 403 - Private group, or public group outside the caller's Roam.

### 404 - Group not found.

### 500 - An internal error occurred.

---

*Machine-readable API documentation.*
*Full documentation: https://developer.ro.am/docs/api/group-join*
