# Truncate Channel

Truncating a channel removes all messages but preserves the channel data and members. To delete both the channel and its messages, use [Delete Channel](/chat/docs/<framework>/channel_delete/) instead.

Truncation can be performed client-side or server-side. Client-side truncation requires the `TruncateChannel` permission.

On server-side calls, use the `user_id` field to identify who performed the truncation.

By default, truncation hides messages. To permanently delete messages, set `hard_delete` to `true`.

## Truncate a Channel

<codetabs>

<codetabs-item value="kotlin" label="Kotlin">

```kotlin
// Removes all of the messages of the channel but doesn't affect the channel data or members
channelClient.truncate().enqueue { result ->
  if (result is Result.Success) {
    // Channel is truncated
  } else {
    // Handle Result.Failure
  }
}

// Or with message parameter.
val message = Message(text = "Dear Everyone. The channel has been truncated.")
channelClient.truncate(systemMessage = message).enqueue { result ->
  if (result is Result.Success) {
    // Channel is truncated
  } else {
    // Handle Result.Failure
  }
}
```

</codetabs-item>

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

```js
await channel.truncate();

// Or with parameters:
await channel.truncate({
 'hard_delete': true,
 'skip_push': false,
 'message': {
  'text': 'Dear Everyone. The channel has been truncated.'
  'user_id': user['id']
 }
});

// Setting user_id server side:
await channel.truncate({
 'user_id': user['id']
 });
```

</codetabs-item>

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

```python
channel.truncate()

# Or with parameters:
channel.truncate(
      hard_delete=True,
      skip_push=True,
      message={
        "text": "Dear Everyone. The channel has been truncated.",
        "user_id": random_user["id"],
      },
    )
```

</codetabs-item>

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

```csharp
await channelClient.TruncateAsync(channel.Type, channel.Id);

// Or with parameters:
await channelClient.TruncateAsync(channel.Type, channel.Id, new TruncateOptions
{
  SkipPush = true,
  HardDelete = true,
  Message = new MessageRequest
  {
    Text = "Dear Everyone. The channel has been truncated.",
    User = new UserRequest { Id = user.Id },
  },
});
```

</codetabs-item>

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

```ruby
# require 'stream-chat'

channel.truncate

# Or with parameters:
text = "Dear Everyone. The channel has been truncated."
channel.truncate(skip_push: true, message: { text: text, user_id: @user[:id] })
```

</codetabs-item>

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

```php
$channel->truncate();

// Or with parameters:
$truncateOpts = [
  "message" => ["text" => "Dear Everyone. The channel has been truncated.", "user_id" => $user["id"]],
  "skip_push" => true,
];

$channel->truncate($truncateOpts);
```

</codetabs-item>

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

```go
err := ch.Truncate(context.Background())

// Or with parameters:
err := ch.Truncate(context.Background(),
	TruncateWithSkipPush(true),
 TruncateWithHardDelete(true),
	TruncateWithMessage(&Message{Text: "Truncated channel.", User: &User{ID: user.ID}}),
)
```

</codetabs-item>

<codetabs-item value="swift" label="Swift">

```swift
let controller = client.channelController(for: .init(type: .messaging, id: "general"))

controller.truncateChannel()
```

</codetabs-item>

<codetabs-item value="unity" label="Unity">

```csharp
await channel.TruncateAsync(systemMessage: "Clearing up the history!");
```

</codetabs-item>

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

```java
// Android SDK

// Removes all of the messages of the channel but doesn't affect the channel data or members
channelClient.truncate().enqueue(result -> {
  if (result.isSuccess()) {
    // Channel is truncated
  } else {
    // Handle result.error()
  }
});

// Backend SDK
Channel.truncate(type, id).request();
```

</codetabs-item>

<codetabs-item value="unreal" label="Unreal">

```cpp
Channel->Truncate();

// Or with parameters:
Channel->Truncate(
  true,  // bHardDelete
  {},   // TruncatedAt
  FMessage{TEXT("Dear Everyone. The channel has been truncated.")},
  false,  // bSkipPush
  []
  {
    // Channel is truncated
  });
```

</codetabs-item>

</codetabs>

## Truncate Options

| Field        | Type   | Description                                            | Optional |
| ------------ | ------ | ------------------------------------------------------ | -------- |
| truncated_at | Date   | Truncate messages up to this time                      | ✓        |
| user_id      | string | User who performed the truncation (server-side only)   | ✓        |
| message      | object | A system message to add after truncation               | ✓        |
| skip_push    | bool   | Do not send a push notification for the system message | ✓        |
| hard_delete  | bool   | Permanently delete messages instead of hiding them     | ✓        |


---

This page was last updated at 2026-03-05T19:06:19.103Z.

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