# Pinned Messages

Pinned messages highlight important content in a channel. Use them for announcements, key information, or temporarily promoted content. Each channel can have multiple pinned messages, with optional expiration times.

## Pinning and Unpinning Messages

Pin an existing message using `pinMessage`, or create a pinned message by setting `pinned: true` when sending.

```csharp label="C#"
// Create a pinned message
var resp = await chat.SendMessageAsync("messaging", channelId,
    new SendMessageRequest
    {
        Message = new MessageRequest
        {
            Text = "Important announcement",
            UserID = userId,
            Pinned = true
        }
    });

// Pin an existing message
await chat.UpdateMessagePartialAsync(messageId,
    new UpdateMessagePartialRequest
    {
        Set = new Dictionary<string, object>
        {
            ["pinned"] = true,
            ["pin_expires"] = "2077-01-01T00:00:00Z"
        },
        UserID = userId
    });

// Unpin message
await chat.UpdateMessagePartialAsync(messageId,
    new UpdateMessagePartialRequest
    {
        Set = new Dictionary<string, object> { ["pinned"] = false },
        UserID = userId
    });
```

### Pin Parameters

| Name        | Type    | Description                                                            | Default | Optional |
| ----------- | ------- | ---------------------------------------------------------------------- | ------- | -------- |
| pinned      | boolean | Whether the message is pinned                                          | false   | ✓        |
| pinned_at   | string  | Timestamp when the message was pinned                                  | -       | ✓        |
| pin_expires | string  | Timestamp when the pin expires. Null means the message does not expire | null    | ✓        |
| pinned_by   | object  | The user who pinned the message                                        | -       | ✓        |

<Admonition type="info">

Pinning a message requires the `PinMessage` permission. See [Permission Resources](https://getstream.io/chat/docs/dotnet-csharp/permissions-reference/) and [Default Permissions](https://getstream.io/chat/docs/node/chat-permission-policies/) for details.

</Admonition>

## Retrieving Pinned Messages

Query a channel to retrieve the 10 most recent pinned messages from `pinned_messages`.

```csharp label="C#"
var resp = await chat.GetOrCreateChannelAsync("messaging", channelId,
    new ChannelGetOrCreateRequest
    {
        State = true
    });

var pinnedMessages = resp.Data.PinnedMessages;
```

## Paginating Pinned Messages

Use the dedicated pinned messages endpoint to retrieve all pinned messages with pagination.

```js label="JavaScript"
// First page, newest first
const page1 = await channel.getPinnedMessages({ limit: 10 }, { pinned_at: -1 });

// Next page
const lastMsg = page1.messages[page1.messages.length - 1];
const page2 = await channel.getPinnedMessages(
  { limit: 10, id_lt: lastMsg.id },
  { pinned_at: -1 },
);

// Oldest first
const ascPage = await channel.getPinnedMessages({ limit: 10 });
const ascLastMsg = ascPage.messages[ascPage.messages.length - 1];
const ascPage2 = await channel.getPinnedMessages({
  limit: 10,
  id_gt: ascLastMsg.id,
});
```


---

This page was last updated at 2026-08-11T17:19:19.479Z.

For the most recent version of this documentation, visit [https://getstream.io/chat/docs/dotnet-csharp/pinned-messages/](https://getstream.io/chat/docs/dotnet-csharp/pinned-messages/).