# Overview

Almost all API requests are specific to a channel (e.g. add a message to channel “livestream:rockets”) and as we saw already, channels are organized in groups called channel types. All applications start with five default channel types, each have different name and are preconfigured to best fit one use-case.

Channel types can be configured with specific permissions and features.

The five default channel types come with good default permission policies. You can find more information on how to manage permissions in the[Channel Types section](/chat/docs/<framework>/chat_permission_policies/).

There are five built-in channel types:

- [Livestream](https://getstream.io/chat/demos/livestream/): Sensible defaults in case you want to build chat like YouTube or Twitch.
- [Messaging](https://getstream.io/chat/demos/messaging/): Configured for apps such as WhatsApp or Facebook Messenger.
- [Team](https://getstream.io/chat/demos/team/): If you want to build your own version of Slack or something similar, start here.
- [Commerce](https://getstream.io/chat/demos/customers/): Good defaults for building something like your own version of Intercom or Drift.
- [Gaming](https://getstream.io/chat/solutions/gaming/): Defaults for adding chat to video games.

As you can see in the examples below, you can define your own Channel types and configure them to fit your needs. The Channel type allows you to configure these features:

- **typing_events** : Controls if typing indicators are shown.
- **read_events** : Controls whether the chat shows how far you’ve read.
- **connect_events** : Determines if events are fired for connecting and disconnecting to a chat.
- **search** : Controls if messages should be searchable.
- **reactions** : If users are allowed to add reactions to messages.
- **replies** : Enables message threads and replies.
- **mutes** : Determines if users are able to mute other users.
- **push_notifications** : If messages are allowed to generate push notifications.
- **uploads** : Allows image and file uploads within messages.
- **url_enrichment** : When enabled, messages containing URLs will be enriched automatically with image and text related to the message. This is disabled by default for the livestream channel type and we do not recommend enabling it for performance reasons.
- **skip_last_msg_update_for_system_msgs** : Allows to not update the last_message_at timestamp of a channel in the case of system messages.
- **user_message_reminders** : Allow users to set reminders for messages More information can be found [here](/chat/docs/<framework>/message_reminders/)

### Channel Types Fields

| name                                 | type           | description                                                                                         | default | optional |
| ------------------------------------ | -------------- | --------------------------------------------------------------------------------------------------- | ------- | -------- |
| name                                 | string         | The name of the channel type must be unique per application                                         |         |          |
| max_message_length                   | int            | The max message length                                                                              | 5,000   | ✓        |
| typing_events                        | default        | Enable typing events                                                                                | default | ✓        |
| read_events                          | boolean        | Enable read events                                                                                  | true    | ✓        |
| connect_events                       | boolean        | Enable connect events                                                                               | true    | ✓        |
| search                               | boolean        | Enable message search                                                                               | true    | ✓        |
| reactions                            | boolean        | Enable message reactions                                                                            | true    | ✓        |
| replies                              | boolean        | Enable replies (threads)                                                                            | true    | ✓        |
| mutes                                | boolean        | Enable mutes                                                                                        | true    | ✓        |
| uploads                              | boolean        | Enable file and image upload                                                                        | true    | ✓        |
| url_enrichment                       | boolean        | Automatically enrich URLs                                                                           | true    | ✓        |
| automod                              | string         | Disabled, simple or AI are valid options for the Automod (AI based moderation is a premium feature) | simple  | ✓        |
| commands                             | list of string | The commands that are available on this channel type                                                | []      | ✓        |
| push_notifications                   | boolean        | Enable push notifications                                                                           | true    | ✓        |
| quotes                               | boolean        | Allow quotes/inline replies                                                                         | true    | ✓        |
| skip_last_msg_update_for_system_msgs | string         | Allows to not update the last_message_at timestamp of a channel in the case of system messages      | false   | ✓        |
| user_message_reminders               | boolean        | Allow users to set reminders and bookmarks for messages                                             | false   | ✓        |

<admonition type="warning">

You need to use server-side authentication to create, edit, or delete a channel type.

</admonition>

### Creating a Channel Type

<codetabs>

<codetabs-item value="javascript" label="JavaScript">

```js
import { DenyAll, AnyRole } from "stream-chat";

await client.createChannelType({
  name: "public",
  mutes: false,
  reactions: false,
});
```

</codetabs-item>

<codetabs-item value="python" label="Python">

```python
client.create_channel_type(
  {
    "name": "public",
    "mutes": False,
    "reactions": False,
  }
)
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
# require 'stream-chat'

client.create_channel_type({
  'name' => 'public',
  'mutes' => false,
  'reactions' => false
})
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$channelConf = [
  'name' => 'public',
  'mutes' => false,
  'reactions' => false
];

$type = $client->createChannelType($channelConf);
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
ChannelType.create().name(channelName).mutes(false).reactions(false).request();
```

</codetabs-item>

<codetabs-item value="csharp" label="C#">

```csharp
await channelTypeClient.CreateChannelTypeAsync(new ChannelTypeWithStringCommandsRequest
{
  Name = "public",
  Reactions = false,
  Mutes = false
});
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
newChannelType := &ChannelType{
		// Copy the default settings.
		ChannelConfig: DefaultChannelConfig,
}

newChannelType.Name = "public"
newChannelType.Mutes = false
newChannelType.Reactions = false

client.CreateChannelType(newChannelType)
```

</codetabs-item>

</codetabs>

<admonition type="warning">

If not provided, the permission settings will default to the ones from the built-in "messaging" type.

</admonition>

Please note that applications have a hard limit of 50 channel types. If you need more than this please have a look at the [Multi-tenant & Teams](/chat/docs/<framework>/multi_tenant_chat/) section.

### List Channel Types

You can retrieve the list of all channel types defined for your application.

<codetabs>

<codetabs-item value="javascript" label="JavaScript">

```js
const channelTypes = await client.listChannelTypes();
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$types = $client->listChannelTypes();
```

</codetabs-item>

<codetabs-item value="python" label="Python">

```python
client.list_channel_types()
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
client.ListChannelTypes()
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
client.list_channel_types()
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
ChannelType.list().request();
```

</codetabs-item>

<codetabs-item value="csharp" label="C#">

```csharp
await channelTypeClient.ListChannelTypesAsync();
```

</codetabs-item>

</codetabs>

### Get a Channel Type

You can retrieve a channel type definition with this endpoint.

<admonition type="info">

Features and commands are also returned by other channel endpoints.

</admonition>

<codetabs>

<codetabs-item value="javascript" label="JavaScript">

```js
const channelType = await client.getChannelType("public");
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$type = $client->getChannelType('public');
```

</codetabs-item>

<codetabs-item value="python" label="Python">

```python
client.get_channel_type("public")
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
client.GetChannelType("public")
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
client.get_channel_type('public')
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
ChannelType.get("public").request();
```

</codetabs-item>

<codetabs-item value="csharp" label="C#">

```csharp
await _channelTypeClient.GetChannelTypeAsync("public");
```

</codetabs-item>

</codetabs>

### Edit a Channel Type

Channel type features, commands and permissions can be changed. Only the fields that must change need to be provided, fields that are not provided to this API will remain unchanged.

<codetabs>

<codetabs-item value="javascript" label="JavaScript">

```js
const update = await client.updateChannelType("public", {
  replies: false,
  commands: ["all"],
});
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$update = $client->updateChannelType('public', [
  'replies' => false,
  'commands' => ['all']
]);
```

</codetabs-item>

<codetabs-item value="python" label="Python">

```python
client.update_channel_type(
  "public",
  replies=False,
  commands=["all"],
)
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
client.UpdateChannelType("public", map[string]interface{}{
	"replies": false,
	"commands": []string{"all"},
})
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
client.update_channel_type(
  "public",
  replies: false,
  commands: ["all"],
)
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
ChannelType.update("public")
  .replies(false)
  .commands(List.of("all"))
  .request();
```

</codetabs-item>

<codetabs-item value="csharp" label="C#">

```csharp
await channelTypeClient.UpdateChannelTypeAsync("public", new ChannelTypeWithStringCommandsRequest
{
  Replies = false,
  Commands = new List<string> { "all" }
});
```

</codetabs-item>

</codetabs>

Features of a channel can be updated by passing the boolean flags:

<codetabs>

<codetabs-item value="javascript" label="JavaScript">

```js
const update = await client.updateChannelType("public", {
  typing_events: false,
  read_events: true,
  connect_events: true,
  search: false,
  reactions: true,
  replies: false,
  mutes: true,
});
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$update = $client->updateChannelType('public', [
  'typing_events' => false,
  'read_events' => true,
  'connect_events' => true,
  'search' => false,
  'reactions' => true,
  'replies' => false,
  'mutes' => true,
  'replies' => false
]);
```

</codetabs-item>

<codetabs-item value="python" label="Python">

```python
client.update_channel_type("public",
  typing_events=False,
  read_events=True,
  connect_events=True,
  search=False,
  reactions=True,
  replies=False,
  mutes=True
)
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
client.UpdateChannelType("public", map[string]interface{}{
	"typing_events": false,
	"read_events":  true,
	"connect_events": true,
	"search":     false,
	"reactions":   true,
	"replies":    false,
	"mutes":     true,
})
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
client.update_channel_type("public",
  typing_events: false,
  read_events: true,
  connect_events: true,
  search: false,
  reactions: true,
  replies: false,
  mutes: true
)
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
ChannelType.update(channelName)
    .typingEvents(false)
    .readEvents(true)
    .connectEvents(true)
    .search(false)
    .reactions(true)
    .replies(false)
    .mutes(true)
    .request();
```

</codetabs-item>

<codetabs-item value="csharp" label="C#">

```csharp
await _channelTypeClient.UpdateChannelTypeAsync("public", new ChannelTypeWithStringCommandsRequest
{
  TypingEvents = false,
  ReadEvents = true,
  ConnectEvents = true,
  Search = false,
  Reactions = true,
  Replies = false,
  Mutes = true,
});
```

</codetabs-item>

</codetabs>

Settings can also be updated by passing in the desired new values:

<codetabs>

<codetabs-item value="javascript" label="JavaScript">

```js
const update = await client.updateChannelType("public", {
  automod: "disabled",
  max_message_length: 140,
  commands: ["giphy", "ban"],
});
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$update = $client->updateChannelType('public', [
  'automod' => 'disabled',
  'max_message_length' => 140,
  'commands' => [ 'giphy', 'ban']
]);
```

</codetabs-item>

<codetabs-item value="python" label="Python">

```python
client.update_channel_type(
  "public",
  automod="disabled",
  max_message_length=140,
  commands=["ban", "unban"],
)
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
client.UpdateChannelType(
	"public",
	map[string]interface{}{
		"automod":      "disabled",
		"max_message_length": 140,
		"commands":      []interface{}{"ban", "unban"},
	},
)
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
client.update_channel_type(
  "public",
  automod: "disabled",
  max_message_length: 140,
  commands: ["ban", "unban"]
)
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
ChannelType.update(channelName)
    .automod(AutoMod.DISABLED)
    .maxMessageLength(140)
    .commands(List.of("ban", "unban"))
    .request();
```

</codetabs-item>

<codetabs-item value="csharp" label="C#">

```csharp
await channelTypeClient.UpdateChannelTypeAsync(_channelType.Name, new ChannelTypeWithStringCommandsRequest
{
  Automod = Automod.Disabled,
  MaxMessageLength = 140,
  Commands = new List<string> { "ban", "unban" },
});
```

</codetabs-item>

</codetabs>

### Remove a Channel Type

<codetabs>

<codetabs-item value="javascript" label="JavaScript">

```js
const destroy = await client.deleteChannelType("public");
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$client->deleteChannelType('public');
```

</codetabs-item>

<codetabs-item value="python" label="Python">

```python
client.delete_channel_type("public")
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
client.DeleteChannelType("public")
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
client.delete_channel_type('public')
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
ChannelType.delete("public").request();
```

</codetabs-item>

<codetabs-item value="csharp" label="C#">

```csharp
await channelTypeClient.DeleteChannelTypeAsync("public");
```

</codetabs-item>

</codetabs>

<admonition type="info">

You cannot delete a channel type if there are any active channels of that type.

</admonition>

---

This page was last updated at 2025-08-15T14:15:18.594Z.

For the most recent version of this documentation, visit [https://getstream.io/chat/docs/ruby/channel_features/](https://getstream.io/chat/docs/ruby/channel_features/).