diff --git a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
index 86f0d12c2..0fe89ada5 100644
--- a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
@@ -87,3 +87,24 @@ In .NET, reaction APIs are marked with `[Experimental("ExperimentalTeamsReaction
```
:::
+
+
+
+`Send()`
+
+
+
+`Reply()`
+
+
+
+```csharp
+app.OnMessage(async context =>
+{
+ // Send in the same thread, no quote
+ await context.Send("Acknowledged");
+
+ // Send in the same thread with a visual quote of the inbound message
+ await context.Reply("Got it!");
+});
+```
diff --git a/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/csharp.incl.md b/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/csharp.incl.md
index 2655744dd..e93cddfea 100644
--- a/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/csharp.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/csharp.incl.md
@@ -50,4 +50,35 @@ public static async Task SendTargetedNotification(string conversationId, Account
.WithRecipient(recipient, isTargeted: true)
);
}
+```
+
+
+
+`app.Reply()`
+
+
+
+`Conversation.ToThreadedConversationId()`
+
+
+
+`app.Send()`
+
+
+
+```csharp
+// Send to a specific thread proactively
+await app.Reply(conversationId, messageId, "Thread update!");
+
+// Send to a flat conversation (1:1, group chat)
+await app.Reply(conversationId, "Hello!");
+```
+
+
+
+```csharp
+using Microsoft.Teams.Api;
+
+var threadId = Conversation.ToThreadedConversationId(conversationId, messageId);
+await app.Send(threadId, "Sent via helper");
```
\ No newline at end of file
diff --git a/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/python.incl.md b/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/python.incl.md
index 3078b055a..5e701ff67 100644
--- a/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/python.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/python.incl.md
@@ -48,4 +48,35 @@ async def send_targeted_notification(conversation_id: str, recipient: Account):
MessageActivityInput(text="This is a private notification just for you!")
.with_recipient(recipient, is_targeted=True)
)
+```
+
+
+
+`app.reply()`
+
+
+
+`to_threaded_conversation_id()`
+
+
+
+`app.send()`
+
+
+
+```python
+# Send to a specific thread proactively
+await app.reply(conversation_id, message_id, "Thread update!")
+
+# Send to a flat conversation (1:1, group chat)
+await app.reply(conversation_id, "Hello!")
+```
+
+
+
+```python
+from microsoft_teams.apps import to_threaded_conversation_id
+
+thread_id = to_threaded_conversation_id(conversation_id, message_id)
+await app.send(thread_id, "Sent via helper")
```
\ No newline at end of file
diff --git a/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/typescript.incl.md b/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/typescript.incl.md
index 6bfff73a1..a28331893 100644
--- a/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/typescript.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/proactive-messaging/typescript.incl.md
@@ -53,4 +53,35 @@ const sendTargetedNotification = async (conversationId: string, recipient: Accou
.withRecipient(recipient, true)
);
};
+```
+
+
+
+`app.reply()`
+
+
+
+`toThreadedConversationId()`
+
+
+
+`app.send()`
+
+
+
+```typescript
+// Send to a specific thread proactively
+await app.reply(conversationId, messageId, 'Thread update!');
+
+// Send to a flat conversation (1:1, group chat)
+await app.reply(conversationId, 'Hello!');
+```
+
+
+
+```typescript
+import { toThreadedConversationId } from '@microsoft/teams.apps';
+
+const threadId = toThreadedConversationId(conversationId, messageId);
+await app.send(threadId, 'Sent via helper');
```
\ No newline at end of file
diff --git a/teams.md/src/components/include/essentials/sending-messages/python.incl.md b/teams.md/src/components/include/essentials/sending-messages/python.incl.md
index 8d83662da..d17b232a4 100644
--- a/teams.md/src/components/include/essentials/sending-messages/python.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/python.incl.md
@@ -69,5 +69,29 @@ async def handle_message(ctx: ActivityContext[MessageActivity]):
N/A
+
+N/A
+
+
+
+`send()`
+
+
+
+`reply()`
+
+
+
+```python
+@app.on_message
+async def handle_message(ctx: ActivityContext[MessageActivity]):
+ # Send in the same thread, no quote
+ await ctx.send("Acknowledged")
+
+ # Send in the same thread with a visual quote of the inbound message
+ await ctx.reply("Got it!")
+```
+N/A
+
N/A
\ No newline at end of file
diff --git a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
index 8a07d01a7..f20586677 100644
--- a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
@@ -64,4 +64,24 @@ app.on('message', async ({ send, activity }) => {
N/A
-N/A
\ No newline at end of file
+N/A
+
+
+
+`send()`
+
+
+
+`reply()`
+
+
+
+```typescript
+app.on('message', async ({ send, reply }) => {
+ // Send in the same thread, no quote
+ await send('Acknowledged');
+
+ // Send in the same thread with a visual quote of the inbound message
+ await reply('Got it!');
+});
+```
\ No newline at end of file
diff --git a/teams.md/src/pages/templates/essentials/sending-messages/README.mdx b/teams.md/src/pages/templates/essentials/sending-messages/README.mdx
index 5ffbf4058..e4453fd87 100644
--- a/teams.md/src/pages/templates/essentials/sending-messages/README.mdx
+++ b/teams.md/src/pages/templates/essentials/sending-messages/README.mdx
@@ -64,3 +64,15 @@ Reactions allow your agent to add or remove emoji reactions on messages in a con
### Reactions in preview
+
+## Threading
+
+In Teams channels, messages can be organized into threads. A thread is identified by appending `;messageid={messageId}` to the conversation ID. The SDK provides helpers to simplify working with threads.
+
+### Reactive Threading (Within a Handler)
+
+When your agent receives a message in a thread, the conversation context already carries the thread ID. Use to send a message in the same thread without quoting, or to send with a visual quote of the inbound message.
+
+
+
+For proactive threading (sending to a thread outside of a handler), see [Proactive Messaging](./proactive-messaging#proactive-threading).
diff --git a/teams.md/src/pages/templates/essentials/sending-messages/proactive-messaging.mdx b/teams.md/src/pages/templates/essentials/sending-messages/proactive-messaging.mdx
index 9d21cf027..6bab04f81 100644
--- a/teams.md/src/pages/templates/essentials/sending-messages/proactive-messaging.mdx
+++ b/teams.md/src/pages/templates/essentials/sending-messages/proactive-messaging.mdx
@@ -32,3 +32,19 @@ Targeted messages, also known as ephemeral messages, are delivered to a specific
When sending targeted messages proactively, you must explicitly specify the recipient account.
+
+## Proactive Threading
+
+To send a message to a thread outside of a handler, use with the conversation ID and thread root message ID. The SDK constructs the threaded conversation ID for you.
+
+
+
+You can also pass just a conversation ID to for flat contexts (1:1, group chat, meetings).
+
+For reactive threading (within a handler), see [Threading](./#threading).
+
+### Thread ID Helper
+
+For advanced scenarios, the helper constructs the threaded conversation ID directly. Use it with when you need full control. Note that is only valid for conversations that support threading (channels and some 1:1 chats) — group chats and meetings do not support threading at this time.
+
+