Repository: signalwire/docs
Pull request #112: Remove old SDK guides
Author: login: niravcodes
Created: 2026-02-23T17:39:37Z | Merged: 2026-02-24T02:00:55Z

## Description

<!-- What does this PR do? Why is this change needed? -->

## Type of Change

- [ ] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
- [ ] Code cleanup / refactor

## Related Issues

<!-- Link any related issues: Fixes #123 or Relates to #456 -->

## Testing

<!-- How did you test your changes? -->

- [ ] Added/updated unit tests
- [x] Tested manually
- [ ] Tested with live SignalWire credentials (if applicable)

## Checklist

- [ ] I have read the [CONTRIBUTING](CONTRIBUTING.md) guidelines
- [ ] My code follows the project's style guidelines
- [ ] I have added tests for my changes (if applicable)
- [ ] I have updated documentation (if applicable)
- [ ] All existing tests pass

## Additional Notes

<!-- Any other context about the PR -->



Diff:
diff --git a/fern/products/browser-sdk/pages/latest/guides/chat/get-started-with-a-simple-chat-demo/index.mdx b/fern/products/browser-sdk/pages/latest/guides/chat/get-started-with-a-simple-chat-demo/index.mdx
index b6a352bed..58b4fc0e3 100644
--- a/fern/products/browser-sdk/pages/latest/guides/chat/get-started-with-a-simple-chat-demo/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/chat/get-started-with-a-simple-chat-demo/index.mdx
@@ -9,6 +9,7 @@ x-custom:
     - sdk:relaybrowser
     - language:javascript
     - language:nodejs
+max-toc-depth: 3
 ---
 
 
diff --git a/fern/products/browser-sdk/pages/latest/guides/index.mdx b/fern/products/browser-sdk/pages/latest/guides/core/overview.mdx
similarity index 99%
rename from fern/products/browser-sdk/pages/latest/guides/index.mdx
rename to fern/products/browser-sdk/pages/latest/guides/core/overview.mdx
index 0189c0c4f..2073bcc11 100644
--- a/fern/products/browser-sdk/pages/latest/guides/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/core/overview.mdx
@@ -1,7 +1,10 @@
 ---
 id: 004bdd77-fc94-4d36-82de-08f63d93f33e
 title: "Browser SDK Guides"
+sidebar-title: Overview
+position: 0
 slug: /guides
+max-toc-depth: 3
 ---
 
 The SignalWire Browser SDK is a JavaScript library that enables WebRTC-based voice, video, and chat applications directly in web browsers.
diff --git a/fern/products/browser-sdk/pages/latest/guides/video/get-thumbnails-for-your-video-calls/index.mdx b/fern/products/browser-sdk/pages/latest/guides/video/get-thumbnails-for-your-video-calls/index.mdx
index 0fa28cb8b..57dd1f1cf 100644
--- a/fern/products/browser-sdk/pages/latest/guides/video/get-thumbnails-for-your-video-calls/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/video/get-thumbnails-for-your-video-calls/index.mdx
@@ -14,6 +14,7 @@ x-custom:
 
 sidebar_custom_props:
   platform: javascript
+max-toc-depth: 3
 ---
 
 Once you start to host multiple rooms with several people each, you might want a way to peek into the rooms. Room names only take you so far.
diff --git a/fern/products/browser-sdk/pages/latest/guides/video/getting-started-with-the-signalwire-video/index.mdx b/fern/products/browser-sdk/pages/latest/guides/video/getting-started-with-the-signalwire-video/index.mdx
index 6dbad9c5c..237dcb623 100644
--- a/fern/products/browser-sdk/pages/latest/guides/video/getting-started-with-the-signalwire-video/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/video/getting-started-with-the-signalwire-video/index.mdx
@@ -11,6 +11,7 @@ sidebar_custom_props:
   platform: javascript
 slug: /guides/build-a-video-calling-application-with-the-browser-sdk
 title: Build a video calling application with the Browser SDK
+max-toc-depth: 3
 ---
 
 SignalWire's Video API allows you to host real-time video calls and conferences on your website or app.
diff --git a/fern/products/browser-sdk/pages/latest/guides/video/interactive-live-streaming/index.mdx b/fern/products/browser-sdk/pages/latest/guides/video/interactive-live-streaming/index.mdx
index 523b5725e..7233b2f4b 100644
--- a/fern/products/browser-sdk/pages/latest/guides/video/interactive-live-streaming/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/video/interactive-live-streaming/index.mdx
@@ -12,6 +12,7 @@ sidebar_custom_props:
   platform: javascript
 slug: /guides/interactive-live-streaming
 title: Interactive live streaming
+max-toc-depth: 3
 ---
 
 In case of large events, scalability is key. If you need to broadcast your live
diff --git a/fern/products/browser-sdk/pages/latest/guides/video/making-a-clubhouse-clone/index.mdx b/fern/products/browser-sdk/pages/latest/guides/video/making-a-clubhouse-clone/index.mdx
index 87794171b..d95d9f120 100644
--- a/fern/products/browser-sdk/pages/latest/guides/video/making-a-clubhouse-clone/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/video/making-a-clubhouse-clone/index.mdx
@@ -14,6 +14,7 @@ x-custom:
 sidebar_custom_props:
   platform: javascript
   github: https://github.com/signalwire/browser-audioconf-example
+max-toc-depth: 3
 ---
 
 Our Video APIs can do more than video! In this guide, we will build an audio-only application inspired by the popular Clubhouse. Here is what we are going to build:
diff --git a/fern/products/browser-sdk/pages/latest/guides/video/recording-video/index.mdx b/fern/products/browser-sdk/pages/latest/guides/video/recording-video/index.mdx
index d8d5a5f96..0c85620b7 100644
--- a/fern/products/browser-sdk/pages/latest/guides/video/recording-video/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/video/recording-video/index.mdx
@@ -10,6 +10,7 @@ sidebar_custom_props:
   platform: javascript
 slug: /guides/record-calls
 title: Record calls
+max-toc-depth: 3
 ---
 
 If you are using SignalWire to conduct your video conferences, it is quite simple to record the video feed and access them later
diff --git a/fern/products/browser-sdk/pages/latest/guides/video/streaming-to-youtube-and-other-platforms/index.mdx b/fern/products/browser-sdk/pages/latest/guides/video/streaming-to-youtube-and-other-platforms/index.mdx
index b16f48f34..4c717e02a 100644
--- a/fern/products/browser-sdk/pages/latest/guides/video/streaming-to-youtube-and-other-platforms/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/video/streaming-to-youtube-and-other-platforms/index.mdx
@@ -10,6 +10,7 @@ x-custom:
 sidebar_custom_props:
   platform: javascript
 slug: /guides/stream-to-youtube-and-other-platforms
+max-toc-depth: 3
 ---
 
 In this guide, we will show how to stream a video room to external services like YouTube. We are going to use the Streaming APIs, which represent the simplest way to set up a stream, and the Browser SDK.
diff --git a/fern/products/browser-sdk/pages/latest/guides/video/switch-webcam-or-microphone-with-signalwire-video-api.mdx b/fern/products/browser-sdk/pages/latest/guides/video/switch-webcam-or-microphone-with-signalwire-video-api.mdx
index 8c8bdb0a1..8dc63b041 100644
--- a/fern/products/browser-sdk/pages/latest/guides/video/switch-webcam-or-microphone-with-signalwire-video-api.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/video/switch-webcam-or-microphone-with-signalwire-video-api.mdx
@@ -10,6 +10,7 @@ x-custom:
     - sdk:relaybrowser
 sidebar_custom_props:
   platform: javascript
+max-toc-depth: 3
 ---
 
 SignalWire Video API allows you to host real-time video calls and conferences on your website. In this guide, we'll learn to allow users to change the camera and microphone that's being used in the call.
diff --git a/fern/products/browser-sdk/pages/latest/guides/video/zoom-clone-2/index.mdx b/fern/products/browser-sdk/pages/latest/guides/video/zoom-clone-2/index.mdx
index 535c408e2..d7ded8908 100644
--- a/fern/products/browser-sdk/pages/latest/guides/video/zoom-clone-2/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/guides/video/zoom-clone-2/index.mdx
@@ -13,6 +13,7 @@ sidebar_custom_props:
   platform: javascript
   github: https://github.com/signalwire/browser-videoconf-full-react
 slug: /guides/make-a-zoom-like-application
+max-toc-depth: 3
 ---
 
 In this guide, we are going to make a Zoom-like video conferencing system using React, SignalWire APIs, SDKs and other tools.
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/events.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/events.mdx
index ef3978a01..2c01b8353 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/events.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/events.mdx
@@ -2,6 +2,7 @@
 id: c42c8c92-44bf-49d8-b87c-6727041f8aeb
 title: Events
 slug: /reference/chat/client/events
+max-toc-depth: 3
 ---
 
 ## member.joined
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/index.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/index.mdx
index f6ef4c0ad..09e17cd91 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/index.mdx
@@ -1,7 +1,9 @@
 ---
 id: be712c6f-f777-4268-9fa2-44e4aa6c1751
 title: Chat.Client
+sidebar-title: Client
 slug: /reference/chat/client
+max-toc-depth: 3
 ---
 
 
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/disconnect.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/disconnect.mdx
index e468a5ad1..71701a94d 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/disconnect.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/disconnect.mdx
@@ -1,6 +1,7 @@
 ---
 id: 0a7be4d8-669f-487b-a393-6c3c9ded3b8e
 title: disconnect
+max-toc-depth: 3
 ---
 
 - **disconnect**(): `void`
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getAllowedChannels.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getAllowedChannels.mdx
index 20e12b153..2a1533235 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getAllowedChannels.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getAllowedChannels.mdx
@@ -1,6 +1,7 @@
 ---
 id: 3259fee0-8103-4b15-8d5f-825193d1a110
 title: getAllowedChannels
+max-toc-depth: 3
 ---
 
 - **getAllowedChannels**(): `Promise<Object>`
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMemberState.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMemberState.mdx
index f1b51b8de..942e6a187 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMemberState.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMemberState.mdx
@@ -1,6 +1,7 @@
 ---
 id: 9c2ea691-eb38-41f8-bc30-92eb498b38f2
 title: getMemberState
+max-toc-depth: 3
 ---
 
 - **getMemberState**(`params`): `Promise<{ channels: Record<string, ChatChannelState> }>`
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMembers.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMembers.mdx
index 30f27b92f..ed2211cac 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMembers.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMembers.mdx
@@ -1,6 +1,7 @@
 ---
 id: d79ad2e4-c09a-416b-85de-89a0b1ce5be7
 title: getMembers
+max-toc-depth: 3
 ---
 
 - **getMembers**(`params`): `Promise<{ members: ChatMemberEntity[] }>` - See [ChatMemberEntity documentation](/browser-sdk/chat/member-entity) for more details.
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMessages.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMessages.mdx
index 297a0bdb2..aeac8b700 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMessages.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/getMessages.mdx
@@ -1,6 +1,7 @@
 ---
 id: e6e1d127-ec6b-427f-b9ce-3f0a2d8798ea
 title: getMessages
+max-toc-depth: 3
 ---
 
 - **getMessages**(`params`): `Promise<{ cursor: PagingCursor; messages: ChatMessageEntity[] }>`
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/off.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/off.mdx
index 77f1e9b11..d788de096 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/off.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/off.mdx
@@ -1,6 +1,7 @@
 ---
 id: 948664c3-ec7f-4ae8-b791-8a8b3c0c1f7a
 title: off
+max-toc-depth: 3
 ---
 
 <Markdown src="/snippets/browser-sdk/v3/method_off.mdx" />
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/on.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/on.mdx
index 57fc02450..5ecd9a191 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/on.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/on.mdx
@@ -1,6 +1,7 @@
 ---
 id: c0bcd31d-3de6-4c1d-b0a1-d7d2df59f265
 title: on
+max-toc-depth: 3
 ---
 
 <Markdown src="/snippets/browser-sdk/v3/method_on.mdx" />
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/once.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/once.mdx
index 6cffd78fa..663f1c9f1 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/once.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/once.mdx
@@ -1,6 +1,7 @@
 ---
 id: cfeac22a-42c5-45b2-b7d8-e37bd486b48d
 title: once
+max-toc-depth: 3
 ---
 
 <Markdown src="/snippets/browser-sdk/v3/method_once.mdx" />
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/publish.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/publish.mdx
index bf28f3d27..da9f6ac4b 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/publish.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/publish.mdx
@@ -1,6 +1,7 @@
 ---
 id: a51dc21e-c22c-4186-8107-ec0399c1d425
 title: publish
+max-toc-depth: 3
 ---
 
 - **publish**(`params`): `Promise<void>`
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/removeAllListeners.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/removeAllListeners.mdx
index eee61981f..95d1a74c8 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/removeAllListeners.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/removeAllListeners.mdx
@@ -1,6 +1,7 @@
 ---
 id: 49969a55-79b7-47ab-889d-16a42a306278
 title: removeAllListeners
+max-toc-depth: 3
 ---
 
 <Markdown src="/snippets/browser-sdk/v3/method_removealllisteners.mdx" />
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/setMemberState.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/setMemberState.mdx
index 05cea4fdd..c4e1e038e 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/setMemberState.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/setMemberState.mdx
@@ -1,6 +1,7 @@
 ---
 id: 5da3414b-ff3c-4e34-aa22-4d5754004b3a
 title: setMemberState
+max-toc-depth: 3
 ---
 
 - **setMemberState**(`params`): `Promise<void>`
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/subscribe.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/subscribe.mdx
index 7767a0bd2..b43651edf 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/subscribe.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/subscribe.mdx
@@ -1,6 +1,7 @@
 ---
 id: e40f38c6-1f8d-4f08-acea-2a553db78fbc
 title: subscribe
+max-toc-depth: 3
 ---
 
 - **subscribe**(`channels`): `Promise<void>`
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/unsubscribe.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/unsubscribe.mdx
index 47c75d316..428af3e35 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/unsubscribe.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/unsubscribe.mdx
@@ -1,6 +1,7 @@
 ---
 id: 1d34e9d2-8e14-4f08-95f6-0e7e37a74b80
 title: unsubscribe
+max-toc-depth: 3
 ---
 
 - **unsubscribe**(`channels`): `Promise<void>`
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/updateToken.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/updateToken.mdx
index b2a5176c4..dafcb4c5a 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/updateToken.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/Client/methods/updateToken.mdx
@@ -1,6 +1,7 @@
 ---
 id: 93ee53ad-78e5-42a2-b09f-e4aec9a7c30e
 title: updateToken
+max-toc-depth: 3
 ---
 
 - **updateToken**(`token`): `Promise<void>`
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/chat-chatmember.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/chat-chatmember.mdx
index 5c9ced67d..e6897e9ca 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/chat-chatmember.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/chat-chatmember.mdx
@@ -2,6 +2,7 @@
 id: 5d27f536-2dd8-4933-9989-56a95579265d
 title: "ChatMember"
 slug: /reference/chat/chat-member
+max-toc-depth: 3
 ---
 
 Represents a member in a chat.
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/chat-chatmessage.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/chat-chatmessage.mdx
index 28321d87e..5e01bbf46 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/chat-chatmessage.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/chat-chatmessage.mdx
@@ -2,6 +2,7 @@
 id: e1cee217-fd55-4a2e-ba09-adba892bd96f
 title: "ChatMessage"
 slug: /reference/chat/chat-message
+max-toc-depth: 3
 ---
 
 Represents a message in a chat.
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/chatmemberentity.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/chatmemberentity.mdx
index 7b8303f78..5a9fd5ea5 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/chatmemberentity.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/chatmemberentity.mdx
@@ -2,6 +2,7 @@
 id: f3a18895-b166-4430-950c-100400de6cf9
 title: "ChatMemberEntity"
 slug: /reference/chat/chat-member-entity
+max-toc-depth: 3
 ---
 
 An object representing a Chat Member with only the state properties of [`ChatMember`](/browser-sdk/chat/member).
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/chatmessageentity.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/chatmessageentity.mdx
index 4e8dd32e4..768c6b782 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/chatmessageentity.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/chatmessageentity.mdx
@@ -2,6 +2,7 @@
 id: fc90a0cd-6b13-4b8f-b976-f9a47a9186b8
 title: "ChatMessageEntity"
 slug: /reference/chat/chat-message-entity
+max-toc-depth: 3
 ---
 
 An object representing a Chat Message with only the state properties of [`ChatMessage`](/browser-sdk/chat/message).
diff --git a/fern/products/browser-sdk/pages/latest/reference/chat/index.mdx b/fern/products/browser-sdk/pages/latest/reference/chat/index.mdx
index c201de847..36ca94aba 100644
--- a/fern/products/browser-sdk/pages/latest/reference/chat/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/chat/index.mdx
@@ -2,6 +2,7 @@
 id: 1add2ddd-f4b7-4a7e-885c-f26cdf14de94
 title: "Chat"
 slug: /reference/chat
+max-toc-depth: 3
 ---
 
 The Chat namespace contains the classes and functions that you need to create a real-time chat application.
diff --git a/fern/products/browser-sdk/pages/latest/reference/index.mdx b/fern/products/browser-sdk/pages/latest/reference/core/overview.mdx
similarity index 98%
rename from fern/products/browser-sdk/pages/latest/reference/index.mdx
rename to fern/products/browser-sdk/pages/latest/reference/core/overview.mdx
index 4a6a80678..d5250ac9c 100644
--- a/fern/products/browser-sdk/pages/latest/reference/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/core/overview.mdx
@@ -1,7 +1,10 @@
 ---
 id: a74e206a-faff-44fa-8e6d-418cef400616
 title: "Technical Reference"
-slug: /reference
+sidebar-title: Overview
+position: 0
+slug: /
+max-toc-depth: 3
 ---
 
 <Markdown src="/snippets/browser-sdk/v3/installation.mdx" />
diff --git a/fern/products/browser-sdk/pages/latest/reference/pubsub/index.mdx b/fern/products/browser-sdk/pages/latest/reference/pubsub/index.mdx
index 3b03da2bd..826ed5916 100644
--- a/fern/products/browser-sdk/pages/latest/reference/pubsub/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/pubsub/index.mdx
@@ -2,6 +2,7 @@
 id: c5b2cf0f-e417-4851-9f17-7d200f33853c
 title: "PubSub"
 slug: /reference/pubsub
+max-toc-depth: 3
 ---
 
 ## Classes
diff --git a/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-client/events.mdx b/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-client/events.mdx
index 5831ab2fd..5e54183a8 100644
--- a/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-client/events.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-client/events.mdx
@@ -1,6 +1,7 @@
 ---
 title: "Events"
 slug: /reference/pubsub/client/events
+max-toc-depth: 3
 ---
 
 The PubSub.Client object emits the events listed below. You can work with these events using the following methods:
diff --git a/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-client/index.mdx b/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-client/index.mdx
index 4eb5c805d..93ce5ca75 100644
--- a/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-client/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-client/index.mdx
@@ -1,7 +1,9 @@
 ---
 id: 127a92fa-f4ef-452b-aaec-c1e321bf6f05
 title: PubSub.Client
+sidebar-title: Client
 slug: /reference/pubsub/client
+max-toc-depth: 3
 ---
 
 You can use the Client object to build a messaging system into the browser.
diff --git a/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-pubsubmessage.mdx b/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-pubsubmessage.mdx
index 2030b09ba..33c574565 100644
--- a/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-pubsubmessage.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/pubsub/pubsub-pubsubmessage.mdx
@@ -2,6 +2,7 @@
 id: ffad796b-a5b7-4df2-b83a-d744f485ec88
 title: "PubSubMessage"
 slug: /reference/pubsub/pubsub-message
+max-toc-depth: 3
 ---
 
 Represents a message in a PubSub context.
@@ -54,4 +55,4 @@ The date and time at which this message was published.
 
 **Syntax:** `PubSubMessage.publishedAt()`
 
-**Returns:** `Date`
\ No newline at end of file
+**Returns:** `Date`
diff --git a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/address.mdx b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/address.mdx
index 9b007de08..f3a4ad8fc 100644
--- a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/address.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/address.mdx
@@ -2,6 +2,7 @@
 id: 229a827a-f634-4c60-904c-9420b6b2a470
 title: "The Address Namespace"
 slug: /reference/signalwire-client/client/address
+max-toc-depth: 3
 ---
 
 The Address namespace includes methods that give you access to Address objects.
diff --git a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/chat.mdx b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/chat.mdx
index bf6cff9ed..85636a5a7 100644
--- a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/chat.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/chat.mdx
@@ -2,6 +2,7 @@
 id: 4d247641-7d1b-4fc4-89e8-134e9f65f21c
 title: "The Chat Namespace"
 slug: /reference/signalwire-client/client/chat
+max-toc-depth: 3
 ---
 
 The Chat namespace includes methods that allows you to send and receive chat messages.
diff --git a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/conversation.mdx b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/conversation.mdx
index fb7cd5264..6a330814c 100644
--- a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/conversation.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/conversation.mdx
@@ -2,6 +2,7 @@
 id: ca333ef7-ccfe-47c7-ba4b-dd5dfc15f0b8
 title: "The Conversation Namespace"
 slug: /reference/signalwire-client/client/conversation
+max-toc-depth: 3
 ---
 
 The Conversation namespace includes methods that give you access to Conversation and ConversationMessage objects.
diff --git a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/index.mdx b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/index.mdx
index b6da310d5..6c1d530fc 100644
--- a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/client/index.mdx
@@ -1,7 +1,9 @@
 ---
 id: 267f0b37-bacc-480b-a4e9-b2b297b2afe4
 title: The SignalWire Client
+sidebar-title: Client
 slug: /reference/signalwire-client/client
+max-toc-depth: 3
 ---
 
 The SignalWire Client provides access to SignalWire's services on the browser. It provides methods to handle incoming calls, dial to addresses, and register devices for notifications.
diff --git a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/index.mdx b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/index.mdx
index 4afac32d0..1ad847b3c 100644
--- a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/index.mdx
@@ -2,6 +2,7 @@
 id: db812539-9c02-4e75-b855-22f5a693a80e
 title: "Call Fabric"
 slug: /reference/signalwire-client
+max-toc-depth: 3
 ---
 
 [@signalwire/js]: https://www.npmjs.com/package/@signalwire/js
diff --git a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/notifications.mdx b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/notifications.mdx
index e98e69837..24ebd8797 100644
--- a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/notifications.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/notifications.mdx
@@ -2,6 +2,7 @@
 id: 8cc67179-b206-4f00-a58a-8416abb055ba
 title: Notifications
 slug: /reference/signalwire-client/notifications
+max-toc-depth: 3
 ---
 
 # Notifications
diff --git a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/utils.mdx b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/utils.mdx
index 4186325dd..e60bb3c19 100644
--- a/fern/products/browser-sdk/pages/latest/reference/signalwire-client/utils.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/signalwire-client/utils.mdx
@@ -2,6 +2,7 @@
 id: 12da04cf-5f2c-4755-8b2e-0d67439e6d05
 title: Utility functions
 slug: /reference/signalwire-client/utils
+max-toc-depth: 3
 ---
 
 # Utility functions
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/RoomSession/events.mdx b/fern/products/browser-sdk/pages/latest/reference/video/RoomSession/events.mdx
index ba5190690..fac4474f1 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/RoomSession/events.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/RoomSession/events.mdx
@@ -2,6 +2,7 @@
 id: 59ae8343-ac8e-4ce8-ae60-68a75a594294
 title: "Events"
 slug: /reference/video/room-session/events
+max-toc-depth: 3
 ---
 
 The RoomSession object emits the events listed below. You can work with these events using the following methods:
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/RoomSession/index.mdx b/fern/products/browser-sdk/pages/latest/reference/video/RoomSession/index.mdx
index 853cc1dac..9b6082a4d 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/RoomSession/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/RoomSession/index.mdx
@@ -2,6 +2,7 @@
 id: 1bffacce-32eb-4e77-9aa7-ded76b8228f1
 title: "RoomSession"
 slug: /reference/video/room-session
+max-toc-depth: 3
 ---
 
 A RoomSession allows you to start and control video sessions.
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/RoomSessionDevice/index.mdx b/fern/products/browser-sdk/pages/latest/reference/video/RoomSessionDevice/index.mdx
index f7ca13754..1bfc01d90 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/RoomSessionDevice/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/RoomSessionDevice/index.mdx
@@ -2,6 +2,7 @@
 id: 4e7c88fc-5858-40f6-abf4-c98aec84a263
 title: "RoomSessionDevice"
 slug: /reference/video/room-session-device
+max-toc-depth: 3
 ---
 
 A RoomSessionDevice represents a device (such as a microphone or a camera) that is at some point in its lifetime part of a [RoomSession](/browser-sdk/reference/video/room-session). You can obtain a RoomSessionDevice from the [RoomSession](/browser-sdk/reference/video/room-session) methods [addCamera](/browser-sdk/reference/video/room-session/methods/add-camera), [addMicrophone](/browser-sdk/reference/video/room-session/methods/add-microphone), and [addDevice](/browser-sdk/reference/video/room-session/methods/add-device).
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/RoomSessionScreenShare/index.mdx b/fern/products/browser-sdk/pages/latest/reference/video/RoomSessionScreenShare/index.mdx
index c31f48d9a..9782f683b 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/RoomSessionScreenShare/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/RoomSessionScreenShare/index.mdx
@@ -2,6 +2,7 @@
 id: 77683ac0-d5e8-426a-81f1-270cd56d019f
 title: "RoomSessionScreenShare"
 slug: /reference/video/room-session-screenshare
+max-toc-depth: 3
 ---
 
 Represents a screen share. This object is returned by the [startScreenShare](/browser-sdk/reference/video/room-session/methods/start-screen-share) method in a RoomSession, and can be used to control the screen share.
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/index.mdx b/fern/products/browser-sdk/pages/latest/reference/video/index.mdx
index 41ebc6d1d..be5f6908b 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/index.mdx
@@ -2,6 +2,7 @@
 id: 17fd5f76-0afe-4ffe-979e-2fd3d6f71b8c
 title: "Video"
 slug: /reference/video
+max-toc-depth: 3
 ---
 
 The Video namespace contains the classes and functions that you need to create a video conferencing application.
@@ -115,4 +116,4 @@ try {
   console.error("Error", error);
 }
 ```
-</Accordion>
\ No newline at end of file
+</Accordion>
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/video-localoverlay.mdx b/fern/products/browser-sdk/pages/latest/reference/video/video-localoverlay.mdx
index 1cdede08e..2e68b82d4 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/video-localoverlay.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/video-localoverlay.mdx
@@ -2,6 +2,7 @@
 id: 8b4b38a0-1263-4c2e-ad95-99047df71ff6
 title: "LocalOverlay"
 slug: /reference/video/local-overlay
+max-toc-depth: 3
 ---
 
 Represents the local overlay, which displays the user's local camera feed.
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/video-roomdevice.mdx b/fern/products/browser-sdk/pages/latest/reference/video/video-roomdevice.mdx
index 9c12af73b..5a52af8b5 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/video-roomdevice.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/video-roomdevice.mdx
@@ -5,6 +5,7 @@ description: Deprecated. Use RoomSessionDevice instead.
 slug: /reference/video/room-device
 icon: fa-solid fa-warning
 availability: deprecated
+max-toc-depth: 3
 ---
 
 <Warning title="Deprecated">
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/video-roomscreenshare.mdx b/fern/products/browser-sdk/pages/latest/reference/video/video-roomscreenshare.mdx
index 221a8a585..418c681db 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/video-roomscreenshare.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/video-roomscreenshare.mdx
@@ -5,6 +5,7 @@ description: Deprecated. Use RoomSessionDevice instead.
 slug: /reference/video/room-screen-share
 icon: fa-solid fa-warning
 availability: deprecated
+max-toc-depth: 3
 ---
 
 <Warning title="Deprecated">
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionplayback.mdx b/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionplayback.mdx
index 3fa2bff4a..f0585e037 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionplayback.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionplayback.mdx
@@ -2,6 +2,7 @@
 id: 94eaf980-f33e-4bab-abf8-b02da777a228
 title: "RoomSessionPlayback"
 slug: /reference/video/room-session-playback
+max-toc-depth: 3
 ---
 
 Instances of this class allow you to control (e.g., pause, resume, stop) the playback inside a room session. You can obtain instances of this class by starting a playback from the desired [RoomSession](/browser-sdk/reference/video/room-session) (see [RoomSession.play](/browser-sdk/reference/video/room-session/methods/play)).
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionrecording.mdx b/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionrecording.mdx
index 63f25b1bb..7fe754e0e 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionrecording.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionrecording.mdx
@@ -2,6 +2,7 @@
 id: 0c147716-fa59-4745-83e6-6bd1bffe3c89
 title: "RoomSessionRecording"
 slug: /reference/video/room-session-recording
+max-toc-depth: 3
 ---
 
 Represents a specific recording of a room session.
diff --git a/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionstream.mdx b/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionstream.mdx
index fd79e5588..c0920a719 100644
--- a/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionstream.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/video/video-roomsessionstream.mdx
@@ -2,6 +2,7 @@
 id: 6a205f61-2e0b-4d71-a418-eabacd3c508d
 title: "RoomSessionStream"
 slug: /reference/video/room-session-stream
+max-toc-depth: 3
 ---
 
 Represents a specific stream of a room session. This is an RTMP stream of the
diff --git a/fern/products/browser-sdk/pages/latest/reference/webrtc/index.mdx b/fern/products/browser-sdk/pages/latest/reference/webrtc/index.mdx
index 36de815de..1d45587ae 100644
--- a/fern/products/browser-sdk/pages/latest/reference/webrtc/index.mdx
+++ b/fern/products/browser-sdk/pages/latest/reference/webrtc/index.mdx
@@ -3,6 +3,7 @@ id: 54377e92-adda-4c29-b4bc-13329fb9c906
 title: WebRTC
 description: Technical reference for the WebRTC namespace
 slug: /reference/webrtc
+max-toc-depth: 3
 ---
 
 The WebRTC namespace includes functions that give you access to the input and output media devices available on the user's machine. For example, you can use these functions to request permission and get access to the media stream from a webcam, from a microphone, or from a screen sharing.
diff --git a/fern/products/browser-sdk/pages/v2/reference/call/index.mdx b/fern/products/browser-sdk/pages/v2/reference/core/call.mdx
similarity index 99%
rename from fern/products/browser-sdk/pages/v2/reference/call/index.mdx
rename to fern/products/browser-sdk/pages/v2/reference/core/call.mdx
index afd08e3dc..c5e6189e3 100644
--- a/fern/products/browser-sdk/pages/v2/reference/call/index.mdx
+++ b/fern/products/browser-sdk/pages/v2/reference/core/call.mdx
@@ -1,6 +1,7 @@
 ---
 id: dc24425e-6775-4e39-bf73-8fdc86d75013
 title: Call
+max-toc-depth: 3
 ---
 
 # Call
diff --git a/fern/products/browser-sdk/pages/v2/reference/notification/index.mdx b/fern/products/browser-sdk/pages/v2/reference/core/notification.mdx
similarity index 99%
rename from fern/products/browser-sdk/pages/v2/reference/notification/index.mdx
rename to fern/products/browser-sdk/pages/v2/reference/core/notification.mdx
index 6a5dbccac..5e13724f9 100644
--- a/fern/products/browser-sdk/pages/v2/reference/notification/index.mdx
+++ b/fern/products/browser-sdk/pages/v2/reference/core/notification.mdx
@@ -1,6 +1,7 @@
 ---
 id: 0843aea4-c102-400b-87c9-e6073d45208f
 title: Notification
+max-toc-depth: 3
 ---
 
 # Notification
diff --git a/fern/products/browser-sdk/pages/v2/index.mdx b/fern/products/browser-sdk/pages/v2/reference/core/overview.mdx
similarity index 99%
rename from fern/products/browser-sdk/pages/v2/index.mdx
rename to fern/products/browser-sdk/pages/v2/reference/core/overview.mdx
index 5d701b363..a5411733e 100644
--- a/fern/products/browser-sdk/pages/v2/index.mdx
+++ b/fern/products/browser-sdk/pages/v2/reference/core/overview.mdx
@@ -1,6 +1,9 @@
 ---
 id: b73a0777-5e70-4414-95cb-880d80ed89cc
 title: RELAY SDK for JavaScript
+sidebar-title: Overview
+position: 0
+max-toc-depth: 3
 ---
 
 # RELAY SDK for JavaScript
diff --git a/fern/products/browser-sdk/pages/v2/reference/relay-client.mdx b/fern/products/browser-sdk/pages/v2/reference/core/relay-client.mdx
similarity index 99%
rename from fern/products/browser-sdk/pages/v2/reference/relay-client.mdx
rename to fern/products/browser-sdk/pages/v2/reference/core/relay-client.mdx
index 3cea4a5ef..b3df642ed 100644
--- a/fern/products/browser-sdk/pages/v2/reference/relay-client.mdx
+++ b/fern/products/browser-sdk/pages/v2/reference/core/relay-client.mdx
@@ -1,6 +1,7 @@
 ---
 id: a8cc9af6-5a49-4607-aea4-2917e3468f7f
 title: RELAY Client
+max-toc-depth: 3
 ---
 
 # RELAY Client
diff --git a/fern/products/browser-sdk/pages/v2/reference/v2-vs-v3.mdx b/fern/products/browser-sdk/pages/v2/reference/core/v2-vs-v3.mdx
similarity index 99%
rename from fern/products/browser-sdk/pages/v2/reference/v2-vs-v3.mdx
rename to fern/products/browser-sdk/pages/v2/reference/core/v2-vs-v3.mdx
index bddd29555..025258002 100644
--- a/fern/products/browser-sdk/pages/v2/reference/v2-vs-v3.mdx
+++ b/fern/products/browser-sdk/pages/v2/reference/core/v2-vs-v3.mdx
@@ -1,6 +1,7 @@
 ---
 id: 4d6f13f7-5b87-4407-af8a-d98baeb79bbc
 title: "RELAY Browser SDK v2 vs v3"
+max-toc-depth: 3
 ---
 
 The SignalWire **Client-side SDKs** transform your **browser** into a real-time media engine, enabling developers to directly make **audio** and **video calls** to phone numbers, SIP endpoints, and other browsers. With a few lines of code, you can even set up a full-fledged video conferencing system. Using the client-side SDKs you can add immersive, scalable communication — from video conferences and softphones to click-to-call and mobile gaming — all available right in your own **web pages** and **applications**.
diff --git a/fern/products/browser-sdk/versions/latest.yml b/fern/products/browser-sdk/versions/latest.yml
index bb5af46e4..14fb796a8 100644
--- a/fern/products/browser-sdk/versions/latest.yml
+++ b/fern/products/browser-sdk/versions/latest.yml
@@ -1,18 +1,20 @@
 tabs:
-  guides:
-    display-name: Guides
-    icon: fa-solid fa-book
   reference:
     display-name: Reference
     icon: fa-solid fa-code
+  guides:
+    display-name: Guides
+    icon: fa-solid fa-book
 
 navigation:
   - tab: reference
     layout:
-      - section: Core
-        contents:
-          - page: Overview
-            path: ../pages/latest/reference/index.mdx
+      - folder: ../pages/latest/reference/core
+        title: Core
+        title-source: frontmatter
+      - folder: ../pages/latest/reference/signalwire-client
+        title: Call Fabric
+        title-source: frontmatter
       - folder: ../pages/latest/reference/video
         title: Video
         title-source: frontmatter
@@ -22,21 +24,18 @@ navigation:
       - folder: ../pages/latest/reference/pubsub
         title: PubSub
         title-source: frontmatter
-      - folder: ../pages/latest/reference/signalwire-client
-        title: Call Fabric
-        title-source: frontmatter
       - folder: ../pages/latest/reference/webrtc
         title: WebRTC
         title-source: frontmatter
+
   - tab: guides
     layout:
-      - section: Core
-        contents:
-          - page: Introduction
-            path: ../pages/latest/guides/index.mdx
+      - folder: ../pages/latest/guides/core
+        title: Core
+        title-source: frontmatter
       - folder: ../pages/latest/guides/video
-        title: Video Guides
+        title: Video
         title-source: frontmatter
       - folder: ../pages/latest/guides/chat
-        title: Chat Guides
+        title: Chat
         title-source: frontmatter
diff --git a/fern/products/browser-sdk/versions/v2.yml b/fern/products/browser-sdk/versions/v2.yml
index 6d2e62b05..8e432d553 100644
--- a/fern/products/browser-sdk/versions/v2.yml
+++ b/fern/products/browser-sdk/versions/v2.yml
@@ -6,17 +6,6 @@ tabs:
 navigation:
   - tab: reference
     layout:
-      - section: Core
-        contents:
-          - page: Introduction
-            path: ../pages/v2/index.mdx
-          - page: v2 vs v3
-            path: ../pages/v2/reference/v2-vs-v3.mdx
-          - page: RELAY Client
-            path: ../pages/v2/reference/relay-client.mdx
-      - folder: ../pages/v2/reference/call
-        title: Call
-        title-source: frontmatter
-      - folder: ../pages/v2/reference/notification
-        title: Notification
+      - folder: ../pages/v2/reference/core
+        title: Core
         title-source: frontmatter
diff --git a/fern/products/realtime-sdk/pages/latest/guides/index.mdx b/fern/products/realtime-sdk/pages/latest/guides/core/overview.mdx
similarity index 93%
rename from fern/products/realtime-sdk/pages/latest/guides/index.mdx
rename to fern/products/realtime-sdk/pages/latest/guides/core/overview.mdx
index 7c8535c45..38bc473c9 100644
--- a/fern/products/realtime-sdk/pages/latest/guides/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/guides/core/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 6e49dc97-3006-4ee7-b7d5-339c9f7726b4
 title: Guides
+sidebar-title: Overview
+position: 0
 slug: /guides
 description: Step-by-step tutorials for building voice and messaging applications with the SignalWire Realtime SDK. Learn to make calls, send SMS, and more.
 keywords: SignalWire, Realtime SDK, Node.js, tutorials, getting started, examples
@@ -17,7 +19,7 @@ New to the Realtime SDK? Start with our first steps guides to learn the fundamen
 <CardGroup cols={2}>
   <Card
     title="First Steps with Voice"
-    href="/realtime-sdk/guides/first-steps-with-voice"
+    href="/realtime-sdk/guides/make-and-receive-calls"
     icon="fa-solid fa-phone"
   >
     Learn to make and receive phone calls from your Node.js application. Configure phone numbers, handle inbound calls, and dial outbound calls.
diff --git a/fern/products/realtime-sdk/pages/latest/guides/messaging/first-steps-with-messaging.mdx b/fern/products/realtime-sdk/pages/latest/guides/messaging/first-steps-with-messaging.mdx
index 69d2319b5..2dc19e92f 100644
--- a/fern/products/realtime-sdk/pages/latest/guides/messaging/first-steps-with-messaging.mdx
+++ b/fern/products/realtime-sdk/pages/latest/guides/messaging/first-steps-with-messaging.mdx
@@ -1,6 +1,7 @@
 ---
 id: 77b0a86a-5ac2-491c-987a-694aa6a263ce
 title: First Steps with Messaging with the Realtime SDK
+sidebar-title: Get started
 slug: /guides/first-steps-with-messaging
 max-toc-depth: 3
 x-custom:
diff --git a/fern/products/realtime-sdk/pages/latest/guides/voice/make-and-receive-calls.mdx b/fern/products/realtime-sdk/pages/latest/guides/voice/make-and-receive-calls.mdx
index 86a87038e..fe247e1d4 100644
--- a/fern/products/realtime-sdk/pages/latest/guides/voice/make-and-receive-calls.mdx
+++ b/fern/products/realtime-sdk/pages/latest/guides/voice/make-and-receive-calls.mdx
@@ -1,6 +1,7 @@
 ---
 id: 7a1538e3-fa4e-4377-8791-3b248bb6f768
 title: Make and receive calls
+sidebar-title: Get started
 slug: /guides/make-and-receive-calls
 max-toc-depth: 3
 x-custom:
diff --git a/fern/products/realtime-sdk/pages/latest/guides/voice/setting-up-voicemail.mdx b/fern/products/realtime-sdk/pages/latest/guides/voice/setting-up-voicemail.mdx
deleted file mode 100644
index 30cb1d39d..000000000
--- a/fern/products/realtime-sdk/pages/latest/guides/voice/setting-up-voicemail.mdx
+++ /dev/null
@@ -1,182 +0,0 @@
----
-id: 21d04025-bcf4-49e7-af28-57c144530f75
-title: Make a voice mail responder with the Realtime SDK
-slug: /guides/make-a-voicemail-responder-with-the-realtime-sdk
-max-toc-depth: 3
-x-custom:
-  tags:
-    - sdk:relayrealtime
-    - language:nodejs
-    - product:voice
-description: Learn how to record voicemails from your callers when you are unable to take the call.
-keywords: SignalWire, Realtime SDK, Node.js, voicemail, voicemail setup, record voicemail
-sidebar_custom_props:
-  platform: javascript
----
-
-[buy-one]: /platform/phone-numbers/getting-started/buying-a-phone-number
-[realtime-sdk-documentation]: /realtime-sdk/
-
-A popular and important use case is recording a voicemail from your callers when you are unable to speak with them. This guide will show how to do exactly that.
-
-In this guide we will see how to implement a voicemail using Node.js. This allows you the most flexibility in case you want to integrate voicemails with complex workflows.
-
-## Assigning a Phone Number to a RELAY Topic
-
-To handle calls using Node.js, you should first set up a phone number to handle incoming calls using a RELAY application.
-
-Click the **Phone Numbers** tab on your lefthand side nav within your SignalWire Space, and click the specific number you would like to set up call forwarding on.
-If you don't have a number yet, now is the time to [buy one][buy-one]!
-
-<Frame caption = "To configure your number to handle incoming calls with a RELAY application, set 'Handle calls using' to 'RELAY Application', then specify the name of a topic (here we choose 'office').">
-
-![the Voice and Fax Settings pane.](/assets/images/dashboard/relay/app_voice_handler.webp)
-
-</Frame>
-
-## Building the application
-
-Our phone number is now configured. Let's see how to build the voicemail with Node.js.
-
-### Installation
-
-First, you need to obtain the Realtime SDK. From your terminal you can run:
-
-```shell npm2yarn
-npm install --save @signalwire/realtime-api
-```
-
-This will install the Realtime SDK from npm into your project.
-
-### Code
-
-The first thing we need to do is to import the Realtime SDK and initialize a Voice client. We can do it like this:
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({
-  project: "<project-id>",
-  token: "<api-token>",
-  topics: ["office"],
-});
-
-const voiceClient = client.voice;
-```
-
-We want to execute our logic whenever a call is received. Let's attach an
-event handler to the `call.received` event, from which we can answer the call
-and play a message:
-
-```js
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Got call", call.from, call.to);
-
-    await call.answer();
-
-    await call.playTTS({
-      text: "Please leave a message with your name and number at the beep. Press the pound key when finished.",
-    });
-  },
-});
-```
-
-Right after playing the introduction message, we need to start recording. In RELAY V4, we can set up event listeners directly in the recording call:
-
-```js
-// inside the "call.received" event handler
-
-await call
-  .recordAudio({
-    listen: {
-      onEnded: async (rec) => {
-        console.log("Recording URL:", rec.url);
-        await call.playTTS({
-          text: "Thank you for your message. A member of our team will contact you shortly. Goodbye!",
-        });
-        await call.hangup();
-      },
-    },
-  })
-  .onStarted();
-```
-
-We can finally start the recording. Since we also want the recording to be no
-more than 15 seconds long, we will set a timeout which will stop it if it didn't
-already end.
-
-```js
-await call
-  .recordAudio({
-    endSilenceTimeout: 0,
-    terminators: "#",
-    listen: {
-      onStarted: async (recording) => {
-        // Stop the recording after 15 seconds.
-        setTimeout(() => recording.stop(), 15000);
-      },
-    },
-  })
-  .onStarted();
-```
-
-Putting all of the parts together, here is the full code:
-
-<Accordion title="index.js">
-
-```js title="index.js"
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({
-  project: "<project-id>",
-  token: "<api-token>",
-  topics: ["office"],
-});
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Got call", call.from, call.to);
-
-    await call.answer();
-
-    await call.playTTS({
-      text: "Please leave a message with your name and number at the beep. Press the pound key when finished.",
-    });
-
-    await call
-      .recordAudio({
-        endSilenceTimeout: 0,
-        terminators: "#",
-        beep: true,
-        listen: {
-          onStarted: async (recording) => {
-            setTimeout(() => recording.stop(), 15000);
-          },
-          onEnded: async (rec) => {
-            console.log("Recording URL:", rec.url);
-            await call.playTTS({
-              text: "Thank you for your message. A member of our team will contact you shortly. Goodbye!",
-            });
-            await call.hangup();
-          },
-        },
-      })
-      .onStarted();
-  },
-});
-
-console.log("Started.");
-```
-
-</Accordion>
-
-## Wrapping up
-
-The Realtime SDK allows you to build powerful applications with a simple API.
-You are not limited to phone calls: you can also control messaging, chat, video,
-and more. See all available options in the [Realtime SDK documentation][realtime-sdk-documentation].
\ No newline at end of file
diff --git a/fern/products/realtime-sdk/pages/latest/guides/voice/stop-robocalls-with-signalwires-communication-api.mdx b/fern/products/realtime-sdk/pages/latest/guides/voice/stop-robocalls-with-signalwires-communication-api.mdx
deleted file mode 100644
index 0d95d21d1..000000000
--- a/fern/products/realtime-sdk/pages/latest/guides/voice/stop-robocalls-with-signalwires-communication-api.mdx
+++ /dev/null
@@ -1,301 +0,0 @@
----
-id: 52362d34-edfc-457f-a88e-8550fbc7fa82
-title: Filter robocalls to Lenny with the Realtime SDK
-slug: /guides/filter-robocalls-to-lenny-with-the-realtime-sdk
-max-toc-depth: 3
-x-custom:
-  ported_from_readme: true
-  repo: https://github.com/signalwire/spam-call-filter-example
-  tags:
-    - language:nodejs
-    - product:voice
-    - sdk:relayrealtime
-description: Learn how to stop robocalls with the SignalWire Realtime SDK v4.
-keywords: SignalWire, Realtime SDK, Node.js, robocall blocking, call screening, spam call filter
-sidebar_custom_props:
-  platform: javascript
-  github: https://github.com/signalwire/spam-call-filter-example
----
-
-[captcha]: https://en.wikipedia.org/wiki/CAPTCHA
-[full-application-on-github-1]: https://github.com/signalwire/examples/tree/main/Voice/Lenny%20Spam%20Filter%20Relay%20v4
-[full-application-on-github]: https://github.com/signalwire/spam-call-filter-example
-[getting-started-with-relay]: https://github.com/signalwire/signalwire-guides/blob/master/intros/getting_started_relay.md
-[github-1]: https://github.com/signalwire/examples/tree/main/Voice/Lenny%20Spam%20Filter%20Relay%20v4
-[github]: https://github.com/signalwire/spam-call-filter-example
-[here-1]: https://signalwire.com
-[here]: https://signalwire.com/signup
-[lenny]: https://en.wikipedia.org/wiki/Lenny_(bot)
-[navigating-your-signalwire-space]: https://my.signalwire.com/?page=credentials
-[node-persist]: https://github.com/simonlast/node-persist
-[on-the-trial-mode-resource-page]: https://signalwire.com/resources/getting-started/trial-mode
-[signalwire-101]: https://signalwire.com/resources/getting-started/signalwire-101
-[signalwire-relay-sdk]: /realtime-sdk/
-[the-getting-started-with-relay]: https://github.com/signalwire/signalwire-guides/blob/master/intros/getting_started_relay.md
-
-Robocalling and spam calls have been increasing in number over the past few years. Only in the US, there were 165.1 million robocalls placed in 2020, an average of 14.1 per person, including children and people who do not have a phone! SignalWire can help with its communication technology, which allows us to easily create a robocall protection service.
-
-By the end of this guide, we will have a fully-functional call forwarding service with a voice CAPTCHA to determine if the caller is a human. If they are, it forwards the call to your phone number or another number you configured as the destination.
-
-A [CAPTCHA][captcha] is an automated mechanism used to determine if the user of a service is a human or a machine. You have certainly interacted with visual ones such as "pick all of the pictures with a boat in it" on websites. In this application, we ask the caller for the result of the sum of two random numbers.
-
-In case the incoming caller is determined to be a spammer, it is sent straight to Lenny (more on that below), and it is flagged as a robo-call if someone tries to answer the CAPTCHA three times and fails. If the caller solves the CAPTCHA, their call gets forwarded to the configured private phone number for the DID.
-
-Once the calls are connected, the user that received the call on their private number can press `**` on their DTMF keypad at any time: 
-this will instantly flag the caller as spammer and add it to the database. 
-That way, if a human unwanted caller makes it through the CAPTCHA, they can still be banned.
-
-### What is Lenny?
-
-[Lenny][lenny]>) is one of the most widely known anti-spam chatbots, designed to waste the time of telemarketers.
-
-It is a set of connected audio files, spoken in a somewhat-Australian accent, that uses generic phrases such as "Are you there?" to lure a spammer into a long conversation about its "family", a supposed very smart daughter, or other topics. The average time wasted for a spam call is over 10 minutes, and it is also very fun to listen to recordings.
-
-The bot itself is simple in its ingenuity, but setting up your own version has always been complicated due to needing some telephony infrastructure and a bit of logic. The SignalWire Communication API makes it easy to do.
-
-### What do I need to run this code?
-
-As with all SignalWire scripts, you will need your API credentials (**SignalWire Space URL, Project ID, and API token**) from your SignalWire Space. For more information on how to find this information, you can read more about [Navigating your SignalWire Space][navigating-your-signalwire-space]!
-
-The application uses [node-persist][node-persist], a simple file-based database, to keep track of flagged numbers and automatically reject calls. In a production application, you would maybe use a different database such as PostgreSQL. Every phone number is saved and remembered, so any callers who you want to receive calls from will automatically get through the second time they dial-in. Spammers, on the other hand, will just be sent to have a chat with Lenny!
-
-Lastly, you will also need to have the [SignalWire RELAY SDK][signalwire-relay-sdk] installed.
-
-<Warning title="Remember">
-
-The application database is persistent, so you will have to remove the `.node-persist` folder in the directory to reset the database if you would like to test multiple times with the same number, or your call will be handled automatically as a spammer or a human depending on how you responded the first time.
-
-</Warning>
-
-Find the code for this application on [GitHub][github-1]!
-
-## Configuring the Code
-
-Start by copying the `env.example` file to a file named `.env`, and fill in the necessary information.
-
-The application needs a SignalWire API token. You can sign up [here][here], then put the Project ID and Token in the `.env` file as `SIGNALWIRE_PROJECT_ID` and `SIGNALWIRE_API_TOKEN`.
-
-You also need to configure a phone number where legitimate calls will be forwarded. This can be any number (i.e., your personal number), and you can set it up in the `.env` file as `MY_NUMBER`.
-
-Finally, you need a DID (phone number) that people will call instead of dialing your own number directly. For this, buy a phone number from your SignalWire Dashboard, then configure it to handle incoming calls using `RELAY Application`, with the same RELAY context name that you configure in `.env` as `SIGNALWIRE_CONTEXT`. By default, the example config file uses `captcha` as context name.
-
-## Running the Application
-
-If you are running the application locally, run `npm install` followed by `npm start`.
-
-You can also run the application via Docker, by first building the image with `docker build -t nodelenny .` followed by ` docker run -it --rm -v ``pwd``/.node-persist:/app/.node-persist --name nodelenny --env-file .env nodelenny `.
-
-If you prefer, you can just run `sh run_docker.sh` in your shell and the container will be built and started for you. To test the code, give a call to the phone number you set up above and prepare for a simple math quiz... unless you are a robot!
-
-## Code Breakdown
-
-Let's now walk through the more interesting code snippets.
-
-### Overall Organization
-
-The application is composed of four files:
-
-- index.js, the entry point,
-- captcha.js, for the implementation of the captcha,
-- transfer.js, for connecting to the real phone number after the captcha is solved, and
-- lenny.js, for having fun with human spammers
-
-The possible paths that a call can take are defined in index.js in the form of a state machine:
-
-```
-             +--> HANGUP <---+
-             |               |
-      START -+--> CAPTCHA ---+    (captcha.js)
-             |       |       |
-             |       v       |
-             +--> TRANSFER --+    (transfer.js)
-             |       |       |
-             |       v       |
-             +---> LENNY ----+    (lenny.js)
-```
-
-Right after the application is started, we create a RELAY Client to connect with SignalWire:
-
-```js
-const client = await SignalWire({
-  project: process.env.SIGNALWIRE_PROJECT_ID,
-  token: process.env.SIGNALWIRE_API_TOKEN,
-  topics: [process.env.SIGNALWIRE_CONTEXT],
-});
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: [process.env.SIGNALWIRE_CONTEXT],
-  onCallReceived: onIncomingCallHandler,
-});
-```
-
-Whenever someone calls a number which we have associated to the same topic specified in `SIGNALWIRE_CONTEXT`, the RELAY Consumer will call our `onIncomingCallHandler` function. In there, we first answer the call:
-
-```js
-await call.answer();
-```
-
-We start recording:
-
-```js
-await call
-  .recordAudio({
-    direction: "both",
-    initialTimeout: 10,
-    endSilenceTimeout: 0,
-    stereo: true,
-    listen: {
-      onStarted: (rec) => {
-        console.log("Recording the call to " + rec.url);
-      },
-    },
-  })
-  .onStarted();
-```
-
-And we go into the `START` state. From there, is the caller is not known yet (i.e., is not in our db), we will switch to the `CAPTCHA` state.
-
-### The CAPTCHA
-
-The CAPTCHA implementation can be found in the `captcha.js` file. In there, we first play a text-to-speech message to assert the current state of the call:
-
-```js
-await call.playTTS({
-  text: "Hello! To complete your call, Please verify you are a human, by dialing or speaking the answer to this simple question.",
-});
-```
-
-Then we generate two digits at random, and we prompt the user for the sum of those numbers:
-
-```js
-const digit1 = Math.floor(Math.random() * 10);
-const digit2 = Math.floor(Math.random() * 10);
-const expectedAnswer = digit1 + digit2;
-
-const result = await call
-  .promptTTS({
-    digits: { max: 2, digitTimeout: 10, terminators: "#" },
-    duration: 10,
-    speech: {
-      hints: ["denoise=true", ...Array(19).keys()], // Array of expected phrases to detect.
-      endSilenceTimeout: 2,
-    },
-    text: "What is " + digit1 + " plus " + digit2 + "?", // Our TTS prompt
-  })
-  .onEnded();
-```
-
-At this point the user will hear, for example: "What is 3 plus 9?". They can answer either by speaking, or by using the keypad. We find the answer in the `result` variable:
-
-```js
-if (result.digits.trim() == expectedAnswer) {
-  await call
-    .playTTS({
-      text: "That is correct. You are probably a human, enjoy your call!",
-    })
-    .onEnded();
-  storage.set(call.from, { isHuman: true });
-  return true;
-}
-```
-
-### Transfering the Call
-
-If the captcha is solved successfully, or if the caller is a known legitimate human, they are transferred to the real phone number. In `transfer.js`, you can see how to connect the currently active call (`call`) to our real phone number:
-
-```js
-const dial = await call.connectPhone({
-  to: destinationNumber,
-  from: call.from,
-  timeout: 30,
-});
-```
-
-At this point the `dial` variable will have the nested call's description.
-
-Now comes the interesting part. Say that a human spammer has been able to get to this point. We want to let the user mark them as a spammer while they're speaking. We'll do that by dialing `**`. As soon as the user dials `**`, we hangup the nested phone call and connect the spammer to Lenny for an endless meaningless conversation.
-
-First, we connect an event to detect the digits that the user dials:
-
-```js
-// Detect if the user presses '**'. If so, mark caller as spammer.
-let dialed = "";
-dial.listen({
-  onDetectUpdated: async (detect) => {
-    if (detect.type === "digit") {
-      const digit = detect.result;
-      console.log("Dialed", digit);
-      dialed += digit;
-
-      if (dialed.endsWith("**")) {
-        console.log("Marking as scammer");
-        await storage.set(call.from, { isHuman: true, isScammer: true });
-        dial.hangup(); // Hangup the nested call
-      }
-    }
-  },
-});
-```
-
-Then, we start the actual detection of the digits:
-
-```js
-// Start the asynchronous detection
-await dial
-  .detectDigit({
-    timeout: 0,
-  })
-  .onStarted();
-```
-
-The detection runs asynchronously while the user speaks.
-
-### Lenny
-
-<Warning title="Don't use this in production!">
-
-We are showing how to transfer the call to Lenny just for teaching purposes! In real applications, you may want to skip this step, otherwise you will be charged for all the minutes during which Lenny is talking!
-
-</Warning>
-
-If the current caller has been marked as a spammer by dialing `**`, or if they were a known spammer to begin with, the result is the same: they are sent to Lenny.
-
-Lenny consists in a sequence of audio files with the voice of a convincing old man. The sentences that Lenny uses are general enough to be appropriate for a large set of contexts: it is going to take a while before the spammer realizes they're talking with a record player!
-
-How does Lenny know when to start speaking, so to avoid talking over the other person? Surprisingly, Lenny is quite simple. First, we simply play an audio (we pick audio files in sequence):
-
-```js
-await call
-  .playAudio({
-    url: lennyConfig.soundBase + "/" + lennyConfig.responses[responseId],
-    volume: +20,
-  })
-  .onEnded();
-```
-
-Then, in order to wait for whatever the other person is replying, we use `prompt` (the same function we used for the captcha), using as audio a light background noise:
-
-```js
-await call.prompt({
-  speech: { endSilenceTimeout: 1.0 },
-  playlist: new Voice.Playlist().add(
-    Voice.Playlist.Audio({
-      url: lennyConfig.soundBase + "/" + lennyConfig.background,
-    })
-  ),
-});
-```
-
-And that's it!
-
-## Conclusion
-
-Now you have a powerful and persistent way to prevent robocalls from hitting your personal phone or your businesses' phones, brought to you by the power of the SignalWire Communication APIs.
-
-## Get Started With SignalWire
-
-You can sign up for a new SignalWire Space [here][here-1]! If you sign up for the first time, your account will start in trial mode, which you can exit by making a manual top up of $5.00. You can find more information [on the Trial Mode resource page][on-the-trial-mode-resource-page].
-
-You can find more information, including where to get your credentials and how to set up the phone number, in [the Getting Started with RELAY][the-getting-started-with-relay] guide.
-
diff --git a/fern/products/realtime-sdk/pages/latest/guides/voice/weather-phone-with-signalwire-realtime-api.mdx b/fern/products/realtime-sdk/pages/latest/guides/voice/weather-phone-with-signalwire-realtime-api.mdx
deleted file mode 100644
index 5e4f945b1..000000000
--- a/fern/products/realtime-sdk/pages/latest/guides/voice/weather-phone-with-signalwire-realtime-api.mdx
+++ /dev/null
@@ -1,371 +0,0 @@
----
-id: 6bfaa051-dc10-4891-baaa-4c87af299069
-title: Make a Weather Phone IVR with the Realtime SDK
-slug: /guides/make-a-weather-phone-ivr-with-the-realtime-sdk
-max-toc-depth: 3
-x-custom:
-  ported_from_readme: true
-  repo: https://github.com/signalwire/examples/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
-  tags:
-    - sdk:relayrealtime
-    - language:nodejs
-    - product:voice
-description: Learn how to build a weather phone IVR application with the SignalWire Realtime SDK.
-keywords: SignalWire, Realtime SDK, Node.js, weather phone, voice application example, API integration
-sidebar_custom_props:
-  platform: javascript
-  github: https://github.com/signalwire/examples/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
----
-
-[17712093222-2]: tel:+17712093222
-[buying-a-phone-number-2]: /platform/phone-numbers/getting-started/buying-a-phone-number
-[call-1]: /realtime-sdk/voice/call
-[call-playtts-1]: /realtime-sdk/voice/call#playtts
-[call-prompt-1]: /realtime-sdk/voice/call#prompt
-[community-discord]: https://discord.com/invite/F2WNYTNjuF
-[connectphone-1]: /realtime-sdk/voice/call#connectphone
-[connectsip-1]: /realtime-sdk/voice/call#connectsip
-[create-a-signalwire-account-and-space]: https://m.signalwire.com/signups/new?s=1
-[device-builder]: /realtime-sdk/voice/device-builder
-[here-1]: https://github.com/signalwire/guides/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
-[here-2]: https://github.com/signalwire/guides/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS%20Relay%20v4
-[here]: https://m.signalwire.com/signups/new?s=1
-[project-id-and-api-token]: https://my.signalwire.com?page=credentials
-[signalwire-realtime-api-1]: /realtime-sdk/
-[signalwire-realtime-sdk-reference-2]: /realtime-sdk/
-[signalwire-realtime-sdk-reference]: /realtime-sdk/voice/
-[the-github-repo-1]: https://github.com/signalwire/guides/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS%20Relay%20v4
-[the-github-repo]: https://github.com/signalwire/guides/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
-[view-the-related-github-repository-to-explore-this-codebase-1]: https://github.com/signalwire/guides/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS%20Relay%20v4
-[view-the-related-github-repository-to-explore-this-codebase]: https://github.com/signalwire/guides/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
-[voice-client-s-1]: /realtime-sdk/voice/client
-
-## Overview
-
-This code sample is a simple weather phone IVR application that uses the [SignalWire
-Realtime API][signalwire-realtime-api-1] to provide current weather report
-to the caller in Washington DC either as a phone call or text.
-
-In particular, this sample demonstrates how you can use the SignalWire realtime API to easily accomplish the following:
-
-- Making a phone call programmatically using your numbers
-- Waiting for, and programmatically receiving, phone calls to your numbers
-- Taking user input from their dial pad to select between actions
-- Connecting to a different phone call
-- Sending a text message to the caller
-- Playing audio, Text-to-Speech and ringtones through the phone
-
-{/* #### Dial 📞 [+17712093222][17712093222-2] 📞 for a live demo right now! */}
-
-The code we'll write is waiting for you at the other end.
-
-## Required Resources
-
-To be able to run this example, you will need a SignalWire account which you can create [here][here]. From your SignalWire Space, you need your [SignalWire API credentials][project-id-and-api-token].
-
-Further, you'll need to get a number from SignalWire which will be used as the number for the IVR. You can get that from your SignalWire Dashboard. You can follow [Buying a Phone Number][buying-a-phone-number-2] if you need help.
-
-If you are planning to make or allow calls outside of the US from SignalWire numbers, please note that you'll have to manually enable it. Follow [Enabling International Outbound Voice & SMS]\(Enabling International Outbound Voice & SMS) guide for more information.
-
-To be able to run this project, you need to have Node.js and Node Package Manager (npm) installed.
-
-This sample code is available on GitHub
-[here][here-2].
-You can follow the README.md instructions to download and run the sample.
-
-## How to Run the Application
-
-1. Edit the settings of your phone number so that our code can handle it. The RELAY Topic you specify here needs to match the one you specify in the code later. In this case, we have used 'office'.
-
-<Frame caption="A screenshot of the Edit Settings page of a phone number in SignalWire. The number is set to accept incoming calls as Voice Calls, handle the calls using a RELAY Application, and forward the call to a RELAY topic called 'office'." >
-
-![the Edit Settings page of a phone number in SignalWire.](/assets/images/dashboard/relay/app_voice_handler.webp)
-
-</Frame>
-
-2. Start by adding your Project ID and API credentials, and the phone number you bought to the `env.sample` file, in the format specified.
-3. Rename the `env.sample` file as `.env`.
-4. Run `yarn install` in the directory to download the required libraries.
-5. Run `node index.js` to start the program. If all went well, it should now be listening for phone calls to the number specified in `.env` file.
-
-Alternatively, if you want to use docker to run a container. Instead of doing `yarn install`, do the following instead:
-
-1. `docker build . -t weather-ivr` to build the container using the dockerfile already in the repo.
-2. `docker run -d weather-ivr` to run it.
-
-## Code
-
-The main code for this project lives in a single file: `index.js`, and from there we'll make and receive the phone call. Other than that, there are a few more files that we will briefly discuss:
-
-1. `.env.sample` file contains the format in which you will provide your SignalWire API credentials to the code. Copy this file to `.env` and provide your credentials. Please take care to not commit your `.env` file on GitHub, or make it public in any way.
-
-2. `package.json` lists out the dependencies that you will need to run the code. This includes the SignalWire Realtime SDK. When you run `npm install` or `yarn install`, the packages listed here will be downloaded and installed.
-
-[View the related GitHub Repository to explore this
-codebase.][view-the-related-github-repository-to-explore-this-codebase-1]
-
-### Abridged code sample
-
-
-```javascript
-import "dotenv/config";
-import parsePhoneNumber from "libphonenumber-js";
-import axios from "axios";
-import { SignalWire, Voice } from "@signalwire/realtime-api";
-
-const DC_WEATHER_PHONE = "+12025891212";
-const PHONE_NUMBER = process.env.PHONE_NUMBER;
-
-const client = await SignalWire({
-  project: process.env.PROJECT_ID,
-  token: process.env.API_TOKEN,
-  topics: ["office"],
-});
-
-const messageClient = client.messaging;
-const voiceClient = client.voice;
-
-console.log("Waiting for calls...");
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Got a call from", call.from, "to number", call.to);
-    await call.answer();
-    console.log("Inbound call answered");
-    await call.playTTS({
-      text: "Hello! Welcome to Knee Rub's Weather Helpline.",
-      gender: "male",
-    });
-    console.log("Welcome text said");
-
-    const ttsInfo = await call
-      .promptTTS({
-        text: "Please enter 1 for Washington weather, 2 for washington weather message, 3 to play rain dance, 4 to send rain dance.",
-        duration: 10,
-        digits: {
-          max: 1,
-          digitTimeout: 15,
-        },
-      })
-      .onEnded();
-    const digits = ttsInfo.digits;
-
-    if (digits === "1") {
-      // User input 1.  We are going to dial a Washington weather
-      // number and connect the call.
-      let peer = await call.connectPhone({
-        from: call.from,
-        to: DC_WEATHER_PHONE,
-        timeout: 30,
-        ringback: new Voice.Playlist().add(
-          Voice.Playlist.TTS({
-            text: "ring. ring. ring. ring. ring. ring. ring. ring",
-          })
-        ),
-      });
-      await peer.disconnected();
-      console.log("Connected");
-    } else if (digits === "2") {
-      // User input 2.  We are going to query a weather API, find the weather of Washington,
-      // and message that weather to the user's number.
-      const place = "Washington DC";
-      console.log(`Sending message about weather of ${place}`);
-      const weather = await getWeatherFromOpenWeatherMap(place);
-      const message = `${place} weather: ${
-        weather.weather[0].description
-      }. Temperature: ${(weather.main.temp - 273).toFixed(2)}°C`;
-      console.log(message, "being sent to number", call.to);
-      try {
-        await messageClient.send({
-          from: PHONE_NUMBER,
-          to: call.to,
-          body: message,
-        });
-      } catch (e) {
-        await call
-          .playTTS({
-            text:
-              "Sorry, I couldn't send the message." +
-              (e?.data?.from_number[0] ?? " ") +
-              " I will say the contents here. " +
-              message,
-          })
-          .onEnded();
-      }
-    } else if (digits === "3") {
-      //User input 3.  We are going to play a rain dance song hosted on our servers.
-      console.log("Sending rain dance song");
-      await call
-        .playAudio({
-          url: "https://cdn.signalwire.com/swml/April_Kisses.mp3",
-        })
-        .onEnded();
-    } else if (digits === "4") {
-      //User input 4.  We are going to ask for a phone number to dial and play a rain dance song to it.
-      console.log("Sending rain song to your friend");
-      const prompt = await call
-        .promptTTS({
-          text: "Please enter your friend's number then dial #. Please use the international format, but skip the plus sign.",
-          digits: {
-            max: 15,
-            digitTimeout: 15,
-            terminators: "#",
-          },
-        })
-        .onEnded();
-      console.log("Prompted for digits, received digits", prompt.digits);
-
-      let digits = prompt.digits;
-
-      let e164number;
-      let number = parsePhoneNumber("+" + digits);
-      let usnumber = parsePhoneNumber(digits, "US");
-      if (number && number.isValid()) {
-        e164number = number.number;
-      } else if (usnumber && usnumber.isValid()) {
-        e164number = usnumber.number;
-      }
-      console.log("Calling", e164number);
-      if (e164number) {
-        console.log("Calling with rain dance");
-        callWithRainDance(e164number);
-      } else {
-        console.log("Invalid number", digits);
-        let pb = await call.playTTS({
-          gender: "male",
-          text: "The number is invalid. Bye",
-        });
-        await pb.waitForEnded();
-      }
-    }
-    console.log("Hanging up");
-    call.hangup();
-  },
-});
-
-async function callWithRainDance(number) {
-  try {
-    console.log("Sending Call");
-    const call = await voiceClient.dialPhone({
-      from: PHONE_NUMBER,
-      to: number,
-      timeout: 30,
-    });
-    console.log("sending rain dance song");
-    await call
-      .playAudio({
-        url: "https://cdn.signalwire.com/swml/April_Kisses.mp3",
-      })
-      .onEnded();
-    await call.hangup();
-  } catch (e) {
-    console.log("Call not answered.", e);
-  }
-}
-
-async function getWeatherFromOpenWeatherMap(location) {
-  let latlong;
-  if (location === "Washington DC") latlong = "lat=38.9072&lon=-77.0367";
-  else latlong = "lat=0&lon=0";
-  let weather;
-  try {
-    weather = await axios.get(
-      `https://api.openweathermap.org/data/2.5/weather?${latlong}&appid=c0fedc735ee57d142c09bf7bf8ed8f04`
-    );
-  } catch (e) {
-    console.log(e);
-    return { weather: [{ description: "error" }], main: { temp: 0 } };
-  }
-  console.log(weather.data);
-  return weather.data;
-}
-```
-
-As evident from the source code above, SignalWire Voice API makes it incredibly easy to write complex IVRs. You can get pretty far by using the [SignalWire Realtime SDK reference][signalwire-realtime-sdk-reference] and this code as a starting point.
-
-In case there's some confusion, here's a brief walkthrough anyway:
-
-### Installing the libraries
-
-Download the required SignalWire Realtime Libraries by using `npm install @signalwire/realtime-api`. After you've done this, you can import required namespaces into your project using the following line:
-
-```javascript
-const { SignalWire } = require("@signalwire/realtime-api");
-```
-
-### Instantiating Voice and Messaging client
-
-Using your [Project ID and API token][project-id-and-api-token], you can instantiate both Voice and Messaging Client.
-
-`topics` parameter: RELAY topics allows you to treat a bunch of phone numbers as one, so that you can subscribe to and receive events (calls, messages etc) from your group of numbers at once. You can pick which numbers are in which RELAY topic from the SignalWire Dashboard. For this example, I've already set up my number to be in the `office` topic (read [Buying a Phone Number][buying-a-phone-number-2] if you're unfamiliar with the process).
-
-```javascript
-const client = await SignalWire({
-  project: process.env.PROJECT_ID,
-  token: process.env.API_TOKEN,
-  topics: ["office"],
-});
-
-const messageClient = client.messaging;
-const voiceClient = client.voice;
-```
-
-### Waiting for calls
-
-Once you've successfully instantiated your Realtime Clients, you can use them to register events pertaining to the topic you've selected (like waiting for calls and messages to the numbers). In the example below, notice how easy it is to register event listener for incoming calls.
-
-```javascript
-console.log("Waiting for calls...");
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Got a call from", call.from, "to number", call.to);
-    await call.answer();
-    console.log("Inbound call answered");
-  },
-});
-```
-
-With this simple bit of code, as long as this program is running, the phone call to your number will automatically be received by this code.
-
-Of course, picking up the call is but the first step. Now you'll have to interact with the user. Simply use the [Call][call-1] object that is passed to the event listener as parameter to perform actions and listen for user input. Like maybe:
-
-1. making a robot say hello with [`call.playTTS`][call-playtts-1]
-2. taking in user input with [`call.prompt`][call-prompt-1]
-3. connecting the call to another phone call (like the Washington Weather Phone Number) with [`connectPhone`][connectphone-1] or [`connectSip`][connectsip-1]
-
-And more.
-
-### Making calls
-
-Making calls is even simpler. Use the [Voice Client's][voice-client-s-1] `dialPhone` and `dialSip` methods to make calls. In fact, if these are too simple for you, feel free to use the more general purpose `dial` method with [`Device Builder`][device-builder] to make series and parallel calls at once.
-
-```javascript
-// Call someone and play them a nice song.
-const call = await voiceClient.dialPhone({
-  from: PHONE_NUMBER,
-  to: "{NUMBER TO CALL IN E.164 FORMAT}",
-  timeout: 30,
-});
-console.log("sending rain dance song");
-await call
-  .playAudio({
-    url: "https://cdn.signalwire.com/swml/April_Kisses.mp3",
-  })
-  .onEnded();
-await call.hangup();
-```
-
-## Wrap up
-
-{/* #### Dial 📞 [+17712093222][17712093222-2] 📞 for a live demo of the code. */}
-
-[The GitHub Repo][the-github-repo-1]
-
-[SignalWire RealTime SDK Reference][signalwire-realtime-sdk-reference-2]
-
-## Sign Up Here
-
-If you would like to test this example out, you can [create a SignalWire account and Space][create-a-signalwire-account-and-space].
-
-Please feel free to reach out to us on our [Community Discord][community-discord] or create a Support ticket from your SignalWire Space if you need guidance!
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/chat/chat-client.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/chat/chat-client.mdx
deleted file mode 100644
index 69b329664..000000000
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/chat/chat-client.mdx
+++ /dev/null
@@ -1,500 +0,0 @@
----
-id: fad3cd92-40a4-4ac6-8aa8-0617036cc2af
-title: "Client"
-keywords: SignalWire, Realtime SDK, Node.js, chat client, chat rooms, subscribe channel
-slug: reference/chat/client
-description: Chat Client reference for real-time chat functionality. Subscribe to channels, publish messages, get message history, and manage channel members.
-max-toc-depth: 3
----
-
-[chat]: ./index.mdx
-[chatmember]: ./chat-chatmember.mdx
-[chatmemberentity]: #chatmemberentity
-[chatmessage]: ./chat-chatmessage.mdx
-[chatmessageentity]: #chatmessageentity
-[events]: #events
-[getmessages]: #getmessages
-[paginationcursor]: #paginationcursor
-[signalwire-realtime-client]: ../realtime-client/index.mdx
-
-A [Chat][chat] client is used to listen for events on a channel and to publish messages into a channel.
-Members of a channel can also be retrieved and updated using a Chat client.
-
-## **Chat Client**
-### Setting up a Chat Client
-
-To create a `Chat` client, you will need to create a [`SignalWire Realtime-Client`][signalwire-realtime-client] first.
-After the `SignalWire Client` is created, you can access the `Chat` client using the `chat` namespace.
-
-#### Example
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const chatClient = client.chat;
-```
-
----
-
-## **Methods**
-
-### getMemberState
-
-- **getMemberState**(`params`): `Promise<\{ channels: Record<string, ChatChannelState> \}>`
-
-Returns the states of a member in the specified channels.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="channels" type="string | string[]">
-  Channels for which to get the state.
-</ParamField>
-
-<ParamField path="memberId" type="string" required>
-  ID of the member for which to get the state.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<{ channels: Record<string, ChatChannelState> }>`
-
-A promise that resolves to an object containing the states of the member in the specified channels.
-
-#### Example
-
-In this example, we fetch the state of the member `User1` in the channel
-`channel1` and print it to the console.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const chatClient = client.chat;
-
-let usesId = 'User1'; // Assumes a member with this id already exists and has joined the channel.
-
-const s = await chatClient.getMemberState({
-  channels: "channel1", // or a list of channels like: ["channel1", "channel2"]
-  memberId: usesId
-});
-
-console.log(`The state of ${usesId} is: ${JSON.stringify(s.channels.channel1.state, null, 2)}`);
-```
-
----
-
-### getMembers
-
-- **getMembers**(`params`): `Promise<{ members: ChatMemberEntity[] }>`
-
-Returns the list of members in the given channel.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="channel" type="string" required>
-  The channel for which to get the list of members.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<{ members: ChatMemberEntity[] }>`
-
-A promise that resolves to an object containing the list of members in the given channel.
-
-#### Example
-In this example, we fetch all the members in the channel `channel1` and print the
-number of members and the list of members to the console.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const chatClient = client.chat;
-
-const m = await chatClient.getMembers({ channel: "channel1" });
-
-console.log(`There are a total of ${m.members.length} members in channel1.
-The list of members are: ${m.members.map(m => m.id).join(", ")}`);
-```
-
----
-
-### getMessages
-
-- **getMessages**(`params`): `Promise<{ cursor: PaginationCursor, messages: ChatMessageEntity[] }>`
-
-Returns the list of messages that were sent to the specified channel.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="channel" type="string" required>
-  Channel for which to retrieve the messages.
-</ParamField>
-
-<ParamField path="cursor" type="PaginationCursor">
-  Cursor for pagination. See [`PaginationCursor`][paginationcursor].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<{ cursor: PaginationCursor, messages: ChatMessageEntity[] }>`
-
-A promise that resolves to an object containing the list of messages that were sent to the specified channel.
-
-#### Example
-
-In this example, we fetch all the messages sent in the channel `channel1` and print them to the console.
-We use the cursor to fetch the next set of messages until the cursor is null, indicating that there are no more messages to fetch.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const chatClient = client.chat;
-
-let pageNumber = 1;
-let cursor = null;
-
-while (true) {
-  const m = await chatClient.getMessages({
-    channel: "channel1",
-    cursor: cursor ? { after: cursor } : undefined
-  });
-
-  console.log(`Page ${pageNumber}: fetched ${m.messages.length} messages
-  ${JSON.stringify(m.messages, null, 2)}`);
-
-  // Check if 'after' is null, indicating no more messages to fetch
-  if (!m.cursor.after) {
-    console.log("No more messages");
-    break;
-  }
-  // Update the cursor to fetch next set of messages
-  cursor = m.cursor.after;
-  pageNumber++;
-}
-```
-
----
-
-### listen
-
-- **listen**(`{ event: Callback }`): `Promise<ChatEvents>`
-
-Listen for events on the specified channels.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="channels" type="string[]" required>
-  List of channels to listen to.
-</ParamField>
-
-<ParamField path="EVENT" type="Callback">
-  The event to listen to. List of events can be found [here][events]. Example event: `onMessageReceived`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<ChatEvents>`
-
-A promise that resolves to a `ChatEvents` object that you can use to view the current state or results of the event.
-
-#### Example
-
-In this example, we listen for the `onMessageReceived` event on the channel
-`my-channel` and print the message to the console.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const chatClient = client.chat;
-
-await chatClient.listen({
-  channels: ["my-channel"],
-  onMessageReceived: (message) => {
-    console.log(message);
-  }
-});
-```
-
----
-
-### publish
-
-- **publish**(`params`): `Promise<void>`
-
-Publish a message into the specified channel.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="channel" type="string" required>
-  Channel in which to send the message.
-</ParamField>
-
-<ParamField path="content" type="any" required>
-  The message to send. This can be any JSON-serializable object or value.
-</ParamField>
-
-<ParamField path="meta" type="Record<any, any>">
-  Metadata associated with the message. There are no requirements on the content of metadata.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Examples
-
-Publishing a message as a string:
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const chatClient = client.chat;
-
-await chatClient.publish({
-  channel: "my-channel",
-  content: "Hello, world."
-});
-```
-
-Publishing a message as an object:
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const chatClient = client.chat;
-
-await chatClient.publish({
-  channel: "my-channel",
-  content: {
-    field_one: "value_one",
-    field_two: "value_two"
-  }
-});
-```
-
----
-
-### setMemberState
-
-- **setMemberState**(`params`): `Promise<void>`
-
-Sets a state object for a member, for the specified channels. The previous state object will be completely replaced.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="channels" type="string | string[]" required>
-  Channels for which to set the state.
-</ParamField>
-
-<ParamField path="memberId" type="string" required>
-  Id of the member to affect.
-</ParamField>
-
-<ParamField path="state" type="Record<any, any>" required>
-  The state to set. There are no requirements on the content of the state.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we set the state of the member `User1` in the channel `channel1` to
-`{ online: true, typing: false }`.
-We then fetch the state of the member and print it to the console.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const chatClient = client.chat;
-
-let usesId = 'User1'; // Assumes a member with this id already exists and has joined the channel.
-
-// set the member state
-await chatClient.setMemberState({
-  memberId: usesId,
-  channels: "channel1", // or a list of channels like: ["channel1", "channel2"]
-  state: {
-    online: true,
-    typing: false,
-  }
-});
-
-// get the member state
-const s = await chatClient.getMemberState({
-  channels: "channel1", // or a list of channels like: ["channel1", "channel2"]
-  memberId: usesId,
-});
-
-// print the state
-console.log(`The state of ${usesId} is: ${JSON.stringify(s.channels.channel1.state, null, 2)}`);
-```
-
----
-
-## **Events**
-
-### onMemberJoined
-
-- **client.chat.listen**(`{ onMemberJoined: Callback }`)
-
-Emitted when a new member joins the chat. Your event handler will be called with an instance of [`ChatMember`][chatmember].
-
-#### Parameters
-
-<ParamField path="member" type="ChatMember" required>
-  The member that joined. See [`ChatMember`][chatmember].
-</ParamField>
-
-### onMemberLeft
-
-- **client.chat.listen**(`{ onMemberLeft: Callback }`)
-
-Emitted when a member leaves the chat. Your event handler will be called with an instance of [`ChatMember`][chatmember].
-
-#### Parameters
-
-<ParamField path="member" type="ChatMember" required>
-  The member that left. See [`ChatMember`][chatmember].
-</ParamField>
-
-### onMemberUpdated
-
-- **client.chat.listen**(`{ onMemberUpdated: Callback }`)
-
-Emitted when a member updates its state. Your event handler will be called with an instance of [`ChatMember`][chatmember].
-
-#### Parameters
-
-<ParamField path="member" type="ChatMember" required>
-  The member that was updated. See [`ChatMember`][chatmember].
-</ParamField>
-
-### onMessageReceived
-
-- **client.chat.listen**(`{ onMessageReceived: Callback}`)
-
-Emitted when a message is received. Your event handler will be called with an instance of [`ChatMessage`][chatmessage].
-
-#### Parameters
-
-<ParamField path="message" type="ChatMessage" required>
-  The message that was received. See [`ChatMessage`][chatmessage].
-</ParamField>
-
-## **Type Aliases**
-
-### ChatMemberEntity
-
-An object representing a Chat Member with only the state properties of [`ChatMember`][chatmember].
-
-#### Properties
-
-- `Readonly` **channel**: `string`
-
-The channel of this member.
-
-- `Readonly` **id**: `string`
-
-The id of this member.
-
-- `Readonly` **state**: `Record<any,any>`
-
-The state of this member.
-
----
-
-### ChatMessageEntity
-
-An object representing a Chat Message with only the state properties of [`ChatMessage`][chatmessage].
-
-#### Properties
-
-- `Readonly` **content**: `any`
-
-The content of this message.
-
-- `Readonly` **id**: `string`
-
-The id. of this message
-
-- `Readonly` **member**: [`ChatMember`][chatmember]
-
-The member which sent this message.
-
-- `Readonly` **meta?**: `any`
-
-Any metadata associated with this message.
-
-- `Readonly` **publishedAt**: `Date`
-
-The date and time at which this message was published.
-
----
-
-### PaginationCursor
-
-This is a utility object that aids in pagination.
-It is specifically used in conjunction with the [getMessages][getmessages] method.
-
-#### Properties
-
-- `Readonly` **after?**: `string`
-
-This property signifies the cursor for the subsequent page.
-
-- `Readonly` **before?**: `string`
-
-This property signifies the cursor for the preceding page.
-
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/chat/client/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/chat/client/index.mdx
index 997ebdfd5..85cec7f6c 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/chat/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/chat/client/index.mdx
@@ -1,6 +1,7 @@
 ---
 id: 1ac3268e-33c8-44b3-8fa1-f9f514edb76c
 title: "Chat Client"
+sidebar-title: Client
 slug: reference/chat/client
 description: Chat Client reference for chat messaging.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/chat/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/chat/overview.mdx
similarity index 98%
rename from fern/products/realtime-sdk/pages/latest/tech-ref/chat/index.mdx
rename to fern/products/realtime-sdk/pages/latest/tech-ref/chat/overview.mdx
index d6034452c..1a1f62828 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/chat/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/chat/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 306e6105-6f11-4f4a-9c2d-ad046077e8c2
 title: "Chat"
+sidebar-title: Overview
+position: 0
 keywords: SignalWire, Realtime SDK, Node.js, chat API, real-time chat
 slug: reference/chat
 description: Access the Chat API for building real-time chat applications. Subscribe to channels, send messages, and track member presence in chat rooms.
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/core/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/core/overview.mdx
similarity index 99%
rename from fern/products/realtime-sdk/pages/latest/tech-ref/core/index.mdx
rename to fern/products/realtime-sdk/pages/latest/tech-ref/core/overview.mdx
index 7401ba640..68c167863 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/core/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/core/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: dbcca373-5951-4202-9866-009b87d4c670
 title: "Realtime Server SDK"
+sidebar-title: Overview
+position: 0
 slug: /
 subtitle: Node.js server SDK for real-time communication through WebSocket connections
 description: Build real-time voice, video, messaging, and chat applications with the SignalWire Realtime SDK for Node.js. Event-driven WebSocket architecture with dedicated namespaces.
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/client/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/client/index.mdx
index 8a2016694..fff0b1cf2 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/client/index.mdx
@@ -1,6 +1,8 @@
 ---
 id: c21553f3-b1aa-47a0-ade1-979572194f4d
 title: "Messaging Client"
+sidebar-title: Client
+position: 1
 slug: reference/messaging/client
 description: Messaging Client reference for sending and receiving messages.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/messaging-client.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/messaging-client.mdx
deleted file mode 100644
index 1b52e4730..000000000
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/messaging-client.mdx
+++ /dev/null
@@ -1,184 +0,0 @@
----
-id: 3d0dd299-58b4-49b8-aeba-cf7c14fb2208
-title: "Client"
-keywords: SignalWire, Realtime SDK, Node.js, messaging client, send SMS, send MMS
-slug: reference/messaging/client
-description: Messaging Client reference for sending and receiving SMS/MMS messages. Listen for inbound messages and send outbound messages with media attachments.
-max-toc-depth: 3
----
-
-[events]: #events
-[messagecontract]: /realtime-sdk/messaging/message-contract
-[messaging]: /realtime-sdk/reference/messaging
-[messagingsendresult]: /realtime-sdk/reference/messaging/sendresult
-[signalwire-realtime-client]: /realtime-sdk/reference/client
-
-A [Messaging][messaging] client is used to listen to inbound SMS and MMS messages, and to send outbound SMS and MMS messages.
-
-## **Messaging Client**
-### Setting up a Messaging Client
-
-To create a `Messaging` client, you will first need to create a [`SignalWire Realtime-Client`][signalwire-realtime-client].
-After the `SignalWire Client` is created, you can access the `Messaging` client using the `messaging` namespace.
-
-#### Example
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here"})
-
-const messageClient = client.messaging;
-```
-
-This example demonstrates how to set up a messaging client using the SignalWire API.
-
----
-
-## **Methods**
-
-### listen
-
-- **listen**(`{ event: Callback }`): `Promise<MessageEvents>`
-
-Listens for message events.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="topics" type="string[]" required>
-  List of topics to listen to. Previously known as `contexts`.
-</ParamField>
-
-<ParamField path="EVENT" type="Callback">
-  The event to listen to. List of events can be found [here][events]. Example event: `onMessageReceived`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<MessageEvents>`
-
-A promise that resolves to a `MessageEvents` object that you can use to view the current state or results of the event.
-
-#### Example
-
-In this example, we listen for inbound messages on the topic `"office"` and log any received messages.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here"})
-
-await client.messaging.listen({
-  topics: ["office"],
-  async onMessageReceived(message) {
-    console.log("message.received", message);
-  }
-})
-```
-
----
-
-### send
-
-- **send**(`params`): `Promise<MessagingSendResult>`
-
-Send an outbound SMS or MMS message.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="from" type="string" required>
-  The phone number to place the message from. Must be a SignalWire phone number or short code that you own.
-</ParamField>
-
-<ParamField path="to" type="string" required>
-  The phone number to send to.
-</ParamField>
-
-<ParamField path="body" type="string">
-  The content of the message. Required if `media` is not present.
-</ParamField>
-
-<ParamField path="media" type="string[]">
-  Array of URLs to send in the message. Required if `body` is not present.
-</ParamField>
-
-<ParamField path="topic" type="string">
-  Inbound events for the message will be received on this topic. Previously known as `"context"`.
-</ParamField>
-
-<ParamField path="region" type="string">
-  Region of the world to originate the message from. A default value is picked based on account preferences or device location.
-</ParamField>
-
-<ParamField path="tags" type="string[]">
-  Array of strings to tag the message with for searching in the UI.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<MessagingSendResult>`
-
-A promise that resolves to a [`MessagingSendResult`][messagingsendresult] object that you can use to view the result of the sent message.
-
-#### Example
-
-In this example, we send an outbound message to a phone number with the content "Hello World!".
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here"})
-
-let messageClient = client.messaging;
-
-try {
-  const sendResult = await messageClient.send({
-    from: "+1xxx",
-    to: "+1yyy",
-    body: "Hello World!"
-  });
-  console.log("Message ID: ", sendResult.messageId);
-} catch (e) {
-  console.error(e.message);
-}
-```
-
----
-
-## **Events**
-
-### onMessageReceived
-
-- **client.messaging.listen**(`{onMessageReceived: Callback}`)
-
-Emitted whenever a message is received. Your event handler will be called with an instance of [`MessageContract`][messagecontract].
-
-#### Parameters
-
-<ParamField path="message" type="MessageContract" required>
-  The message that has been received. See [`MessageContract`][messagecontract].
-</ParamField>
-
-### onMessageUpdated
-
-- **client.messaging.listen**(`{onMessageUpdated: Callback}`)
-
-Emitted when the status of a message is updated. You can use this event to track the different stages that an outbound message goes through for delivery.
-Your event handler will be called with an instance of [`MessageContract`][messagecontract].
-
-#### Parameters
-
-<ParamField path="message" type="MessageContract" required>
-  The message that has been updated. See [`MessageContract`][messagecontract].
-</ParamField>
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/overview.mdx
similarity index 98%
rename from fern/products/realtime-sdk/pages/latest/tech-ref/messaging/index.mdx
rename to fern/products/realtime-sdk/pages/latest/tech-ref/messaging/overview.mdx
index 0bbf9ffd7..6eb4266d6 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/messaging/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 0723862c-3bc2-4575-8aca-885b4a160b1c
 title: "Messaging"
+sidebar-title: Overview
+position: 0
 slug: reference/messaging
 keywords: SignalWire, Realtime SDK, Node.js, messaging API, SMS, MMS
 description: Access the Messaging API to send and receive SMS and MMS messages programmatically. Handle inbound messages and track delivery status with events.
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/client/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/client/index.mdx
index b91f9f72e..4d61ed5c4 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/client/index.mdx
@@ -1,6 +1,7 @@
 ---
 id: b112159d-a862-44c4-9da4-934d684fdddc
 title: "PubSub Client"
+sidebar-title: Client
 slug: reference/pubsub/client
 description: PubSub Client reference for publishing and subscribing to messages.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/overview.mdx
similarity index 97%
rename from fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/index.mdx
rename to fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/overview.mdx
index 1a87943d5..41a24540d 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 30ed88d1-e508-4135-8eea-1095ebf92022
 title: "PubSub"
+sidebar-title: Overview
+position: 0
 keywords: SignalWire, Realtime SDK, Node.js, PubSub, publish subscribe, real-time events
 slug: reference/pubsub
 description: Access the PubSub API for publish-subscribe messaging patterns. Subscribe to channels, publish messages, and build real-time event-driven applications.
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/pubsub-client.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/pubsub-client.mdx
deleted file mode 100644
index 73f496e54..000000000
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/pubsub/pubsub-client.mdx
+++ /dev/null
@@ -1,167 +0,0 @@
----
-id: 4afffe2e-03ea-4be0-8f63-1c0ce4ada850
-title: "Client"
-keywords: SignalWire, Realtime SDK, Node.js, PubSub client, subscribe, publish
-slug: reference/pubsub/client
-description: PubSub Client reference for publish-subscribe messaging. Subscribe to channels, publish messages, and listen for real-time message events.
-max-toc-depth: 3
----
-
-[events]: #events
-[pubsub]: index.mdx
-[pubsubmessage]: ./pubsub-pubsubmessage.mdx
-[signalwire-realtime-client]: ../realtime-client/index.mdx
-
-A [PubSub][pubsub] client is used to listen for events on a channel and publish messages to a channel.
-
-## **PubSub Client**
-### Setting up a PubSub Client
-
-To create a `PubSub` client, you will first need to create a [`SignalWire Realtime-Client`][signalwire-realtime-client].
-After the `SignalWire Client` is created, you can access the `PubSub` client using the `pubSub` namespace.
-
-```js
-import { SignalWire} from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const pubSubClient = client.pubSub;
-```
-
----
-
-## **Methods**
-
-### listen
-
-- **listen**(`{ event: Callback }`): `Promise<PubSubEvents>`
-
-Listen for events on the specified channel.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="channels" type="string[]" required>
-  List of channels to listen to.
-</ParamField>
-
-<ParamField path="EVENT" type="Callback">
-  The event to listen to. List of events can be found [here][events]. Example event: `onMessageReceived`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<PubSubEvents>`
-
-A promise that resolves to a `PubSubEvents` object that you can use to view the current state or results of the event.
-
-#### Example
-
-```js
-import { SignalWire} from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const pubSubClient = client.pubSub;
-
-await pubSubClient.listen({
-  channels: ["my-channel"],
-  onMessageReceived: (message) => {
-    console.log(message);
-  }
-});
-```
-
-In this example:
- - Import the SignalWire module and initialize a new SignalWire client using your project ID and token.
- - Access the PubSub client from the initialized SignalWire client. 
- - Subscribe to the `my-channel` channel and set up a listener for incoming messages.
- - Log received messages to the console.
-
----
-
-### publish
-
-- **publish**(`params`): `Promise<void>`
-
-Publish a message into the specified channel.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="channel" type="string" required>
-  Channel in which to send the message.
-</ParamField>
-
-<ParamField path="content" type="any" required>
-  The message to send. This can be any JSON-serializable object.
-</ParamField>
-
-<ParamField path="meta" type="Record<any, any>">
-  Metadata associated with the message. There are no requirements on the content of metadata.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Examples
-
-Publishing a message as a string:
-
-```js
-import { SignalWire } from '@signalwire/realtime-api'
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const pubSubClient = client.pubSub;
-
-await pubSubClient.publish({
-  channel: "my-channel",
-  content: "Hello, world."
-});
-```
-
-Publishing a message as an object:
-
-```js
-import { SignalWire } from '@signalwire/realtime-api'
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const pubSubClient = client.pubSub;
-
-await pubSubClient.publish({
-  channel: "my-channel",
-  content: {
-    field_one: "value_one",
-    field_two: "value_two"
-  }
-});
-```
-
----
-
-## **Events**
-
-### onMessageReceived
-
-- **client.pubSub.listen**(`{ onMessageReceived: Callback }`)
-
-Emitted when a message is received on a channel. Your event handler will be called with an instance of [`PubSubMessage`][pubsubmessage].
-
-#### Parameters
-
-<ParamField path="message" type="PubSubMessage" required>
-  The message that has been received. See [`PubSubMessage`][pubsubmessage].
-</ParamField>
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/task/client/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/task/client/index.mdx
index 0c63b1ab8..0c41e51ba 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/task/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/task/client/index.mdx
@@ -1,6 +1,7 @@
 ---
 id: 817ae394-a31e-467d-88cc-d2a549cee8e4
 title: "Task Client"
+sidebar-title: Client
 slug: reference/task/client
 description: Task Client reference for task management.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/task/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/task/overview.mdx
similarity index 97%
rename from fern/products/realtime-sdk/pages/latest/tech-ref/task/index.mdx
rename to fern/products/realtime-sdk/pages/latest/tech-ref/task/overview.mdx
index b2e7c713c..50f2d9293 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/task/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/task/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: bd793b73-9e0c-4779-930b-9c1614ad3f84
 title: "Task"
+sidebar-title: Overview
+position: 0
 keywords: SignalWire, Realtime SDK, Node.js, task API, background jobs
 slug: reference/task
 description: Access the Task API for inter-application communication. Send and receive tasks between different applications using topics for routing.
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/task/task-client.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/task/task-client.mdx
deleted file mode 100644
index cc34f552b..000000000
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/task/task-client.mdx
+++ /dev/null
@@ -1,155 +0,0 @@
----
-id: 82881eb5-8d20-4240-a4ea-6b43f97534f8
-title: "Client"
-keywords: SignalWire, Realtime SDK, Node.js, task client, send task, receive task
-slug: reference/task/client
-description: Task Client reference for inter-application messaging. Send tasks to topics and receive task data from other applications in your project.
-max-toc-depth: 3
----
-
-[events]: #events
-[send]: #send
-[signalwire-realtime-client]: ../realtime-client/index.mdx
-[task-client]: ./task-client.mdx
-[task]: ./index.mdx
-
-A [Task][task] client. On your server, use instances of this client to receive data emitted with [Task.send][send].
-
-## **Task Client**
-
-### Setting up a Task Client
-
-To create a `Task` client, you will first need to create a [`SignalWire Realtime-Client`][signalwire-realtime-client].
-After the `SignalWire Client` is created, you can access the `Task` client using the `task` namespace.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here"})
-
-const taskClient = client.task
-```
-
----
-
-## **Methods**
-
-### listen
-
-- **listen**(`{ event: Callback }`): `Promise<TaskEvents>`
-
-Listens for incoming tasks.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="topics" type="string[]" required>
-  Topics to listen to for events. Previously known as `"contexts"`.
-</ParamField>
-
-<ParamField path="EVENT" type="Callback">
-  The event to listen to. List of events can be found [here][events]. Example event: `onTaskReceived`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<TaskEvents>`
-
-A promise that resolves to a `TaskEvents` object that you can use to view the current state or results of the event.
-
-#### Example
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here"})
-
-const taskClient = client.task
-
-await taskClient.listen({
-  topics: ['office'],
-  onTaskReceived: (payload) => {
-    console.log('Received task', payload)
-  }
-});
-```
-
----
-
-### send
-
-- `Const` **send**(`params`): `Promise<void>`
-
-Send a job to your Task Client in a specific topic.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="topic" type="string | string[]" required>
-  Topic to send the task to. Previously known as `"context"` or `"contexts"`. Can also use `params.topics`.
-</ParamField>
-
-<ParamField path="message" type="Record<string, unknown>" required>
-  Message to send.
-</ParamField>
-
-<ParamField path="project" type="string">
-  SignalWire project id, e.g. `a10d8a9f-2166-4e82-56ff-118bc3a4840f`.
-</ParamField>
-
-<ParamField path="token" type="string">
-  SignalWire project token, e.g. `PT9e5660c101...a360079c9`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-Sending a task with a message to then make an outbound Call. Please note that the call is _not_ performed automatically: your [Task.Client][task-client] gives you back your payload, which you should interpret by your own custom logic.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here"})
-
-const clientTask = client.task
-
-const message = {
-  'action': 'call',
-  'from': '+1XXXXXXXXXX',
-  'to': '+1YYYYYYYYYY'
-}
-
-const taskSend = await clientTask.send({
-  topic: 'office',
-  message: message
-})
-```
-
----
-
-## **Events**
-
-### onTaskReceived
-
-- **client.task.listen**(`{ onTaskReceived: Callback }`)
-
-Emitted whenever a task is received. Your event handler receives the payload.
-
-#### Parameters
-
-<ParamField path="payload" type="Record<string, unknown>" required>
-  The message payload.
-</ParamField>
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/video/client/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/video/client/index.mdx
index 42d0fd024..2ac9b81fe 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/video/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/video/client/index.mdx
@@ -1,6 +1,8 @@
 ---
 id: 9131614d-c6ad-497e-89f9-424ce1e66770
 title: "Video Client"
+sidebar-title: Client
+position: 1
 slug: reference/video/client
 description: Video Client reference for subscribing to video room events.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/video/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/video/overview.mdx
similarity index 99%
rename from fern/products/realtime-sdk/pages/latest/tech-ref/video/index.mdx
rename to fern/products/realtime-sdk/pages/latest/tech-ref/video/overview.mdx
index 162e948d6..df256a87f 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/video/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/video/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: e4880d7e-35cf-4a04-ba3b-f6c61bd4a13a
 title: "Video"
+sidebar-title: Overview
+position: 0
 keywords: SignalWire, Realtime SDK, Node.js, video API, video conferencing, video rooms
 slug: reference/video
 description: Access the Video API for building video conferencing applications. Manage room sessions, members, recordings, playback, and RTMP streaming.
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/video/video-roomsession.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/video/video-roomsession.mdx
deleted file mode 100644
index 1f3fb7958..000000000
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/video/video-roomsession.mdx
+++ /dev/null
@@ -1,3018 +0,0 @@
----
-id: 51cfc422-e15b-4ed1-bf17-bd6ee39a154f
-title: "RoomSession"
-keywords: SignalWire, Realtime SDK, Node.js, video room, room session, video conference
-slug: reference/video/room-session
-sidebar-title: RoomSession
-description: RoomSession reference for managing video room sessions. Control members, layouts, recordings, playback, and RTMP streams within a video room.
-max-toc-depth: 3
----
-
-[link-1]: #field-meta
-[link-2]: #events
-[link-3]: #demote
-[link-4]: #videopositions
-[link-5]: #setmembermeta
-[link-6]: #setmeta
-[link]: #promote
-[permissions]: /rest/signalwire-rest/overview/permissions/
-[record-type]: https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type
-[roomsession-41]: ./video-roomsession.mdx
-[roomsessionmember-27]: ./video-roomsessionmember.mdx
-[roomsessionmember-28]: ./video-roomsessionmember.mdx
-[roomsessionmember-29]: ./video-roomsessionmember.mdx
-[roomsessionmembers]: ./video-roomsessionmember.mdx
-[roomsessionplayback-12]: ./video-roomsessionplayback.mdx
-[roomsessionplayback-4]: ./video-roomsessionplayback.mdx
-[roomsessionrecording-12]: ./video-roomsessionrecording.mdx
-[roomsessionrecording-4]: ./video-roomsessionrecording.mdx
-[roomsessionstream-8]: ./video-roomsessionstream.mdx
-[roomsessionstream]: ./video-roomsessionstream.mdx
-[video-client]: ./client/index.mdx
-[video-roomsession-1]: ./video-roomsession.mdx#audiounmute
-[video-roomsession-2]: ./video-roomsession.mdx#setlayout
-[video-roomsession-3]: ./video-roomsession.mdx#videomute
-[video-roomsession-4]: ./video-roomsession.mdx#getlayouts
-[video-roomsession-5]: ./video-roomsession.mdx#audiomute
-[video-roomsession]: ./video-roomsession.mdx#sethidevideomuted
-[video-roomsessionmember]: ./video-roomsessionmember.mdx#field-meta
-[video-roomsessionplayback]: ./video-roomsessionplayback.mdx#events
-[video-roomsessionrecording]: ./video-roomsessionrecording.mdx#events
-[video-roomsessionstream]: ./video-roomsessionstream.mdx#events
-[videoposition]: /video/guides/layout-positions
-
-Represents a room session.You can obtain instances of this class by subscribing to the appropriate events from [Video.Client][video-client].
-
-#### Example
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const videoClient = client.video;
-
-await videoClient.listen({
-  onRoomStarted: (roomsession) => {
-    console.log(roomsession);
-  }
-})
-```
-
----
-
-## **Properties**
-
-<ParamField path="displayName" type="string">
-  Display name for this room. Defaults to the value of `name`.
-</ParamField>
-
-<ParamField path="hideVideoMuted" type="boolean">
-  Whether muted videos are shown in the room layout. See [setHideVideoMuted][video-roomsession].
-</ParamField>
-
-<ParamField path="id" type="string">
-  Unique id for this room session.
-</ParamField>
-
-<ParamField path="layoutName" type="string">
-  Current layout name used in the room.
-</ParamField>
-
-<ParamField path="meta" type="Record<string, unknown>">
-  Metadata associated to this room session.
-</ParamField>
-
-<ParamField path="name" type="string">
-  Name of this room.
-</ParamField>
-
-<ParamField path="previewUrl" type="string" optional>
-  URL to the room preview.
-</ParamField>
-
-<ParamField path="roomId" type="string">
-  ID of the room associated to this room session.
-</ParamField>
-
-<ParamField path="recording" type="boolean">
-  Whether the room is currently being recorded.
-</ParamField>
-
-<ParamField path="streaming" type="boolean">
-  Whether the room is currently being streamed.
-</ParamField>
-
-<ParamField path="locked" type="boolean">
-  Whether the room is currently locked.
-</ParamField>
-
-<ParamField path="prioritizeHandraise" type="boolean">
-  Whether raised hands are prioritized in the layout.
-</ParamField>
-
-<ParamField path="updated" type="string[]">
-  Array of property names that were updated. Only present in event payloads.
-</ParamField>
-
-## **Methods**
-
-### audioMute
-
-- **audioMute**(`params`): `Promise<void>`
-
-Mutes the audio of a given member for all other participants.
-
-#### Parameters
-
-<ParamField path="params" type="object">
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to mute.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we mute the audio of a member as soon as they join the room.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-    await roomSession.listen({
-      // Listen for when a member joins the room
-      onMemberJoined: async (member) => {
-        // Mute member's audio
-        console.log(`Muting ${member.id}'s audio`);
-        await roomSession.audioMute({ memberId: member.id });
-      }
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### audioUnmute
-
-- **audioUnmute**(`params`): `Promise<void>`
-
-Unmutes the microphone of a given member if it had been previously muted.
-
-#### Parameters
-
-<ParamField path="params" type="object">
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to unmute.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we mute the audio of a member as soon as they join the room.
-After 5 seconds, we unmute the member's audio.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-    await roomSession.listen({
-      // Listen for when a member joins the room
-      onMemberJoined: async (member) => {
-        // Mute member's audio
-        console.log(`Muting ${member.id}'s audio`);
-        await roomSession.audioMute({ memberId: member.id });
-        // Unmute member's audio after 5 seconds
-        setTimeout(() => {
-          console.log(`Unmuting ${member.id}'s audio`);
-          roomSession.audioUnmute({ memberId: member.id });
-        }, 5000);
-      }
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### deaf
-
-- **deaf**(`params`): `Promise<void>`
-
-Mutes the incoming audio for a given member. The affected participant will not hear audio from the other participants anymore.
-
-Note that in addition to making a participant deaf, this will also automatically mute the microphone of the target participant. If you want, you can then manually unmute it by calling [audioUnmute][video-roomsession-1].
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to affect.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-    await roomSession.listen({
-      // Listen for when a member joins the room
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-        // Deafen the member
-        console.log("Deafing member", member.name);
-        await roomSession.deaf({ memberId: member.id });
-      }
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### deleteMemberMeta
-
-- **deleteMemberMeta**(`params`): `Promise<void>`
-
-Deletes the specified keys from the metadata for the specified member.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to affect. If omitted, affects the default device in the local client.
-</ParamField>
-
-<ParamField path="keys" type="string[]" required>
-  The keys to remove.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we set metadata for a member as soon as they join the room.
-After 5 seconds, we remove the metadata for that member. Once the member's metadata is set or removed,
-we log the metadata for that member with the `onMemberUpdated` event.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-    await roomSession.listen({
-      // Listen for when a member joins the room
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-
-        // set metadata for the member
-        console.log("Setting metadata for member", member.name);
-        await roomSession.setMemberMeta({
-          memberId: member.id,
-          meta: {
-            name: member.name,
-            foo: "red"
-          }
-        })
-
-        // remove metadata for the member in 5 seconds
-        setTimeout(async () => {
-          console.log("Removing metadata for member", member.name);
-          await roomSession.deleteMemberMeta({
-            memberId: member.id,
-            keys: ["foo"]
-          })
-        }, 5000)
-      },
-      onMemberUpdated: async (member) => {
-        // Listen for when a member updates their metadata
-        console.log("Member updated", member.name);
-        console.log(`Meta data for ${member.name}\n ${JSON.stringify( member.meta, null, 2)}`)
-      },
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### deleteMeta
-
-- **deleteMeta**(`keys`): `Promise<void>`
-
-Deletes the specified keys from the metadata for this RoomSession.
-
-#### Parameters
-
-<ParamField path="keys" type="string[]" required>
-  The keys to remove.
-</ParamField>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we set metadata for a room as soon as it starts.
-After 5 seconds, we remove the metadata for that room. Once the room's metadata is set or removed,
-we log the metadata for that room. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-    await roomSession.setMeta({
-      "foo": "bar",
-      "roomName": roomSession.displayName
-    });
-    let roomMeta = await roomSession.getMeta()
-    console.log("Room meta", roomMeta);
-
-    // delete room meta after 5 seconds
-
-    setTimeout(async () => {
-      console.log("Deleting room meta");
-      await roomSession.deleteMeta(["foo"]);
-      roomMeta = await roomSession.getMeta()
-      console.log("Room meta", roomMeta);
-    }, 5000);
-
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### demote
-
-- **demote**(`params`): `Promise<void>`
-
-Demotes a participant from "member" to "audience". See [promote][link].
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string" required>
-  ID of the member to affect.
-</ParamField>
-
-<ParamField path="mediaAllowed" type='"all" | "audio-only" | "video-only"'>
-  Specifies the media that the client will be allowed to **receive**. An audience participant cannot send any media.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we demote a member to audience as soon as they join the room.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-    await roomsession.listen({
-      // Listen for when a member is updated
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-        // Demote member to audience
-        console.log(`Demoting ${member.name} to audience`);
-        roomsession.demote({
-          memberId: member.id,
-          mediaAllowed: "audio-only"
-        });
-      }
-    });
-  }
-})
-```
-
----
-
-### getLayouts
-
-- **getLayouts**(): `Promise<\{ layouts: string[] \}>`
-
-Returns a list of available layouts for the room. To set a room layout, use [`setLayout`][video-roomsession-2].
-
-#### Returns
-
-`Promise<\{ layouts: string[] \}>`
-
-A promise that resolves to an object containing the list of available layouts for the room.
-
-#### Example
-
-In this example, we wait for a room to start and then get the available layouts for that room.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-    const layouts = await roomsession.getLayouts();
-    console.log("Layouts", layouts.layouts);
-  }
-})
-```
-
----
-
-### getMembers
-
-- **getMembers**(): `Promise`\<\{ `members:` [`RoomSessionMember[]`](./video-roomsessionmember.mdx) }>
-
-Returns a list of members currently in the room.
-
-#### Returns
-
-`Promise`\<\{ `members:` [`RoomSessionMemberEntity[]`](./video-roomsessionmember.mdx) }>
-
-A promise that resolves to an object containing the list of [`RoomSessionMembers`][roomsessionmembers] in the room.
-
-#### Example
-
-In this example, we wait for a room to start and then get the members in that room.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-    // get all members in the room
-    const members = await roomsession.getMembers();
-
-    // log the members names
-    members.members.forEach((member) => console.log(member.name));
-  }
-})
-```
-
----
-
-### getMemberMeta
-
-- **getMemberMeta**(): `Promise`\<\{ `meta:` [`RoomSessionMember.meta`][video-roomsessionmember] }>
-
-Returns the metadata assigned to the specified member.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member for which to obtain the metadata.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<\{ `meta:` [`RoomSessionMember.meta`][video-roomsessionmember] }>
-
-A promise that resolves to an object containing the metadata assigned to the specified [`RoomSessionMember`][roomsessionmember-28].
-
-#### Example
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-
-    roomsession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-        // set metadta for the member
-        await roomsession.setMemberMeta({
-          memberId: member.id,
-          meta: {
-            name: member.name,
-            foo: "bar"
-          }
-        });
-        // get member meta
-        const memberMeta = await roomsession.getMemberMeta({
-          memberId: member.id
-        });
-        console.log("Member meta", memberMeta.meta);
-      }
-    })
-  }
-})
-```
-
----
-
-### getMeta
-
-- **getMeta**(): `Promise`\<\{ `meta:` [`RoomSession.meta`][link-1]  }>
-
-Returns the metadata assigned to this Room Session.
-
-#### Returns
-
-`Promise`\<\{ `meta:` [`RoomSession.meta`][link-1]  }>
-
-A promise that resolves to a [`RoomSession.meta`][link-1] object containing the metadata assigned to this Room Session.
-
-#### Example
-
-In this example, we set metadata for a room as soon as it starts.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    // Set the room meta
-    console.log("Setting room meta");
-    await roomSession.setMeta({
-      "foo": "bar",
-      "roomName": roomSession.displayName
-    });
-
-    // Get the room meta
-    let roomMeta = await roomSession.getMeta()
-    console.log("Room meta", roomMeta);
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### getPlaybacks
-
-- **getPlaybacks**(): `Promise`\<\{ `playbacks:` [`RoomSessionPlayback`][roomsessionplayback-12] }>
-
-Obtains a list of playbacks for the current room session.
-
-#### Returns
-
-`Promise`\<\{ `playbacks:` [`RoomSessionPlayback`][roomsessionplayback-12] }>
-
-A promise that resolves to an object containing the list of [`RoomSessionPlayback`][roomsessionplayback-12] objects.
-
-#### Example
-
-In this example, we wait for a room to start and then start a playback in that room.
-When a second member joins the roomSession, we use `getPlaybacks` to get the
-list of playback objects. We then loop through the list of playbacks and print
-out the `state`, `url`, and `id` of each playback. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    // play wait music
-    await roomSession.play({
-      url: "https://cdn.signalwire.com/default-music/welcome.mp3",
-      listen: {
-        onStarted: () => console.log("Playback started"),
-        onUpdated: (playback) => console.log("Playback updated", playback.state),
-        onEnded: () => console.log("Playback ended")
-      }
-    }).onStarted();
-
-    // Setup listener for when a member joins
-    await roomSession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);        
-        
-        // get roomSessions playbacks
-        let roomPlaybacks = await roomSession.getPlaybacks();
-
-        // loop through playbacks and print out state, url, and id
-        roomPlaybacks.playbacks.forEach((playback) => {
-          console.log(playback.state, playback.url, playback.id);
-      });
-    },
-      onMemberLeft: (member) => {
-        console.log("Member left", member.name);
-      },
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### getRecordings
-
-- **getRecordings**(): `Promise`\<\{ `recordings:` [`RoomSessionRecording`][roomsessionrecording-12] }>
-
-Obtains a list of recordings for the current room session.
-
-#### Returns
-
-`Promise`\<\{ `recordings:` [`RoomSessionRecording`][roomsessionrecording-12] }>
-
-A promise that resolves to an object containing the list of [`RoomSessionRecording`][roomsessionrecording-12] objects.
-
-#### Example
-
-In this example, we wait for a room to start and then start a recording in that room.
-After 5 seconds, we then use `getRecordings` to get the list of recording objects.
-We then loop through the list of recordings and print out the `state` and `id` of each recording.
-Afterwards, we stop the recording. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    let roomRecording = roomSession.startRecording({
-      listen: {
-        onStarted: () => {
-          console.log("Recording started");
-        },
-        onUpdated: (recording) => {
-          console.log("Recording updated", recording.state);
-        },
-        onEnded: (recording) => {
-          console.log(`Recording ended.
-          Recording State: ${recording.state}.
-          Recording Id: ${recording.id}`);
-
-        },
-      }
-    })
-    setTimeout( async () => {
-      // Get the roomSession recordings
-      let rooomRecordings = await roomSession.getRecordings();
-      rooomRecordings.recordings.forEach(recording => {
-        console.log("Active Recording", recording.id, recording.state);
-      });
-
-      // Stop recording after 5 seconds
-      roomRecording.stop();
-    }, 5000);
-
-    // Setup listener for when a member joins
-    await roomSession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-
-    },
-      onMemberLeft: (member) => {
-        console.log("Member left", member.name);
-      },
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### getStreams
-
-- **getStreams**(): `Promise<\{ streams: RoomSessionStream \}>`
-
-Obtains a list of active streams for this RoomSession. These are RTMP streams of
-the audio/video content of this room, which will be sent to an external party
-(e.g., to YouTube).
-
-#### Returns
-
-`Promise<\{ streams: RoomSessionStream \}>` - See [RoomSessionStream][roomsessionstream] for more information.
-
-#### Example
-
-In this example, we wait for a room to start and then start a stream in that room.
-We then use `getStreams` to get the list of stream objects. We then loop through
-the list of streams and print out the `state` and `id` of each stream.
-Afterwards, we stop the stream after 10 seconds. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    roomSession.startStream({
-      url: "rtmp://example.com/stream"
-    })
-    
-    await roomSession.listen({
-      onStreamStarted: async (stream) => {
-        console.log("Stream started", stream.state);
-
-        // get active streams
-        const activeStreams = roomSession.getStreams();
-
-        (await activeStreams).streams.forEach((stream) => {
-          console.log(`Active Steam: ${stream.id}, ${stream.state}`);
-        });
-
-        // Wait 10 seconds and stop the stream
-
-        setTimeout(() => {
-          console.log("Stopping stream");
-          stream.stop();
-        }, 10000);
-      },
-      onStreamEnded: (stream) => {
-        console.log("Stream ended", stream.id, stream.state);
-      },
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### listen
-
-- **listen**(`{ event: Callback }`): `Promise`\<[`RoomSession Events`][link-2]>
-
-Enables listening for events on this room session.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="topics" type="object[]">
-  List of topics to listen to.
-</ParamField>
-
-<ParamField path="EVENT" type="Callback" required>
-  The event to listen to. List of events can be found [here][link-2]. Example event: `onRoomStarted`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`RoomSession Events`][link-2]>
-
-Emits events for the specified event. See [RoomSession Events][link-2] for a list of valid events and their return types.
-
-#### Example
-
-In this example, we wait for a room ton start and then log the room's name. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-    onRoomStarted: async (roomsession) => {
-        console.log("Room Started", roomsession.displayName);
-    }
-  }
-);
-```
----
-
-### lock
-
-- **lock**(`params`): `Promise<void>`
-
-Locks the room. This prevents new participants from joining the room.
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then lock the room. This prevents
-new participants from joining the room. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-      // Lock the room
-      console.log('Locking room');
-      await roomsession.lock();
-  }
-})
-```
----
-
-### play
-
-- **play**(`params`): `Promise`\<[`RoomSessionPlayback`][roomsessionplayback-12]>
-
-Start a playback in the room. You can use the returned [RoomSessionPlayback][roomsessionplayback-4]
-object to control the playback (e.g., pause, resume, setVolume and stop).
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="url" type="string" required>
-  The url (http, https, rtmp, rtmps) of the stream to reproduce.
-</ParamField>
-
-<ParamField path="seekPosition" type="number" default="0">
-  The starting timecode in milliseconds for playback.
-</ParamField>
-
-<ParamField path="volume" type="number" default="0">
-  The playback volume from -50 to 50.
-</ParamField>
-
-<ParamField path="positions" type="VideoPositions">
-  Positions to assign as soon as the playback starts. You can use the special keyword `self` to refer to the id of the playback.
-</ParamField>
-
-<ParamField path="layout" type="string">
-  Layout to change to when the playback starts.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Object of event listeners. See [RoomSessionPlayback Events][video-roomsessionplayback] for a list of valid events. Example event: `onStarted`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`RoomSessionPlayback`][roomsessionplayback-12]>
-
-A promise that resolves to a [`RoomSessionPlayback`][roomsessionplayback-12] object.
-
-#### Example
-
-In this example, we wait for a room to start and then play a video in that room.
-When a second member joins the roomSession, we stop the playback.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    // play wait music
-    let roomPlayback = roomSession.play({
-      url: "https://cdn.signalwire.com/default-music/welcome.mp3",
-      listen: {
-        onStarted: () => console.log("Playback started"),
-        onUpdated: (playback) => console.log("Playback updated", playback.state),
-        onEnded: () => console.log("Playback ended")
-      }
-    });
-    await roomSession.listen({
-      onMemberJoined: (member) => {
-        console.log("Member joined", member.name);
-        roomPlayback.stop();
-      },
-      onMemberLeft: (member) => {
-        console.log("Member left", member.name);
-      },
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### promote
-
-- **promote**(`params`): `Promise<void>`
-
-Promotes a participant from "audience" to "member". See [demote][link-3].
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string" required>
-  ID of the audience participant to promote.
-</ParamField>
-
-<ParamField path="joinAudioMuted" type="boolean">
-  Force the member's audio to be muted right after the promotion.
-</ParamField>
-
-<ParamField path="joinVideoMuted" type="boolean">
-  Force the member's video to be muted right after the promotion.
-</ParamField>
-
-<ParamField path="mediaAllowed" type='"all" | "audio-only" | "video-only"'>
-  Specifies the media that the client will be allowed to **send**. A member participant can always receive all media.
-</ParamField>
-
-<ParamField path="meta" type="Record<string, unknown>">
-  Metadata to assign to the member.
-</ParamField>
-
-<ParamField path="permissions" type="string[]">
-  List of [permissions][permissions] to grant when the Audience participant will become a Member.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we demote a member to audience as soon as they join the room.
-After 10 seconds, we promote the member back to a roomSession member.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-    await roomsession.listen({
-      // Listen for when a member is updated
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.id, member.name);
-        // Demote member to audience
-        console.log(`Demoting ${member.id} to audience`);
-        await roomsession.demote({
-          memberId: member.id,
-          mediaAllowed: "audio-only"
-        });
-        // wait 10 seconds then promote the member back to a roomSession member
-        setTimeout(async () => {
-          // Promote the audience participant to a member
-          console.log(`Promoting ${member.name} to member`);
-          await roomsession.promote({
-            memberId: member.id,
-            mediaAllowed: "all",
-            joinAudioMuted: true,
-            joinVideoMuted: false,
-            permissions: [
-              "room.self.audio_mute",
-              "room.self.audio_unmute",
-              "room.self.video_mute",
-              "room.self.video_unmute",
-              "room.list_available_layouts",
-            ]
-          });
-        }, 10000);
-      }
-    });
-  }
-})
-```
-
----
-
-### removeAllMembers
-
-- **removeAllMembers**(): `Promise<void>`
-
-Removes all the members from this room session. The room session will end.
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then remove all the members from that room
-after 5 seconds. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-
-    // Remove all members from the room after 5 seconds
-    setTimeout(async () => {
-      console.log("Removing all members from room");
-      await roomsession.removeAllMembers();
-    }, 5000);
-  }
-})
-```
-
----
-
-### removeMember
-
-- **removeMember**(`params`): `Promise<void>`
-
-Removes a specific participant from the room.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string" required>
-  ID of the member to remove.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then remove the second member
-that joins the room after 5 seconds. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-
-    // listen for when new participants join the room
-    roomsession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-
-        // remove the member from the room after 5 seconds
-
-        setTimeout(async () => {
-          console.log("Removing member", member.name);
-          roomsession.removeMember({
-            memberId: member.id,
-          });
-        }, 5000);
-      },
-    });
-  }
-});
-```
-
----
-
-### setHideVideoMuted
-
-- **setHideVideoMuted**(`value`): `Promise<void>`
-
-Show or hide muted videos in the room layout. Members that have been muted via [`videoMute`][video-roomsession-3] will not appear in the video stream, instead of appearing as a mute image, if this setting is enabled.
-
-Muted videos are shown by default.
-
-#### Parameters
-
-<ParamField path="value" type="boolean" required>
-  Whether to hide muted videos in the room layout.
-</ParamField>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then hide muted videos in the room layout.
-If you mute your video, you will not appear in the video stream, instead of appearing as a mute image.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-
-    // Setup listener for when a room is updated
-    roomsession.listen({
-      onRoomUpdated: async (roomsession) => {
-        console.log(`Updated room ${roomsession.displayName} to hide muted videos!`);
-      }
-    });
-      // Hide muted videos in the room layout
-      roomsession.setHideVideoMuted(true);
-    }
-})
-```
-
----
-
-### setInputSensitivity
-
-- **setInputSensitivity**(`params`): `Promise<void>`
-
-Sets the input level at which the participant is identified as currently speaking.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to affect.
-</ParamField>
-
-<ParamField path="value" type="number" required default="30">
-  Desired sensitivity from 0 (lowest sensitivity, essentially muted) to 100 (highest sensitivity).
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then set the input sensitivity for a member to 0.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-
-    // Setup listener for when a room is updated
-    roomsession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-
-        // Update the input sensitivity for the member
-        await roomsession.setInputSensitivity({
-          value: 0,
-          memberId: member.id,
-        });
-      },
-      onMemberUpdated: async (member) => {
-        console.log(`Updated input sensitivity for ${member.name, member.inputSensitivity}`);
-      },
-    })
-  }
-});
-```
-
----
-
-### setInputVolume
-
-- **setInputVolume**(`params`): `Promise<void>`
-
-Sets the input volume for a given member (e.g., the microphone input level).
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to affect.
-</ParamField>
-
-<ParamField path="volume" type="number" required default="0">
-  Desired volume. Values range from -50 to 50.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a second member to join the room and then set the input volume for that member to -50.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-
-    // Setup listener for when a room is updated
-    roomsession.listen({
-      onMemberJoined: (member) => {
-        console.log("Member joined", member.name);
-
-        // Update the input sensitivity for the member
-        roomsession.setInputVolume({
-          volume: -50,
-          memberId: member.id,
-        });
-      },
-      onMemberUpdated: (member) => {
-        console.log(`Updated input volume for ${member.name, member.inputVolume}`);
-      },
-    })
-  }
-});
-```
-
----
-
-### setLayout
-
-- **setLayout**(`params`): `Promise<void>`
-
-Sets a layout for the room. You can obtain a list of available layouts with [`getLayouts`][video-roomsession-4].
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="name" type="string" required>
-  Name of the layout.
-</ParamField>
-
-<ParamField path="positions" type="VideoPositions">
-  Positions to assign as soon as the new layout is set. See [`VideoPositions`][link-4].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then set the layout for that room to `"6x6"`.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-    // Set the 6x6 layout
-    roomsession.setLayout({
-      name: "6x6",
-      positions: {
-        self: 'auto'
-      }
-    });
-    roomsession.listen({
-      onRoomUpdated: (roomsession) => {
-        console.log("Room layout updated", roomsession.layoutName);
-      },
-    })
-  }
-});
-```
-
----
-
-### setMemberMeta
-
-- **setMemberMeta**(`params`): `Promise<void>`
-
-Assigns custom metadata to the specified [`RoomSessionMember`][roomsessionmember-28]. You can use this to store metadata whose meaning is entirely defined by your application.
-
-Note that calling this method overwrites any metadata that had been previously set on the specified member.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to affect.
-</ParamField>
-
-<ParamField path="meta" type="Record<string, unknown>" required>
-  The metadata object to assign to the member.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we set metadata for a member as soon as they join the room.
-Once the member's metadata is set, we log the metadata for that member with
-the `onMemberUpdated` event.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-
-    roomsession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-        // set metadta for the member
-        await roomsession.setMemberMeta({
-          memberId: member.id,
-          meta: {
-            name: member.name,
-            foo: "bar",
-          },
-        });
-        // get member meta
-        const memberMeta = await roomsession.getMemberMeta({
-          memberId: member.id
-        });
-        console.log("Member meta", memberMeta.meta);
-      },
-    })
-  }
-})
-```
-
----
-
-### setMemberPosition
-
-- **setMemberPosition**(`params`): `Promise<void>`
-
-Assigns a position in the layout to the specified member.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to affect.
-</ParamField>
-
-<ParamField path="position" type="VideoPosition" required>
-  Position to assign in the layout.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then set the roomlayout to `"6x6"`.
-When a second member joins the room, we set the position of that member to `"off-canvas"`.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-
-    // Set the layout of the room
-    roomsession.setLayout({
-      name: "6x6",
-    });
-
-    // listens for when a member joins the room
-    await roomsession.listen({
-
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-        // Set position for the member
-        roomsession.setMemberPosition({
-          memberId: member.id,
-          position: "off-canvas"
-        });
-      },
-      onMemberUpdated: async (member) => {
-        console.log(`Updated ${member.name} position`);
-      },
-
-      onRoomUpdated: async (room) => {
-        console.log(`Room updated to ${room.layoutName}`);
-      },
-    });
-  }
-})
-```
-
----
-
-### setMeta
-
-- **setMeta**(`meta`): `Promise<void>`
-
-Assigns custom metadata to the RoomSession. You can use this to store metadata whose meaning is entirely defined by your application.
-
-Note that calling this method overwrites any metadata that had been previously set on this RoomSession.
-
-#### Parameters
-
-<ParamField path="meta" type="Record<string, unknown>" required>
-  The metadata object to assign to the RoomSession.
-</ParamField>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we set metadata for a room as soon as it starts and then
-log the metadata for that room. This example assumes that there is a
-[`RoomSession`][roomsession-41] already active and
-that members are joining the room.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access the video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    // Set the room meta
-    console.log("Setting room meta");
-    await roomSession.setMeta({
-      "foo": "bar",
-      "roomName": roomSession.displayName
-    });
-
-    // Get the room meta
-    let roomMeta = await roomSession.getMeta()
-    console.log("Room meta", roomMeta);
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### setOutputVolume
-
-- **setOutputVolume**(`params`): `Promise<void>`
-
-Sets the output volume for the member (e.g., the speaker output level).
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to affect.
-</ParamField>
-
-<ParamField path="volume" type="number" required default="0">
-  Desired volume. Values range from -50 to 50.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then wait for a member to join the room.
-When a member joins the room, we set the output volume for that member to -50.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-
-    console.log("Room started", roomsession.displayName);
-
-    roomsession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.displayName);
-         // set output volume to -50dB
-         console.log("Setting output volume to -50dB for", member.name);
-        await roomsession.setOutputVolume({
-          volume: -50,
-          memberId: member.id
-        });
-      },
-      onMemberUpdated: async (member) => {
-        console.log(`${member.name} output volume is now ${member.outputVolume}`);
-      },
-    })
-  }
-});
-```
-
----
-
-### setPositions
-
-- **setPositions**(`params`): `Promise<void>`
-
-Assigns a position in the layout for multiple members.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="positions" type="VideoPositions" required>
-  Mapping of member IDs and positions to assign. See [`VideoPositions`][link-4].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then set the `roomlayout` to `"6x6"`.
-When a second member joins the room, we set the position of all older members to `"off-canvas"`.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-    // Set the 6x6 layout
-    roomsession.setLayout({
-      name: "6x6",
-      positions: {
-        self: 'auto'
-      }
-    });
-    roomsession.listen({
-      onRoomUpdated: (roomsession) => {
-        console.log("Room layout updated", roomsession.layoutName);
-      },
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-
-        // Get all members and loop through them ans save all old members to an array
-        const members = await roomsession.getMembers();
-
-        // Create an object to hold all member positions
-        const positions = {
-          ...members.members
-            .filter(memberItem => memberItem.id !== member.id) // Filter out the member with member.id
-            .reduce((acc, memberItem) => {
-              acc[memberItem.id] = 'off-canvas';
-              return acc;
-            }, {})
-        };
-
-        console.log("Updating member positions...")
-        // Update all old members positions to off canvas and the new member to be automatically positioned
-
-        await roomsession.setPositions({
-          positions: positions
-        });
-      },
-      onMemberUpdated: (member) => {
-        console.log(`Member ${member.name} updated`);
-      }
-    })
-  }
-});
-```
-
----
-
-### setPrioritizeHandraise
-
-- **setPrioritizeHandraise**(`param`): `Promise<boolean>`
-
-Set whether to prioritize hand-raise or not. Users with raised hands will be shown in the main video area over other participants who don't have their hand raised.
-
-#### Parameters
-
-<ParamField path="param" type="boolean" required default="true">
-  Whether to prioritize participants on the canvas with their hand-raised. If omitted, the hand status is toggled to the opposite of the current status.
-</ParamField>
-
-#### Returns
-
-`Promise<boolean>`
-
-#### Example
-
-In this example, we wait for a room to start and then set the room to prioritize hand-raise.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    // Set the room to prioritize hand-raise
-    await roomSession.setPrioritizeHandraise(true);
-  }
-});
-```
-
----
-
-### setRaisedHand
-
-- **setRaisedHand**(`params`): `Promise<void>`
-
-Sets the raised hand status for the current member.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string" required>
-  ID of the member to affect.
-</ParamField>
-
-<ParamField path="raised" type="boolean" default="true">
-  Whether to raise or lower the hand. If omitted, the hand status is toggled to the opposite of the current status.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a member to join the room and then set the raised hand status for that member to `true`.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    // Setup listener for when a member joins the room
-    await roomSession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-
-        // Set the raised hand status for the member
-        await roomSession.setRaisedHand({
-          memberId: member.id,
-          raised: true
-        });
-      }
-    });
-  }
-});
-```
-
----
-
-### startRecording
-
-- **startRecording**(): `Promise`\<[`RoomSessionRecording`][roomsessionrecording-12]>
-
-Starts the recording of the room. You can use the returned [RoomSessionRecording][roomsessionrecording-4] object to control the recording (e.g., pause, resume, stop).
-
-#### Parameters
-
-<ParamField path="params" type="object">
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="listen" type="object">
-  Object of event listeners. See [`RoomSessionRecording Events`][video-roomsessionrecording] for a list of valid events.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`RoomSessionRecording`][roomsessionrecording-12]>
-
-A promise that resolves to a [`RoomSessionRecording`][roomsessionrecording-12] object.
-
-#### Example
-
-In this example, we wait for a room to start and then start a recording in that room.
-We then stop the recording after 5 seconds. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    let roomRecording = roomSession.startRecording({
-      listen: {
-        onStarted: () => {
-          console.log("Recording started");
-        },
-        onUpdated: (recording) => {
-          console.log("Recording updated", recording.state);
-        },
-        onEnded: (recording) => {
-          console.log(`Recording ended.
-          Recording State: ${recording.state}.
-          Recording Id: ${recording.id}`);
-        },
-      }
-    })
-    setTimeout( () => {
-      roomRecording.stop();
-    }, 5000);
-
-    // Setup listener for when a member joins
-    await roomSession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-
-    },
-      onMemberLeft: (member) => {
-        console.log("Member left", member.name);
-      },
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### startStream
-
-- **startStream**(): `Promise`\<[`RoomSessionStream`][roomsessionstream-8]>
-
-Starts streaming the audio/video of this room to an external service. You can
-use the returned [`RoomSessionStream`][roomsessionstream-8] object to
-interact with the stream.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="url" type="string" required>
-  RTMP or RTMPS url. This must be the address of a server accepting incoming RTMP/RTMPS streams.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Object of event listeners. See [RoomSessionStream Events][video-roomsessionstream] for a list of valid events.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`RoomSessionStream`][roomsessionstream-8]>
-
-A promise that resolves to a [`RoomSessionStream`][roomsessionstream-8] object.
-
-#### Example
-
-In this example, we wait for a room to start and then start a stream in that room.
-We then stop the stream after 10 seconds. This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    roomSession.startStream({
-      url: "rtmp://example.com/stream"
-    })
-    
-    await roomSession.listen({
-      onStreamStarted: async (stream) => {
-        console.log("Stream started", stream.state);
-
-        // Wait 10 seconds and stop the stream
-        setTimeout(() => {
-          console.log("Stopping stream");
-          stream.stop();
-        }, 10000);
-      },
-      onStreamEnded: (stream) => {
-        console.log("Stream ended", stream.id, stream.state);
-      },
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### undeaf
-
-- **undeaf**(`params`): `Promise<void>`
-
-Unmutes the incoming audio for a given member. The affected participant will start hearing audio from the other participants again.
-
-Note that in addition to allowing a participants to hear the others, this will also automatically unmute the microphone of the target participant. If you want, you can then manually mute it by calling [audioMute][video-roomsession-5].
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to affect.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we mute a member when they join the room, and then unmute them after 5 seconds.
-This example assumes that there is a [`RoomSession`][roomsession-41] already active and users are joining it.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-    await roomSession.listen({
-      // Listen for when a member joins the room
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-        // Deafen the member
-        console.log("Deafing member", member.name);
-        await roomSession.deaf({ memberId: member.id });
-
-        // Undeafen the member after 5 seconds
-        setTimeout(async () => {
-          console.log("Undeafing member", member.name);
-          await roomSession.undeaf({ memberId: member.id });
-        }, 5000);
-      }
-    });
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
----
-
-### updateMemberMeta
-
-- **updateMemberMeta**(`params`): `Promise<void>`
-
-Updates a member's metadata in only the specified fields. This is different from
-[setMemberMeta][link-5], which replaces the whole metadata object.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to affect. If omitted, affects the current member.
-</ParamField>
-
-<ParamField path="meta" type="Record<string, unknown>" required>
-  The update to the metadata.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we set metadata for a member as soon as they join the room.
-After 5 seconds, we update the metadata for that member.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-    console.log("Room started", roomsession.displayName);
-
-    roomsession.listen({
-      onMemberJoined: async (member) => {
-        console.log("Member joined", member.name);
-        // set metadta for the member
-        await roomsession.setMemberMeta({
-          memberId: member.id,
-          meta: {
-            name: member.name,
-            foo: "bar",
-          },
-        });
-        // get member meta
-        const memberMeta = await roomsession.getMemberMeta({
-          memberId: member.id
-        });
-        console.log("Member meta", memberMeta.meta);
-
-        // update member meta after 5 seconds
-
-        setTimeout(async () => {
-          await roomsession.updateMemberMeta({
-            memberId: member.id,
-            meta: {
-              name: "New name",
-              foo: "foobar",
-            },
-          });
-          // get member meta
-          console.log("Member meta after update", await roomsession.getMemberMeta({
-            memberId: member.id
-          }));
-        }, 5000)
-      },
-    })
-  }
-})
-```
-
----
-
-### updateMeta
-
-- **updateMeta**(`meta`): `Promise<void>`
-
-Updates the RoomSession metadata by only setting the specified fields. This is
-different from [setMeta][link-6], which replaces the whole metadata object.
-
-#### Parameters
-
-<ParamField path="meta" type="Record<string, unknown>" required>
-  The update to the metadata.
-</ParamField>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we set metadata for a room as soon as it starts and then
-update the metadata for that room after 5 seconds. This example assumes that
-there is a [`RoomSession`][roomsession-41] already active and
-that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    // Set the room meta
-    console.log("Setting room meta");
-    await roomSession.setMeta({
-      "foo": "bar",
-      "roomName": roomSession.displayName
-    });
-
-    // Get the room meta
-    let roomMeta = await roomSession.getMeta()
-    console.log("Room meta", roomMeta);
-
-    // update the room meta after 5 seconds
-    setTimeout(async () => {
-      console.log("Updating room meta");
-      await roomSession.setMeta({
-        "foo": "bar",
-        "roomName": roomSession.displayName,
-        "updated": true
-      });
-      console.log("Room meta Updated:", await roomSession.getMeta());
-    }, 5000);
-  },
-  onRoomEnded: async (roomSession) => {
-    console.log("Room ended", roomSession.displayName);
-  }
-});
-```
-
-### unlock
-
-- **unlock**(): `Promise<void>`
-
-Unlocks the room if it had been previously locked. This allows new participants to join the room.
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we lock a room when it starts and then unlock it after 20 seconds.
-This example assumes that there is a [`RoomSession`][roomsession-41] already active and users are joining it.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomsession) => {
-      // Lock the room
-      console.log('Locking room');
-      await roomsession.lock();
-
-      // unlock the room after 20 seconds
-
-      setTimeout(async () => {
-        console.log('Unlocking room');
-        await roomsession.unlock();
-      }, 20000);
-
-      roomsession.listen({
-        onMemberJoined: async (member) => {
-          console.log('Member joined', member.name);
-        },
-        onMemberLeft: async (member) => {
-          console.log('Member left', member.name);
-        },
-      })
-    }
-  })
-```
-
----
-
-### videoMute
-
-- **videoMute**(`params`): `Promise<void>`
-
-Puts the video of a given member on mute. Participants will see a mute image instead of the video stream.
-
-#### Parameters
-
-<ParamField path="params" type="object">
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to mute.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then wait for a second member to join the room.
-When a second member joins the room, we mute the video of that member.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    await roomSession.listen({
-      onMemberJoined: (member) => {
-        console.log("Member joined", member.name);
-
-        // Video mute the member
-        roomSession.videoMute({
-          memberId: member.id,
-        })
-      },
-      onMemberUpdated: (member) => {
-        console.log("Member mute status updated", member.name, member.videoMuted);
-      },
-    });
-  }
-});
-```
-
----
-
-### videoUnmute
-
-- **videoUnmute**(`params`): `Promise<void>`
-
-Unmutes the video of a given member if it had been previously muted. Participants will start seeing the video stream again.
-
-#### Parameters
-
-<ParamField path="params" type="object">
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="memberId" type="string">
-  ID of the member to unmute.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we wait for a room to start and then wait for a second member to join the room.
-When a second member joins the room, we mute the video of that member.
-After 5 seconds, we unmute the video of that member.
-This example assumes that there is a [`RoomSession`][roomsession-41]
-already active and that members are joining the room.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" });
-
-// Access video client from the main client
-const videoClient = client.video;
-
-// Setup listener for when a room starts
-await videoClient.listen({
-  onRoomStarted: async (roomSession) => {
-    console.log("Room started", roomSession.displayName);
-
-    await roomSession.listen({
-      onMemberJoined: (member) => {
-        console.log("Member joined", member.name);
-
-        // Video mute the member
-
-        roomSession.videoMute({
-          memberId: member.id,
-        })
-
-        setTimeout(() => {
-          console.log("Unmuting video for member", member.name)
-          // Video unmute the member
-          roomSession.videoUnmute({
-            memberId: member.id,
-          })
-        }, 5000)
-      },
-      onMemberUpdated: (member) => {
-        console.log("Member mute status updated", member.name, member.v);
-      },
-    });
-  }
-});
-```
-
----
-
-## **Events**
-
-You can use this object to subscribe to the following events.
-
-### onRoomSubscribed
-
-- **RoomSession.listen**(`{ onRoomSubscribed: Callback }`)
-
-Emitted when the room session is subscribed too. Your event handler
-will be called with an instance of the [`RoomSession`][roomsession-41] object.
-
-#### Parameters
-
-<ParamField path="roomSession" type="RoomSession" required>
-  The room session object. See [`RoomSession`][roomsession-41].
-</ParamField>
-
-### onRoomStarted
-
-- **RoomSession.listen**(`{ onRoomStarted: Callback }`)
-
-<Tip>
-This event is emitted when the first participant joins the room.
-</Tip>
-
-Emitted when the room session is started.
-Your event handler will be called with an instance of the [`RoomSession`][roomsession-41] object.
-
-#### Parameters
-
-<ParamField path="roomSession" type="RoomSession" required>
-  The room session object. See [`RoomSession`][roomsession-41].
-</ParamField>
-
-### onRoomUpdated
-
-- **RoomSession.listen**(`{ onRoomUpdated: Callback }`)
-
-Emitted when the room session is updated. Your event handler
-will be called with an instance of the [`RoomSession`][roomsession-41] object.
-
-#### Parameters
-
-<ParamField path="roomSession" type="RoomSession" required>
-  The room session object. See [`RoomSession`][roomsession-41].
-</ParamField>
-
-### onRoomEnded
-
-- **RoomSession.listen**(`{ onRoomEnded: Callback }`)
-
-Emitted when the room session is ended. Your event handler
-will be called with an instance of the [`RoomSession`][roomsession-41] object.
-
-#### Parameters
-
-<ParamField path="roomSession" type="RoomSession" required>
-  The room session object. See [`RoomSession`][roomsession-41].
-</ParamField>
-
-### onRoomAudienceCount
-
-- **RoomSession.listen**(`{ onRoomAudienceCount: Callback }`)
-
-Emitted periodically, and when the audience count of the room changes. Your event handler
-will be called with an instance of the `VideoRoomAudienceCount` object.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the event parameters.
-</ParamField>
-
-<Indent>
-<ParamField path="room_session_id" type="string" required>
-  ID of the room session.
-</ParamField>
-
-<ParamField path="room_id" type="string" required>
-  ID of the room.
-</ParamField>
-
-<ParamField path="total" type="number" required>
-  Total number of audience members.
-</ParamField>
-</Indent>
-
-### onLayoutChanged
-
-- **RoomSession.listen**(`{ onLayoutChanged: Callback }`)
-
-Emitted when the layout of the room changes. Your event handler
-will be called with an instance of the `VideoLayOutChanged` object.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the event parameters.
-</ParamField>
-
-<Indent>
-<ParamField path="room_session_id" type="string" required>
-  ID of the room session.
-</ParamField>
-
-<ParamField path="room_id" type="string" required>
-  ID of the room.
-</ParamField>
-
-<ParamField path="layout" type="string" required>
-  Name of the new layout.
-</ParamField>
-</Indent>
-
-### onMemberJoined
-
-- **RoomSession.listen**(`{ onMemberJoined: Callback }`)
-
-<Tip>
-This event is only emitted when the room session has already been started.
-This means the first participant to join the room will not trigger this event.
-</Tip>
-
-Emitted when a member joins the room. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member that joined. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberUpdated
-
-- **RoomSession.listen**(`{ onMemberUpdated: Callback }`)
-
-Emitted when a member in the room is updated. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member that was updated. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberListUpdated
-
-- **RoomSession.listen**(`{ onMemberListUpdated: Callback }`)
-
-Emitted when the list of members in the room is updated. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member list update. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberLeft
-
-- **RoomSession.listen**(`{ onMemberLeft: Callback }`)
-
-Emitted when a member leaves the room. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member that left. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberDeaf
-
-- **RoomSession.listen**(`{ onMemberDeaf: Callback }`)
-
-Emitted when a member in the room deafens status changes. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member whose deaf status changed. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberVisible
-
-- **RoomSession.listen**(`{ onMemberVisible: Callback }`)
-
-Emitted when a member in the room visibility changes. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member whose visibility changed. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberAudioMuted
-
-- **RoomSession.listen**(`{ onMemberAudioMuted: Callback }`)
-
-Emitted when a member in the room audio state changes. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member whose audio mute state changed. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberVideoMuted
-
-- **RoomSession.listen**(`{ onMemberVideoMuted: Callback }`)
-
-Emitted when a member in the room video state changes. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member whose video mute state changed. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberInputVolume
-
-- **RoomSession.listen**(`{ onMemberInputVolume: Callback }`)
-
-Emitted when a member in the room input volume changes. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member whose input volume changed. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberOutputVolume
-
-- **RoomSession.listen**(`{ onMemberOutputVolume: Callback }`)
-
-Emitted when a member in the room output volume changes. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member whose output volume changed. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberInputSensitivity
-
-- **RoomSession.listen**(`{ onMemberInputSensitivity: Callback }`)
-
-Emitted when a member in the room input sensitivity changes. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member whose input sensitivity changed. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberTalking
-
-- **RoomSession.listen**(`{ onMemberTalking: Callback }`)
-
-Emitted when a member in the room talking status changes. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member whose talking status changed. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberTalkingStarted
-
-- **RoomSession.listen**(`{ onMemberTalkingStarted: Callback }`)
-
-Emitted when a member in the room starts talking. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member who started talking. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onMemberTalkingEnded
-
-• **RoomSession.listen**(`{ onMemberTalkingEnded: Callback }`)
-
-Emitted when a member in the room stops talking. Your event handler
-will be called with an instance of the [`RoomSessionMember`][roomsessionmember-28] object.
-
-#### Parameters
-
-<ParamField path="member" type="RoomSessionMember" required>
-  The member who stopped talking. See [`RoomSessionMember`][roomsessionmember-28].
-</ParamField>
-
-### onPlaybackStarted
-
-• **RoomSession.listen**(`{ onPlaybackStarted: Callback }`)
-
-Emitted when a playback starts in the room. Your event handler
-will be called with an instance of the [`RoomSessionPlayback`][roomsessionplayback-12] object.
-
-#### Parameters
-
-<ParamField path="playback" type="RoomSessionPlayback" required>
-  The playback that started. See [`RoomSessionPlayback`][roomsessionplayback-12].
-</ParamField>
-
-### onPlaybackUpdated
-
-- **RoomSession.listen**(`{ onPlaybackUpdated: Callback }`)
-
-Emitted when a playback in the room is updated. Your event handler
-will be called with an instance of the [`RoomSessionPlayback`][roomsessionplayback-12] object.
-
-#### Parameters
-
-<ParamField path="playback" type="RoomSessionPlayback" required>
-  The playback that was updated. See [`RoomSessionPlayback`][roomsessionplayback-12].
-</ParamField>
-
-### onPlaybackEnded
-
-- **RoomSession.listen**(`{ onPlaybackEnded: Callback }`)
-
-Emitted when a playback in the room ends. Your event handler
-will be called with an instance of the [`RoomSessionPlayback`][roomsessionplayback-12] object.
-
-#### Parameters
-
-<ParamField path="playback" type="RoomSessionPlayback" required>
-  The playback that ended. See [`RoomSessionPlayback`][roomsessionplayback-12].
-</ParamField>
-
-### onRecordingStarted
-
-- **RoomSession.listen**(`{ onRecordingStarted: Callback }`)
-
-Emitted when a recording starts in the room. Your event handler
-will be called with an instance of the [`RoomSessionRecording`][roomsessionrecording-12] object.
-
-#### Parameters
-
-<ParamField path="recording" type="RoomSessionRecording" required>
-  The recording that started. See [`RoomSessionRecording`][roomsessionrecording-12].
-</ParamField>
-
-### onRecordingUpdated
-
-- **RoomSession.listen**(`{ onRecordingUpdated: Callback }`)
-
-Emitted when a recording in the room is updated. Your event handler
-will be called with an instance of the [`RoomSessionRecording`][roomsessionrecording-12] object.
-
-#### Parameters
-
-<ParamField path="recording" type="RoomSessionRecording" required>
-  The recording that was updated. See [`RoomSessionRecording`][roomsessionrecording-12].
-</ParamField>
-
-### onRecordingEnded
-
-- **RoomSession.listen**(`{ onRecordingEnded: Callback }`)
-
-Emitted when a recording in the room ends. Your event handler
-will be called with an instance of the [`RoomSessionRecording`][roomsessionrecording-12] object.
-
-#### Parameters
-
-<ParamField path="recording" type="RoomSessionRecording" required>
-  The recording that ended. See [`RoomSessionRecording`][roomsessionrecording-12].
-</ParamField>
-
-### onStreamEnded
-
-- **RoomSession.listen**(`{ onStreamEnded: Callback }`)
-
-Emitted when a stream in the room ends. Your event handler
-will be called with an instance of the [`RoomSessionStream`][roomsessionstream-8] object.
-
-#### Parameters
-
-<ParamField path="stream" type="RoomSessionStream" required>
-  The stream that ended. See [`RoomSessionStream`][roomsessionstream-8].
-</ParamField>
-
-### onStreamStarted
-
-- **RoomSession.listen**(`{ onStreamStarted: Callback }`)
-
-Emitted when a stream starts in the room. Your event handler
-will be called with an instance of the [`RoomSessionStream`][roomsessionstream-8] object.
-
-#### Parameters
-
-<ParamField path="stream" type="RoomSessionStream" required>
-  The stream that started. See [`RoomSessionStream`][roomsessionstream-8].
-</ParamField>
-
-## **Alias Types**
-
-### VideoPositions
-
-▪ **VideoPositions**:  \[ **key**: `string`\]: [`VideoPosition`][videoposition]
-
-An object whose keys represent member IDs, and values the layout position to assign.
-Instead of a member ID, in some contexts you can use
-the special keyword `self` if you don't know yet the ID of the member which
-is going to be created.
-
-<ParamField path="auto" type="string">
-  The position of the member in the layout is determined automatically.
-</ParamField>
-
-<ParamField path="reserved-positionNumber" type="string">
-  The reserved position in the layout (e.g. `reserved-3`).
-</ParamField>
-
-<ParamField path="standard-positionNumber" type="string">
-  The standard position in the layout (e.g. `standard-3`).
-</ParamField>
-
-<ParamField path="off-canvas" type="string">
-  Assign the member off-canvas, outside the layout.
-</ParamField>
-
-
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/voice/client/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/voice/client/index.mdx
index b39070021..491f4eca0 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/voice/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/voice/client/index.mdx
@@ -1,6 +1,8 @@
 ---
 id: bb1a95f4-c43f-4a16-aa16-d96680f98f01
 title: "Voice Client"
+sidebar-title: Client
+position: 1
 slug: reference/voice/client
 description: Voice Client reference for initiating and receiving calls.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/voice/index.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/voice/overview.mdx
similarity index 98%
rename from fern/products/realtime-sdk/pages/latest/tech-ref/voice/index.mdx
rename to fern/products/realtime-sdk/pages/latest/tech-ref/voice/overview.mdx
index 36aebace2..d8a220acf 100644
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/voice/index.mdx
+++ b/fern/products/realtime-sdk/pages/latest/tech-ref/voice/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 573c44af-7688-448e-b402-1f15d03fedde
 title: "Voice"
+sidebar-title: Overview
+position: 0
 keywords: SignalWire, Realtime SDK, Node.js, voice API, telephony, VoIP
 slug: reference/voice
 description: Access the Voice API to make and receive phone calls programmatically. Includes methods for call control, playback, recording, and speech detection.
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/voice/voice-call.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/voice/voice-call.mdx
deleted file mode 100644
index eec3d7d14..000000000
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/voice/voice-call.mdx
+++ /dev/null
@@ -1,3015 +0,0 @@
----
-id: 452c6918-8346-437d-837c-e171138aca5b
-title: "Call"
-keywords: SignalWire, Realtime SDK, Node.js, voice call, outbound call, inbound call, call control
-slug: reference/voice/call
-description: Voice Call object reference with methods for call control including answer, hangup, play audio, record, collect digits, detect speech, and transfer calls.
-max-toc-depth: 3
-sidebar-title: Call
----
-
-[amd]: #amd
-[call-events]: #events
-[call]: #
-[callcollect-events]: ./callcollect.mdx#events
-[callcollect-onstarted]: ./callcollect.mdx#onstarted
-[callcollect-startinputtimers]: ./callcollect.mdx#startinputtimers
-[callcollect]: ./callcollect.mdx
-[calldetect-events]: ./calldetect.mdx#events
-[calldetect-onstarted]: ./calldetect.mdx#onstarted
-[calldetect]: ./calldetect.mdx
-[callplayback-events]: ./callplayback.mdx#events
-[callplayback-onstarted]: ./callplayback.mdx#onstarted
-[callplayback]: ./callplayback.mdx
-[callprompt-events]: ./callprompt.mdx#events
-[callprompt-onstarted]: ./callprompt.mdx#onstarted
-[callprompt]: ./callprompt.mdx
-[callrecording-events]: ./callrecording.mdx#events
-[callrecording-onstarted]: ./callrecording.mdx#onstarted
-[callrecording]: ./callrecording.mdx
-[callstate]: ./callstate.mdx
-[calltap-events]: ./calltap.mdx#events
-[calltap-onstarted]: ./calltap.mdx#onstarted
-[calltap]: ./calltap.mdx
-[collectdigitsconfig]: ./types.mdx#collectdigitsconfig
-[collectspeechconfig]: ./types.mdx#collectspeechconfig
-[connect]: #connect
-[connectphone]: #connectphone
-[connectsip]: #connectsip
-[detectansweringmachine]: #voice_call_detect_answering
-[detectdigit]: #detectdigit
-[detectfax]: #voice_call_detect_fax
-[devicebuilder]: ./voice-devicebuilder.mdx
-[disconnected]: #disconnected
-[onstatechanged]: #onstatechanged
-[playaudio]: #playaudio
-[playringtone]: #playringtone
-[playsilence]: #playsilence
-[playtts]: #playtts
-[prompt]: #prompt
-[promptaudio]: #promptaudio
-[promptringtone]: #promptringtone
-[prompttts]: #prompttts
-[recordaudio]: #voice_call_record_audio
-[ringtonename]: ./types.mdx#ringtonename
-[sipcodec]: ./types.mdx#sipcodec
-[sipheader]: ./types.mdx#sipheader
-[ssml]: https://cloud.google.com/text-to-speech/docs/ssml
-[startinput]: #voice_call_oncollectinputstarted
-[supported-voices-languages]: /voice/getting-started/voice-and-languages
-[tapaudio]: #tapaudio
-[tapdevice]: ./types.mdx#tapdevice
-[voice-client-oncallreceived]: ./voice-client.mdx#oncallreceived
-[voice-client]: ./voice-client.mdx
-[voicedevicebuilder]: ./voice-devicebuilder.mdx
-[voiceplaylist]: ./voice-playlist.mdx
-
-A Call object represents an active call. You can get instances of a Call object from a [Voice.Client][voice-client], by answering or initiating calls.
-
-#### Examples
-
-In this example, we are dialing a phone number and playing a TTS message.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-const call = await voiceClient.dialPhone({
-  from: "+YYYYYYYYYY",
-  to: "+XXXXXXXXXX"
-});
-
-await call.playTTS({ text: "Welcome to SignalWire!" });
-```
-
-In this example, we are answering an incoming call, playing a TTS message and then hanging up.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-    topics: ["topic"],
-    onCallReceived: async (call) => {
-        call.answer();
-        console.log("Call received", call.id);
-        await call.playTTS({ text: "Welcome to SignalWire!" });
-        call.hangup();
-    }
-});
-```
-
-## **Properties**
-
-<ParamField path="device" type="any">
-  The device configuration for this call.
-</ParamField>
-
-<ParamField path="direction" type='"inbound" | "outbound"'>
-  Whether you are making or receiving the call.
-</ParamField>
-
-<ParamField path="from" type="string">
-  The phone number that the call is coming from.
-</ParamField>
-
-<ParamField path="headers" type="SipHeader[]" optional>
-  Optional SIP headers for this call. See [`SipHeader`][types].
-</ParamField>
-
-<ParamField path="id" type="string">
-  Unique ID for this voice call.
-</ParamField>
-
-<ParamField path="state" type='"created" | "ringing" | "answered" | "ending" | "ended"'>
-  The current state of the call.
-</ParamField>
-
-<ParamField path="to" type="string">
-  The phone number you are attempting to call.
-</ParamField>
-
-<ParamField path="type" type='"phone" | "sip"'>
-  The type of call. Only phone and sip are currently supported.
-</ParamField>
-
-## **Methods**
-
-### amd
-
-- **amd**(`params?`): `Promise`\<[`CallDetect`][calldetect]>
-
-Detects the presence of an answering machine. Alias for [detectAnsweringMachine][detectansweringmachine].
-
----
-
-### answer
-
-- **answer**(): `Promise`\<[`Call`][call]>
-
-Answers the incoming call.
-
-#### Parameters
-
-This method has no parameters.
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-#### Example
-
-In this example, we answer an incoming call on the `office` topic.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: (call) => {
-    call.answer();
-    console.log("Call received", call.id);
-  }
-});
-```
-
----
-
-### collect
-
-**collect**(`params`): `Promise`\<[`CallCollect`][callcollect]>
-
-Collect user input. For methods that include a prompt to the user, please see [promptAudio][promptaudio], [promptRingtone][promptringtone], or [promptTTS][prompttts].
-
-#### Parameters [#voice_call_collect_parameters]
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for collecting user input.
-</ParamField>
-
-<Indent>
-<ParamField path="digits" type="CollectDigitsConfig">
-  Configuration for collecting digits. You must either set this, or `speech`. See [`CollectDigitsConfig`][collectdigitsconfig].
-</ParamField>
-
-<ParamField path="speech" type="CollectSpeechConfig">
-  Configuration for collecting speech. You must either set this, or `digits`. See [`CollectSpeechConfig`][collectspeechconfig].
-</ParamField>
-
-<ParamField path="continuous" type="boolean" default="false">
-  Detect utterances and digits until stopped.
-</ParamField>
-
-<ParamField path="initialTimeout" type="number" default="4">
-  Number of seconds to wait for initial input before giving up. Will be used only when `startInputTimers` is true or when the timer is started manually via the [`startInputTimers`][callcollect] method.
-</ParamField>
-
-<ParamField path="partialResults" type="boolean" default="false">
-  If true, partial result events are fired.
-</ParamField>
-
-<ParamField path="sendStartOfInput" type="boolean" default="false">
-  If true, the [`startOfInput`][startinput] event is fired when input is detected.
-</ParamField>
-
-<ParamField path="startInputTimers" type="boolean" default="false">
-  If true, the `initialTimeout` timer is started.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of collect events can be found [here][callcollect-events]. Example event: [`onStarted`][callcollect-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallCollect`][callcollect]>
-
-A promise that resolves to a [`CallCollect`][callcollect] object that you can use to
-view the current state and results of the collect session.
-
-#### Examples
-
-##### Digits Example
-In this example, we collect `digits` from the user and log the result.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    call.answer();
-    console.log("Call received", call.id);
-    let collectResult = await call.collect({
-      digits: {
-        max: 5,
-        digitTimeout: 2,
-        terminators: "#*"
-      }
-    }).onStarted();
-    const { type, digits, terminator } = await collectResult.ended();
-    console.log("Collected", type, digits, terminator);
-    call.hangup();
-  }
-});
-```
-
-##### Speech Example
-In this example, we collect `speech` from the user and log the result.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    call.answer();
-    console.log("Call received", call.id);
-    let collectResult = await call.collect({
-      speech: {
-        endSilenceTimeout: 2,
-        speechTimeout: 10,
-        language: "en-US",
-        hints: ["sales", "support", "representative"]
-      }
-    }).onStarted();
-    const { type, speech } = await collectResult.ended();
-    console.log("Collected", type, speech);
-  }
-});
-```
-
-##### CallCollect Events Example
-In this example we are collecting `digits` and listening for results using the `CallCollect` [Events][callcollect-events]:
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Setup a Voice Client and listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    call.answer();
-    console.log("Call received", call.id);
-
-    // Start a call collect session
-    await call.collect({
-      digits: {
-        max: 4,
-        digitTimeout: 10,
-        terminators: "#"
-      },
-      partialResults: true,
-      sendStartOfInput: true,
-      listen: {
-        onStarted: () => {
-          console.log("Collect started");
-        },
-        onInputStarted: (collect) => {
-          console.log("Collect input started:", collect.result);
-        },
-        onUpdated: (collect) => {
-          console.log("Collect updated:", collect.result);
-        },
-        onFailed: (collect) => {
-          console.log("Collect failed:", collect.result);
-        },
-        onEnded: async (collect) => {
-          console.log("Collect ended:", collect.result);
-
-          // Play back the digits collected
-          await call.playTTS({ text: `You entered ${collect.digits}` });
-          call.hangup()
-        }
-      }
-    }).onStarted();
-  }
-});
-```
----
-
-### connect
-
-- **connect**(`params`): `Promise`\<[`Call`][call]>
-
-Attempt to connect an existing call to a new outbound call. The two devices will hear each other. You can wait until the new peer is disconnected by calling [disconnected][disconnected].
-
-This is a generic method that allows you to connect to multiple devices in series, parallel, or combinations of both with the use of a [DeviceBuilder][devicebuilder]. 
-
-<Tip>
-For simpler use cases, we recommend using [connectPhone][connectphone] or [connectSip][connectsip].
-</Tip>
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for connecting the call.
-</ParamField>
-
-<Indent>
-<ParamField path="devices" type="VoiceDeviceBuilder" required>
-  A device builder specifying the devices to call. See [`VoiceDeviceBuilder`][voicedevicebuilder].
-</ParamField>
-
-<ParamField path="ringback" type="VoicePlaylist">
-  Ringback audio to play to the first call leg. You can play audio, TTS, silence or ringtone. See [`VoicePlaylist`][voiceplaylist].
-</ParamField>
-
-<ParamField path="maxPricePerMinute" type="number">
-  The maximum price in USD acceptable for the call to be created. If the rate for the call is greater than this value, the call will not be created. If not set, all calls will be created. Price can have a maximum of four decimal places, i.e. `0.0075`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-A promise that resolves to a [`Call`][call] object that you can use to control the new peer.
-The promise resolves only after the new peer picks up the call.
-
-#### Examples
-
-Connecting to a new SIP call, while playing ringback audio to the first leg of the call.
-
-```js
-import { SignalWire, Voice} from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-const ringback = new Voice.Playlist().add(
-  Voice.Playlist.Ringtone({
-    name: "it"
-  })
-);
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-
-    let plan = new Voice.DeviceBuilder().add(
-      Voice.DeviceBuilder.Sip({
-        // Replace the to and from with valid SIP endpoint domains
-        from: `sip:${call.from}@example.sip.signalwire.com`,
-        to: "sip:example@example.sip.signalwire.com",
-        timeout: 30
-      })
-    );
-    // Answer the call
-    call.answer();
-    // Connect the call to the device builder plan
-    const peer = await call.connect({
-      devices: plan,
-      ringback: ringback
-    });
-    // Listen to peer state changes
-    await peer.listen({
-      onStateChanged: (state) => {
-        console.log("Peer state changed:", state.state);
-      }
-    })
-    // wait for peer to hangup
-    await peer.disconnected();
-    console.log("The peer hungup");
-    // hangup the call
-    call.hangup();
-  }
-});
-```
-
----
-
-### connectPhone
-
-- **connectPhone**(`params`): `Promise`\<[`Call`][call]>
-
-Attempt to connect an existing call to a new outbound phone call. The two devices will hear each other. You can wait until the new peer is disconnected by calling [disconnected][disconnected].
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for connecting the call to a phone number.
-</ParamField>
-
-<Indent>
-<ParamField path="to" type="string" required>
-  The party you are attempting to call.
-</ParamField>
-
-<ParamField path="from" type="string">
-  The party the call is coming from. Must be a SignalWire number or SIP endpoint that you own.
-</ParamField>
-
-<ParamField path="timeout" type="number">
-  The time, in seconds, the call will ring before it is considered unanswered.
-</ParamField>
-
-<ParamField path="maxPricePerMinute" type="number">
-  The maximum price in USD acceptable for the call to be created. If the rate for the call is greater than this value, the call will not be created. If not set, all calls will be created. Price can have a maximum of four decimal places, i.e. `0.0075`.
-</ParamField>
-
-<ParamField path="ringback" type="VoicePlaylist">
-  Ringback audio to play to the call leg. You can play audio, TTS, silence or ringtone. See [`VoicePlaylist`][voiceplaylist].
-</ParamField>
-
-<ParamField path="callStateUrl" type="string">
-  Webhook URL to which SignalWire will send call status change notifications. See the payload specifications under [`CallState`][callstate].
-</ParamField>
-
-<ParamField path="callStateEvents" type="string[]" default='["ended"]'>
-  An array of event names to be notified about. Allowed values are `created`, `ringing`, `answered`, and `ended`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-A promise that resolves to a [`Call`][call] object that you can use to control the new peer.
-The promise resolves only after the new peer picks up the call.
-
-#### Example
-
-In this example, we connect an inbound call to an outbound phone number. We play a ringback tone
-to the inbound call leg while waiting for the outbound phone number to answer.
-Once the outbound phone number answers, we wait for the peer to hangup and then hangup
-the inbound leg of the call.
-
-```js
-import { SignalWire, Voice} from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-// Ringback tone
-const ringback = new Voice.Playlist().add(
-  Voice.Playlist.Ringtone({
-    name: "it"
-  })
-);
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-
-    // Answer the call
-    call.answer();
-    // Connect the call to the device builder plan
-    let peer = await call.connectPhone({
-      // Replace the to parameter with a valid phone number
-      to: "+1XXXXXXXXXX",
-      from: call.from,
-      ringback: ringback
-    });
-
-    // Listen to peer state changes
-    await peer.listen({
-      onStateChanged: (state) => {
-        console.log("Peer state changed:", state.state);
-      }
-    })
-    // wait for peer to hangup
-    await peer.disconnected();
-    console.log("The peer hungup");
-    // hangup the call
-    call.hangup();
-  }
-});
-```
-
----
-
-### connectSip
-
-- **connectSip**(`params`): `Promise`\<[`Call`][call]>
-
-Attempt to connect an existing call to a new outbound SIP call. The two devices will hear each other.
-You can wait until the new peer is disconnected by calling [disconnected][disconnected].
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for connecting the call to a SIP endpoint.
-</ParamField>
-
-<Indent>
-<ParamField path="from" type="string" required>
-  The party the call is coming from. Must be a SignalWire number or SIP endpoint that you own.
-</ParamField>
-
-<ParamField path="to" type="string" required>
-  The party you are attempting to call.
-</ParamField>
-
-<ParamField path="timeout" type="number">
-  The time, in seconds, the call will ring before it is considered unanswered.
-</ParamField>
-
-<ParamField path="headers" type="SipHeader[]">
-  Array of [`SipHeader`][sipheader] objects. Must be X- headers only, see example below.
-</ParamField>
-
-<ParamField path="codecs" type="SipCodec[]">
-  Array of desired codecs in order of preference. Supported values are `PCMU`, `PCMA`, `OPUS`, `G729`, `G722`, `VP8`, `H264`. Default is parent leg codec(s). See [`SipCodec`][sipcodec].
-</ParamField>
-
-<ParamField path="webrtcMedia" type="boolean">
-  If `true`, WebRTC media is negotiated. Default is parent leg setting.
-</ParamField>
-
-<ParamField path="sessionTimeout" type="number">
-  Non-negative value, in seconds, to use for the SIP `Session-Expires` header. If `0` or unset, SignalWire will pick the default (typically `600`).
-</ParamField>
-
-<ParamField path="maxPricePerMinute" type="number">
-  The maximum price in USD acceptable for the call to be created. If the rate for the call is greater than this value, the call will not be created. If not set, all calls will be created. Price can have a maximum of four decimal places, i.e. `0.0075`.
-</ParamField>
-
-<ParamField path="ringback" type="VoicePlaylist">
-  Ringback audio to play to the call leg. You can play audio, TTS, silence or ringtone. See [`VoicePlaylist`][voiceplaylist].
-</ParamField>
-
-<ParamField path="callStateUrl" type="string">
-  Webhook URL to which SignalWire will send call status change notifications. See the payload specifications under [`CallState`][callstate].
-</ParamField>
-
-<ParamField path="callStateEvents" type="string[]" default='["ended"]'>
-  An array of event names to be notified about. Allowed values are `created`, `ringing`, `answered`, and `ended`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-A promise that resolves to a [`Call`][call] object that you can use to control the new peer.
-The promise resolves only after the new peer picks up the call.
-
-#### Example
-
-In this example, we connect a inbound call to a internal SIP endpoint. We play a ringback tone to the inbound call leg
-while waiting for the SIP endpoint to answer. Once the SIP endpoint answers, we wait for the peer to hangup and then hangup the inbound call.
-
-```js
-import { SignalWire, Voice} from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-// Ringback tone
-const ringback = new Voice.Playlist().add(
-  Voice.Playlist.Ringtone({
-    name: "it"
-  })
-);
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-
-    // Answer the call
-    call.answer();
-    // Connect the call to the device builder plan
-    let peer = await call.connectSip({
-      // Replace the to and from with valid SIP endpoint domains
-      to: "sip:example@example.sip.signalwire.com",
-      from: `sip:${call.from}@example.sip.signalwire.com`,
-      ringback: ringback
-    });
-
-    // Listen to peer state changes
-    await peer.listen({
-      onStateChanged: (state) => {
-        console.log("Peer state changed:", state.state);
-      }
-    })
-    // wait for peer to hangup
-    await peer.disconnected();
-    console.log("The peer hungup");
-    // hangup the call
-    call.hangup();
-  }
-});
-```
-
----
-
-### detect
-
-- **detect**(`params`): `Promise`\<[`CallDetect`][calldetect]>
-
-Generic method. Please see [amd][amd], [detecFax][detectfax], and [detectDigit][detectdigit].
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for detection.
-</ParamField>
-
-<Indent>
-<ParamField path="type" type='"fax" | "machine" | "digit" | "beep"' required>
-  The type of detection to perform:
-  - `"digit"`: see [detectDigit][detectdigit]
-  - `"fax"`: see [detectFax][detectfax]
-  - `"machine"`: see [detectAnsweringMachine][detectansweringmachine]
-  - `"beep"`: see [detectAnsweringMachine][detectansweringmachine]
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallDetect`][calldetect]>
-
-A promise that resolves to a [`CallDetect`][calldetect] object that you can use to
-view the current state and results of the `detect` session.
-
----
-
-### detectAnsweringMachine [#voice_call_detect_answering]
-
-- **detectAnsweringMachine**(`params?`): `Promise`\<[`CallDetect`][calldetect]>
-
-Detects the presence of an answering machine.
-
-#### Parameters
-
-<ParamField path="params" type="object">
-  Object containing the parameters for answering machine detection.
-</ParamField>
-
-<Indent>
-<ParamField path="timeout" type="number" default="30.0">
-  Number of seconds to run the detector for.
-</ParamField>
-
-<ParamField path="waitForBeep" type="boolean" default="false">
-  Whether to wait until the device is ready for voicemail delivery.
-</ParamField>
-
-<ParamField path="initialTimeout" type="number" default="4.5">
-  Number of seconds to wait for initial voice before giving up.
-</ParamField>
-
-<ParamField path="endSilenceTimeout" type="number" default="1.0">
-  Number of seconds to wait for voice to finish.
-</ParamField>
-
-<ParamField path="machineReadyTimeout" type="number">
-  Number of seconds to wait for voice to finish before firing the `READY` event. Default is the value of `endSilenceTimeout`.
-</ParamField>
-
-<ParamField path="machineVoiceThreshold" type="number" default="1.25">
-  How many seconds of voice to decide it is a machine.
-</ParamField>
-
-<ParamField path="machineWordsThreshold" type="number" default="6">
-  How many words to count to decide it is a machine.
-</ParamField>
-
-<ParamField path="detectInterruptions" type="boolean" default="false">
-  If set to `true`, a `NOT_READY` event is fired if speech is detected after the `READY` event. This allows the application to restart message delivery to the answering machine.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of detect events can be found [here][calldetect-events]. Example event: [`onStarted`][calldetect-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallDetect`][calldetect]>
-
-A promise that resolves to a [`CallDetect`][calldetect] object that you can use to
-view the current state and results of the `detect` session.
-
-#### Example
-
-In this example, we dial a phone number and wait for the answering machine detection to finish.
-Once the detection is finished, we log the result and then play a TTS message.
-At the end of the TTS message, we hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-try {
-  // Outbound Dial
-  const call = await voiceClient.dialPhone({
-    from: "SignalWire From Number Here",
-    to: "Destination Number Here",
-    timeout: 30,
-    listen: {
-      onStateChanged: (call) => {
-        console.log("Call state changed:", call.state);
-      }
-    }
-  });
-
-  // Answering machine detection
-  await call.detectAnsweringMachine({
-    waitForBeep: true,
-    endSilenceTimeout: 4,
-    listen: {
-      onStarted: () => {
-        console.log("Answering machine detection started");
-      },
-      onUpdated: (event) => {
-        console.log("Answering machine detection updated:", event.result);
-      },
-      onEnded: async (event) => {
-        console.log("Answering machine detection ended:", event.result);
-        }
-      }
-    });
-  // Plays a TTS message after the answering machine detection is finished.
-  // Then the Call will hangup after the TTS message is finished.
-  await call.playTTS({ text: "Hello, this is a test call from SignalWire!" });
-  call.hangup();
-} catch (e) {
-  console.log("Call not answered.", e);
-}
-```
-
----
-
-### detectDigit
-
-- **detectDigit**(`params?`): `Promise`\<[`CallDetect`][calldetect]>
-
-Detects when a digit is pressed in an audio stream. To gather digit input from a caller, please see [prompt][prompt].
-
-#### Parameters
-
-<ParamField path="params" type="object">
-  Object containing the parameters for digit detection.
-</ParamField>
-
-<Indent>
-<ParamField path="digits" type="string" default="0123456789#*">
-  The digits to detect.
-</ParamField>
-
-<ParamField path="timeout" type="number" default="30.0">
-  Number of seconds to run the detector for.
-</ParamField>
-
-<ParamField path="waitForBeep" type="boolean" default="false">
-  Whether to wait until the device is ready for voicemail delivery.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of detect events can be found [here][calldetect-events]. Example event: [`onStarted`][calldetect-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallDetect`][calldetect]>
-
-A promise that resolves to a [`CallDetect`][calldetect] object that you can use to
-view the current state and results of the `detect` session.
-
-#### Example
-
-In this example, we dial a phone number and wait for the digit detection to finish.
-Once the detection is finished, we log the result and then play a TTS message of the digit pressed and then hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-
-    // Answer the call
-    call.answer();
-    await call.detectDigit({
-      listen: {
-        onStarted: () => console.log("Detection started!"),
-        onEnded: (detect) => console.log("Finished detecting digit", detect.result),
-        onUpdated: async (detect) => {
-          console.log("Updated detecting digit", detect.result)
-          // Stop the detection and play the digit pressed
-          detect.stop();
-          await call.playTTS({ text: `You pressed ${detect.result})` });
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### detectFax [#voice_call_detect_fax]
-
-- **detectFax**(`params?`): `Promise`\<[`CallDetect`][calldetect]>
-
-Detects the presence of a fax machine.
-
-#### Parameters
-
-<ParamField path="params" type="object">
-  Object containing the parameters for fax detection.
-</ParamField>
-
-<Indent>
-<ParamField path="timeout" type="number" default="30.0">
-  Number of seconds to run the detector for.
-</ParamField>
-
-<ParamField path="tone" type='"CED" | "CNG"' default="CED">
-  The fax tone to detect: `CED` or `CNG`.
-</ParamField>
-
-<ParamField path="waitForBeep" type="boolean" default="false">
-  Whether to wait until the device is ready for voicemail delivery.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of detect events can be found [here][calldetect-events]. Example event: [`onStarted`][calldetect-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallDetect`][calldetect]>
-
-A promise that resolves to a [`CallDetect`][calldetect] object that you can use to
-view the current state and results of the `detect` session.
-
-#### Example
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Setup a voice client tolisten for incoming calls
-await voiceClient.listen({
-  topics: ['office'],
-  onCallReceived: async (call) => {
-    // Answer the call
-    console.log("Call received");
-    call.answer();
-    // Fax detection
-    await call.detectFax({
-      tone: 'CNG',
-      listen: {
-        onStarted: () => {
-          console.log("Fax detection started");
-        },
-        onUpdated: (event) => {
-          console.log("Fax detection updated:", event.result);
-        },
-        onEnded: (event) => {
-          console.log("Fax detection finished:", event.result);
-          call.hangup();
-        }
-      }
-    }).onStarted()
-  }
-})
-```
-
----
-
-### disconnect
-
-- **disconnect**(): `Promise<void>`
-
-Disconnects the [`connected`][connect] peer from the call.
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we answer an incoming call and connect the call to a peer call.
-Once connected to the peer, we play a TTS message to the peer and then disconnect the peer.
-Once the peer is disconnected, we play a TTS message to the inbound call leg and then hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: ['office'],
-  onCallReceived: async (call) => {
-    // Answer the call
-    call.answer();
-    // Connect call to a new peer
-    let peer = await call.connectPhone({
-      from: call.from,
-      to: "Destination Number Here"
-    })
-    // Play TTS to the peer
-    await peer.playTTS({ text: 'Hello from SignalWire!' });
-    // Disconnect the peer call
-    call.disconnect();
-    await call.playTTS({ text: 'Disconnecting Peer!' });
-    console.log("The Peer and Call have been disconnected, but the calls are still active.")
-    // Hangup the peer call
-    await peer.playTTS({ text: 'Ending Peer Session' });
-    peer.hangup();
-    // Hangup the call
-    await call.playTTS({ text: 'Ending Call Session' });
-    call.hangup();
-  }
-})
-```
----
-
-### disconnected
-
-- **disconnected**(): `Promise`\<[`Call`][call]>
-
-Call this method after connecting a peer (e.g., using [connect][connect],
-[connectPhone][connectphone], or [connectSip][connectsip]) to wait until the
-peer disconnects.
-
-This is equivalent to calling `peer.waitFor("ended")` on the connected peer.
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-A promise that resolves to the [`Call`][call] object that you can use to control the call.
-
-#### Example
-
-In this example, we answer an incoming call and connect the call to a peer call.
-After connecting to the peer, we wait 3 seconds and then disconnect the peer.
-Once the peer is disconnected, we play a TTS message to the inbound call leg and then hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: ['office'],
-  onCallReceived: async (call) => {
-    // Answer the call
-    call.answer();
-    // Connect call to a new peer
-    let peer = await call.connectPhone({
-      from: call.from,
-      to: "Destination Number Here",
-    })
-
-    // wait 3 seconds then disconnect the peer
-    setTimeout(() => {
-      console.log('Disconnecting Peer');
-      peer.hangup();
-    }, 3000);
-
-    await call.disconnected();
-
-    await call.playTTS({ text: 'Peer disconnected, ending call.' });
-    call.hangup();
-  }
-})
-```
-
----
-
-### hangup
-
-- **hangup**(`reason?`): `Promise<void>`
-
-Hangup the call.
-
-#### Parameters
-
-<ParamField path="reason" type='"error" | "hangup" | "cancel" | "busy" | "noAnswer" | "decline"' default="hangup">
-  Reason for hanging up.
-</ParamField>
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-In this example, we listen for an incoming call and then hangup right away with a reason of `busy`.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-   // Listen for a status change event on the call
-   await call.listen({
-    onStateChanged: (call) => {
-        console.log("Call state changed:", call.state);
-      }
-   })
-    // Hangup the call
-    await call.hangup("busy");
-  }
-});
-```
-
----
-
-### listen
-
-- **listen**(`{ event: Callback }`): `Promise`\<[`Call Events`][here]>
-
-Listen for events on the call.
-
-#### Parameters
-
-<ParamField path="listeners" type="object" required>
-  Object containing event listener callbacks.
-</ParamField>
-
-<Indent>
-<ParamField path="EVENT" type="Callback">
-  The event to listen for. List of events can be found [here][call-events]. Example event: [`onStateChanged`][onstatechanged].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`Call Events`][call-events]>
-
-A promise that resolves to an unsubscribe function that you can call to stop listening for events.
-
-#### Example
-
-In this example, we listen for an incoming call and listen for the `onStateChanged` event.
-After 3 seconds, we hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-// Initialize the SignalWire client
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-// Access video client from the main client
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    // Answer the call
-    call.answer();
-   // Listen for a status change event on the call
-   await call.listen({
-      onStateChanged: (call) => {
-        console.log("Call state changed:", call.state);
-      }
-   })
-    // wait 3 seconds and then hangup
-    setTimeout(async () => {
-      await call.hangup();
-    }, 3000);
-  }
-});
-```
-
----
-
-### pass
-
-- **pass**(`params`): `Promise`\<[`Call`][call]>
-
-This will allow a client to decline incoming calls without ending the call and redirect the call to another [Voice client][voice-client-oncallreceived].
-
-Will trigger on the [`onCallReceived`][voice-client-oncallreceived] event.
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-A promise that resolves to the [`Call`][call] object that you can use to control the call.
-
-#### Example
-
-In this example, we listen for an incoming call and then pass the call to a different topic.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: (call) => {
-    // pass the call to a different client
-    call.pass();
-    }
-});
-```
-
-### play
-
-- **play**(`params`): `Promise`\<[`CallPlayback`][callplayback]>
-
-Play one or multiple media in a Call and waits until the playing has ended.
-
-The play method is a generic method for all types of media, see [playAudio][playaudio], [playSilence][playsilence], [playTTS][playtts] or [playRingtone][playringtone] for more specific usages.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for playing media.
-</ParamField>
-
-<Indent>
-<ParamField path="playlist" type="VoicePlaylist" required>
-  A media playlist. See [`VoicePlaylist`][voiceplaylist].
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of playback events can be found [here][callplayback-events]. Example event: [`onStarted`][callplayback-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallPlayback`][callplayback]>
-
-A promise that resolves to a [`CallPlayback`][callplayback] object that you can use to
-view the current state and results of the `play` session.
-
-#### Example
-
-In this example, we dial a phone number and play a TTS message. Once the TTS message is finished playing, we then
-play silence on the call for 1 second and then play an audio file. Once the audio file is finished playing, we hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call and play a TTS message using the generic play method, then play silence for 1 second, then play an audio file.
-    call.answer();
-    const playlist = new Voice.Playlist({ volume: 1.0 })
-    .add(Voice.Playlist.TTS({
-      text: 'Welcome to SignalWire!'
-    }))
-    .add(Voice.Playlist.Silence({ duration: 1 }))
-    .add(Voice.Playlist.Audio({
-      url: 'https://cdn.signalwire.com/default-music/welcome.mp3'
-    }))
-    await call.play({
-      playlist: playlist,
-      listen: {
-        onStarted: () => console.log('Playback started!'),
-        onFailed: (playback) => console.log('Playback failed', playback.state),
-        onUpdated: (playback) => console.log('Playback state is:', playback.state),
-        onEnded: (playback) => {
-          console.log('Playback ended', playback.state);
-          // Hangup the call
-          call.hangup();
-        },
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### playAudio
-
-- **playAudio**(`params`): `Promise`\<[`CallPlayback`][callplayback]>
-
-Plays an audio file.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for playing audio.
-</ParamField>
-
-<Indent>
-<ParamField path="url" type="string" required>
-  HTTP(s) URL to an audio resource to play.
-</ParamField>
-
-<ParamField path="volume" type="number" default="0">
-  Volume value between -40dB and +40dB where 0 is unchanged.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of playback events can be found [here][callplayback-events]. Example event: [`onStarted`][callplayback-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallPlayback`][callplayback]>
-
-A promise that resolves to a [`CallPlayback`][callplayback] object that you can use to
-view the current state and results of the `play` session.
-
-#### Example
-
-In this example, we dial a phone number and play an audio file. Once the audio file is finished playing, we hangup the call.
-We also listen for playback events.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call and play an audio file. Listens for playback events. Ends the call after the audio file is finished playing.
-    call.answer();
-    await call.playAudio({
-      url: "https://cdn.signalwire.com/default-music/welcome.mp3",
-      listen: {
-        onStarted: () => console.log("Started playing"),
-        onFailed: () => console.log("Failed to play"),
-        onUpdated: (event) => console.log("Updated playing", event.state),
-        onEnded: (event) => {
-          console.log("Ended playing", event.state);
-          // Hangup the call
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### playRingtone
-
-- **playRingtone**(`params`): `Promise`\<[`CallPlayback`][callplayback]>
-
-Plays a ringtone.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for playing a ringtone.
-</ParamField>
-
-<Indent>
-<ParamField path="name" type="RingtoneName" required>
-  The name of the ringtone. See [`RingtoneName`][ringtonename].
-</ParamField>
-
-<ParamField path="duration" type="number">
-  Duration of ringtone to play in seconds. Defaults to 1 ringtone iteration.
-</ParamField>
-
-<ParamField path="volume" type="number" default="0">
-  Volume value between -40dB and +40dB where 0 is unchanged.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of playback events can be found [here][callplayback-events]. Example event: [`onStarted`][callplayback-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallPlayback`][callplayback]>
-
-A promise that resolves to a [`CallPlayback`][callplayback] object that you can use to
-view the current state and results of the `play` session.
-
-#### Example
-
-In this example, we dial a phone number and play a ringtone for a duration of 10 seconds.
-Once the ringtone is finished playing, we hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call and play a ringtone. Listens for playback events. Ends the call after the ringtone is finished playing for 10 seconds.
-    call.answer();
-    await call.playRingtone({
-      duration: 10,
-      name: "it",
-      listen: {
-        onStarted: () => console.log("Ringtone started"),
-        onFailed: () => console.log("Ringtone failed"),
-        onUpdated: (event) => console.log("Ringtone updated", event.state),
-        onEnded: (event) => {
-          console.log("Ringtone ended", event);
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### playSilence
-
-- **playSilence**(`params`): `Promise`\<[`CallPlayback`][callplayback]>
-
-Plays some silence.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for playing silence.
-</ParamField>
-
-<Indent>
-<ParamField path="duration" type="number" required>
-  Seconds of silence to play.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of playback events can be found [here][callplayback-events]. Example event: [`onStarted`][callplayback-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallPlayback`][callplayback]>
-
-A promise that resolves to a [`CallPlayback`][callplayback] object that you can use to
-view the current state and results of the `play` session.
-
-#### Example
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play Silence on the call for a duration of 3 seconds. Listens for playback events. Ends the call after the silence is finished playing.
-    await call.playSilence({
-      duration: 3,
-      listen: {
-        onStarted: () => console.log("Silence started"),
-        onFailed: () => console.log("Silence failed"),
-        onUpdated: (event) => console.log("Silence updated", event.state),
-        onEnded: (event) => {
-          console.log("Silence ended", event.state);
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### playTTS
-
-- **playTTS**(`params`): `Promise`\<[`CallPlayback`][callplayback]>
-
-Plays text-to-speech.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for playing text-to-speech.
-</ParamField>
-
-<Indent>
-<ParamField path="text" type="string" required>
-  Text to play. SSML may be entered as a string wrapped in `<speak>` tags. See our [supported voices and languages][supported-voices-languages] documentation for usage and supported tags.
-</ParamField>
-
-<ParamField path="language" type="string" default="en-US">
-  Language of the text in ISO 639-1 (language name) + ISO 3166 (country code). Supported languages can be found [here][supported-voices-languages].
-</ParamField>
-
-<ParamField path="gender" type='"male" | "female"' default="female">
-  Gender of the voice.
-</ParamField>
-
-<ParamField path="voice" type="string">
-  Voice to use (takes precedence over `gender`). Supported voices can be found [here][supported-voices-languages].
-</ParamField>
-
-<ParamField path="volume" type="number" default="0">
-  Volume value between -40dB and +40dB where 0 is unchanged.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of playback events can be found [here][callplayback-events]. Example event: [`onStarted`][callplayback-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallPlayback`][callplayback]>
-
-A promise that resolves to a [`CallPlayback`][callplayback] object that you can use to
-view the current state and results of the `play` session.
-
-#### Examples
-
-In this example, we dial a phone number and play a TTS message. Once the TTS message is finished playing, we hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play TTS on the call
-    await call.playTTS({
-      text: "Hello, this is a test call from SignalWire",
-      listen: {
-        onStarted: () => console.log("TTS started"),
-        onFailed: () => console.log("TTS failed"),
-        onUpdated: (tts) => console.log("TTS state:", tts.state),
-        onEnded: () => {
-          console.log("TTS ended");
-          // Hangup the call
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
-In this example, we are using [SSML][ssml] to play a TTS message. Once the TTS message is finished playing, we hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play TTS on the call using SSML. Listens for playback events. Ends the call after the TTS is finished playing.
-    await call.playTTS({
-      text: `<speak>
-      Here are <say-as interpret-as="characters">SSML</say-as> samples.
-      I can pause <break time="3s"/>.
-      I can speak in cardinals. Your number is <say-as interpret-as="cardinal">10</say-as>.
-      Or I can speak in ordinals. You are <say-as interpret-as="ordinal">10</say-as> in line.
-      Or I can even speak in digits. The digits for ten are <say-as interpret-as="characters">10</say-as>.
-      I can also substitute phrases, like the <sub alias="World Wide Web Consortium">W3C</sub>.
-      Finally, I can speak a paragraph with two sentences.
-      <p>
This is sentence one.

This is sentence two.
</p>
-    </speak>
-    `,
-      voice: "polly.Joey",
-      listen: {
-        onStarted: () => console.log("TTS started"),
-        onFailed: () => console.log("TTS failed"),
-        onUpdated: (tts) => console.log("TTS state:", tts.state),
-        onEnded: () => {
-          console.log("TTS ended");
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### prompt
-
-- **prompt**(`params`): `Promise`\<[`CallPrompt`][callprompt]>
-
-Generic method to prompt the user for input. 
-
-<Info>
-Take a look at [`promptAudio`][promptaudio], [`promptRingtone`][promptringtone], or [`promptTTS`][prompttts] for the more specific input methods.
-</Info>
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for prompting the user for input.
-</ParamField>
-
-<Indent>
-<ParamField path="playlist" type="VoicePlaylist" required>
-  A media playlist to play. See [`VoicePlaylist`][voiceplaylist].
-</ParamField>
-
-<ParamField path="digits" type="CollectDigitsConfig">
-  Configuration for collecting digits. You must either set this, or `speech`. See [`CollectDigitsConfig`][collectdigitsconfig].
-</ParamField>
-
-<ParamField path="speech" type="CollectSpeechConfig">
-  Configuration for collecting speech. You must either set this, or `digits`. Pass an empty object to use the default configuration. See [`CollectSpeechConfig`][collectspeechconfig].
-</ParamField>
-
-<ParamField path="initialTimeout" type="number" default="4">
-  Initial timeout in seconds.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of prompt events can be found [here][callprompt]. Example event: [`onStarted`][callprompt-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallPrompt`][callprompt]>
-
-A promise that resolves to a [`CallPrompt`][callprompt] object that you can use to
-view the current state and results of the `prompt` session.
-
-#### Examples
-
-**Digits Example**
-
-In this example, we dial a phone number and prompt for digits. After the digits are entered or a timeout occurs, the prompt session will end and return the digits results,
-and the call will hangup.
-We also listen for prompt events.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Prompt for digits. After the digits are entered or a timeout occurs, the prompt session will end and return the digits results, and the call will hangup.
-    await call.prompt({
-      playlist: new Voice.Playlist().add(
-        Voice.Playlist.TTS({ text: "Please enter your PIN number."})
-      ),
-      digits: {
-        max: 4,
-        digitTimeout: 10,
-        terminators: "#*"
-      },
-      listen: {
-        onStarted: () => console.log("Prompt started!"),
-        onFailed: () => console.log("Prompt failed!"),
-        onUpdated: (promptResult) => console.log("Prompt updated!", promptResult.result),
-        onEnded: (promptResult) => {
-          console.log("Prompt ended!", promptResult.result);
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
-**Speech Example**
-
-In this example, we dial a phone number and prompt for speech. After the speech is entered or a timeout occurs, the call will hangup.
-We also listen for prompt events.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Prompt for speech. After the speech is entered or a timeout occurs, the call will hangup.
-    await call.prompt({
-      playlist: new Voice.Playlist().add(
-        Voice.Playlist.TTS({ text: "Please enter your PIN number."})
-      ),
-      speech: {
-        model: "enhanced.phone_call"
-      },
-      listen: {
-        onStarted: () => console.log("Prompt started!"),
-        onFailed: () => console.log("Prompt failed!"),
-        onUpdated: (promptResult) => console.log("Prompt updated!", promptResult.result),
-        onEnded: (promptResult) => {
-          console.log("Prompt ended!", promptResult.result);
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### promptAudio
-
-- **promptAudio**(`params`): `Promise`\<[`CallPrompt`][callprompt]>
-
-Play an audio while collecting user input from the call, such as `digits` or `speech`.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for prompting the user for input while playing audio.
-</ParamField>
-
-<Indent>
-<ParamField path="url" type="string" required>
-  HTTP(s) URL to an audio resource to play.
-</ParamField>
-
-<ParamField path="digits" type="CollectDigitsConfig">
-  Configuration for collecting digits. You must either set this, or `speech`. See [`CollectDigitsConfig`][collectdigitsconfig].
-</ParamField>
-
-<ParamField path="speech" type="CollectSpeechConfig">
-  Configuration for collecting speech. You must either set this, or `digits`. Pass an empty object to use the default configuration. See [`CollectSpeechConfig`][collectspeechconfig].
-</ParamField>
-
-<ParamField path="initialTimeout" type="number" default="4">
-  Initial timeout in seconds.
-</ParamField>
-
-<ParamField path="volume" type="number" default="0">
-  Volume value between -40dB and +40dB where 0 is unchanged.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of prompt events can be found [here][callprompt]. Example event: [`onStarted`][callprompt-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallPrompt`][callprompt]>
-
-A promise that resolves to a [`CallPrompt`][callprompt] object that you can use to
-view the current state and results of the `prompt` session.
-
-#### Examples
-
-**Digits Example**
-
-In this example, we dial a phone number and prompt for `digits` while playing audio in the background.
-After the digits are entered or a timeout occurs, the prompt session will end and return the digits results,
-and the call will hangup.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play audio on the call while prompting for digits. After the digits are entered or a timeout occurs, the prompt session will end and return the digits results, and the call will hangup.
-    await call.promptAudio({
-      url: "https://cdn.signalwire.com/default-music/welcome.mp3",
-      digits: {
-        max: 4,
-        digitTimeout: 10,
-        terminators: "#*"
-      },
-      listen: {
-        onStarted: () => console.log("Prompt started!"),
-        onFailed: () => console.log("Prompt failed!"),
-        onUpdated: (promptResult) => console.log("Prompt updated!", promptResult.result),
-        onEnded: (promptResult) => {
-          console.log("Prompt ended!", promptResult.result);
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
-**Speech Example**
-
-In this example, we dial a phone number and prompt for `speech` while playing audio in the background.
-After the digits are entered or a timeout occurs, the prompt session will end and return the digits results,
-and the call will hangup.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play TTS on the call
-    await call.promptAudio({
-      url: "https://cdn.signalwire.com/default-music/welcome.mp3",
-      speech: {
-        model: "enhanced.phone_call",
-      },
-      listen: {
-        onStarted: () => console.log("Prompt started!"),
-        onFailed: () => console.log("Prompt failed!"),
-        onUpdated: (promptResult) => console.log("Prompt updated!", promptResult.result),
-        onEnded: (promptResult) => {
-          console.log("Prompt ended!", promptResult.result);
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### promptRingtone
-
-- **promptRingtone**(`params`): `Promise`\<[`CallPrompt`][callprompt]>
-
-Play a ringtone while collecting user input from the call, such as `digits` or `speech`.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for prompting the user for input while playing a ringtone.
-</ParamField>
-
-<Indent>
-<ParamField path="name" type="RingtoneName" required>
-  The name of the ringtone. See [`RingtoneName`][ringtonename].
-</ParamField>
-
-<ParamField path="digits" type="CollectDigitsConfig">
-  Configuration for collecting digits. You must either set this, or `speech`. See [`CollectDigitsConfig`][collectdigitsconfig].
-</ParamField>
-
-<ParamField path="speech" type="CollectSpeechConfig">
-  Configuration for collecting speech. You must either set this, or `digits`. Pass an empty object to use the default configuration. See [`CollectSpeechConfig`][collectspeechconfig].
-</ParamField>
-
-<ParamField path="duration" type="number">
-  Duration of ringtone to play in seconds. Defaults to 1 ringtone iteration.
-</ParamField>
-
-<ParamField path="initialTimeout" type="number" default="4">
-  Initial timeout in seconds.
-</ParamField>
-
-<ParamField path="volume" type="number" default="0">
-  Volume value between -40dB and +40dB where 0 is unchanged.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of prompt events can be found [here][callprompt]. Example event: [`onStarted`][callprompt-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallPrompt`][callprompt]>
-
-A promise that resolves to a [`CallPrompt`][callprompt] object that you can use to
-view the current state and results of the `prompt` session.
-
-#### Examples
-
-**Digits Example**
-
-In this example, we dial a phone number and prompt for `digits` while playing a ringtone in the background.
-After the digits are entered or a timeout occurs, the prompt session will end and return the digits results,
-and the call will hangup.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play TTS on the call
-    await call.promptRingtone({
-
-      name: "it",
-      duration: 10,
-      digits: {
-        max: 5,
-        digitTimeout: 5,
-        terminators: "#*",
-      },
-      listen: {
-        onStarted: () => console.log("Prompt Ringtone started"),
-        onFailed: () => console.log("Prompt Ringtone failed"),
-        onUpdated: (event) => console.log("Prompt Ringtone updated", event.result),
-        onEnded: (event) => {
-          console.log("Prompt Ringtone ended", event.result);
-          // Hangup the call
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
-**Speech Example**
-
-In this example, we dial a phone number and prompt for `speech` while playing a ringtone in the background.
-After the ringtone ends, we hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play TTS on the call
-    await call.promptRingtone({
-
-      name: "it",
-      duration: 10,
-      speech: {
-        model: "enhanced.phone_call"
-      },
-      listen: {
-        onStarted: () => console.log("Prompt Ringtone started"),
-        onFailed: () => console.log("Prompt Ringtone failed"),
-        onUpdated: (event) => console.log("Prompt Ringtone updated", event.result),
-        onEnded: (event) => {
-          console.log("Prompt Ringtone ended", event.result);
-          // Hangup the call
-          call.hangup();
-        }
-      }
-    }).onStarted()
-  }
-});
-```
-
----
-
-### promptTTS
-
-- **promptTTS**(`params`): `Promise`\<[`CallPrompt`][callprompt]>
-
-Play text-to-speech while collecting user input from the call, such as `digits` or `speech`.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for prompting the user for input while playing text-to-speech.
-</ParamField>
-
-<Indent>
-<ParamField path="text" type="string" required>
-  Text to play. SSML may be entered as a string wrapped in `<speak>` tags. See our [supported voices and languages][supported-voices-languages] documentation for usage and supported tags.
-</ParamField>
-
-<ParamField path="digits" type="CollectDigitsConfig">
-  Configuration for collecting digits. You must either set this, or `speech`. See [`CollectDigitsConfig`][collectdigitsconfig].
-</ParamField>
-
-<ParamField path="speech" type="CollectSpeechConfig">
-  Configuration for collecting speech. You must either set this, or `digits`. Pass an empty object to use the default configuration. See [`CollectSpeechConfig`][collectspeechconfig].
-</ParamField>
-
-<ParamField path="language" type="string" default="en-US">
-  Language of the text in ISO 639-1 (language name) + ISO 3166 (country code). Supported languages can be found [here][supported-voices-languages].
-</ParamField>
-
-<ParamField path="gender" type='"male" | "female"' default="female">
-  Gender of the voice.
-</ParamField>
-
-<ParamField path="voice" type="string">
-  Voice to use (takes precedence over `gender`). Supported voices can be found [here][supported-voices-languages].
-</ParamField>
-
-<ParamField path="initialTimeout" type="number" default="4">
-  Initial timeout in seconds.
-</ParamField>
-
-<ParamField path="volume" type="number" default="0">
-  Volume value between -40dB and +40dB where 0 is unchanged.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of prompt events can be found [here][callprompt]. Example event: [`onStarted`][callprompt-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallPrompt`][callprompt]>
-
-A promise that resolves to a [`CallPrompt`][callprompt] object that you can use to
-view the current state and results of the `prompt` session.
-
-#### Examples
-
-**Digits Example**
-
-In this example, we dial a phone number and prompt for `digits` while playing TTS in the background.
-After the digits are entered or a timeout occurs, the prompt session will end and return the digits results,
-and the call will hangup.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play TTS on the call
-    await call.promptTTS({
-      text: "Please enter your 5 digit pin number.",
-      duration: 10,
-      digits: {
-        max: 5,
-        digitTimeout: 5,
-        terminators: "#*",
-      },
-      listen: {
-        onStarted: () => console.log("Prompt TTS started"),
-        onFailed: () => console.log("Prompt TTS failed"),
-        onUpdated: (event) => console.log("Prompt TTS updated", event.result),
-        onEnded: (event) => {
-          console.log("Prompt TTS ended", event.result);
-          // Hangup the call
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
-**Speech Example**
-
-In this example, we dial a phone number and prompt for `speech` while playing TTS in the background.
-After the user speaks or a timeout occurs, the prompt session will end and return the speech results, 
-and the call will hangup.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play TTS on the call
-    await call.promptTTS({
-      text: "Please say your name.",
-      duration: 10,
-      speech: {
-        model: "enhanced.phone_call"
-      },
-      listen: {
-        onStarted: () => console.log("Prompt TTS started"),
-        onFailed: () => console.log("Prompt TTS failed"),
-        onUpdated: (event) => console.log("Prompt TTS updated", event.result),
-        onEnded: (event) => {
-          console.log("Prompt TTS ended", event.result)
-          // Hangup the call
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
-**SSML Example**
-
-In this example, we are using [SSML][ssml] to play a TTS message.
-We dial a phone number and prompt for `digits` while playing TTS in the background.
-After the digits are entered or a timeout occurs, the prompt session will end and return the digits results,
-and the call will hangup.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-    // Play TTS on the call
-    await call.promptTTS({
-      text: `<speak>
-        Please enter your <say-as interpret-as="characters">UUID</say-as>.
-        It should be a <say-as interpret-as="cardinal">5</say-as> digit number.
-      </speak>`,
-      voice: "polly.Joey",
-      duration: 20,
-      digits: {
-        max: 5,
-        digitTimeout: 20,
-        terminators: "#*",
-      },
-      listen: {
-        onStarted: () => console.log("Prompt TTS started"),
-        onFailed: () => console.log("Prompt TTS failed"),
-        onUpdated: (event) => console.log("Prompt TTS updated", event.result),
-        onEnded: (event) => {
-          console.log("Prompt TTS ended", event.result)
-          // Hangup the call
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### record
-
-- **record**(`params`): `Promise`\<[`CallRecording`][callrecording]>
-
-Generic method to record a call. 
-
-<Tip>
-
-Please use [`recordAudio`][recordaudio].
-
-</Tip>
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for recording the call.
-</ParamField>
-
-<Indent>
-<ParamField path="audio" type="object" required>
-  Audio recording configuration. See the parameters for [recordAudio][recordaudio].
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of recording events can be found [here][callrecording]. Example event: [`onStarted`][callrecording-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallRecording`][callrecording]>
-
-A promise that resolves to a [`CallRecording`][callrecording] object that you can use to
-view the current state and results of the `recording` session.
-
-#### Example
-
-In this example, we dial a phone number and record the call audio.
-During the recording, we play a TTS message. Once the TTS message is finished, we hangup the call
-and print the URL of the recording to console.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-
-    await call.record({
-      audio: {
-        format: "mp3",
-        direction: "both",
-        stereo: true,
-        beep: true,
-        terminators: "#",
-        endSilenceTimeout: 0,
-        initialTimeout: 0
-      },
-      listen: {
-        onStarted: async (recording) => {
-          console.log("Recording started");
-          await call.playTTS({
-            text: "This is a call recording test."
-          });
-          recording.stop();
-        },
-        onFailed: () => console.log("Recording failed"),
-        onUpdated: (event) => console.log("Recording updated", event.state),
-        onEnded: (event) => {
-          console.log("Recording ended",  event.url, event.state)
-          call.hangup();
-        }
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### recordAudio [#voice_call_record_audio]
-
-- **recordAudio**(`params?`): `Promise`\<[`CallRecording`][callrecording]>
-
-Records the audio from the call.
-
-#### Parameters
-
-<ParamField path="params" type="object">
-  Object containing the parameters for recording audio.
-</ParamField>
-
-<Indent>
-<ParamField path="beep" type="boolean" default="false">
-  Whether to play a beep before recording.
-</ParamField>
-
-<ParamField path="format" type='"mp3" | "wav"' default="mp3">
-  Format of the recording.
-</ParamField>
-
-<ParamField path="stereo" type="boolean" default="false">
-  Whether to record in stereo mode.
-</ParamField>
-
-<ParamField path="direction" type='"listen" | "speak" | "both"' default="speak">
-  Direction to record. Can be `listen` (what the caller hears), `speak` (what the caller says), or `both`.
-</ParamField>
-
-<ParamField path="initialTimeout" type="number" default="5.0">
-  How long to wait (in seconds) until something is heard in the recording. Disable by passing `0`.
-</ParamField>
-
-<ParamField path="endSilenceTimeout" type="number" default="1.0">
-  How long to wait (in seconds) until the caller has stopped speaking. Disable by passing `0`.
-</ParamField>
-
-<ParamField path="terminators" type="string" default="#*">
-  DTMF digits that, when dialed, will end the recording.
-</ParamField>
-
-<ParamField path="inputSensitivity" type="number" default="44">
-  Controls how sensitive the voice activity detector is to background noise, where `0` is least sensitive (hear nothing) and `100` is most sensitive (hear everything).
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of recording events can be found [here][callrecording]. Example event: [`onStarted`][callrecording-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallRecording`][callrecording]>
-
-A promise that resolves to a [`CallRecording`][callrecording] object that you can use to
-view the current state and results of the `recording` session.
-
-#### Example
-
-In this example, we dial a phone number and record the call audio.
-During the recording, we play a TTS message. Once the TTS message is finished, we hangup the call
-and print the URL of the recording to console.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-
-    await call.recordAudio({
-      beep: true,
-      format: "mp3",
-      direction: "both",
-      initialTimeout: 0,
-      endSilenceTimeout: 0,
-      terminators: "#",
-      stereo: true,
-      listen: {
-        onStarted: async (recording) => {
-          console.log("Recording started");
-          await call.playTTS({
-            text: "This is a call recording test.",
-        });
-          // Stop the recording after the TTS is played
-          recording.stop();
-        },
-        onFailed: () => {
-          console.log("Recording failed");
-        },
-        onUpdated: (recording) => {
-          console.log("Recording updated", recording.state);
-        },
-        onEnded: (recording) => {
-          console.log("Recording ended", recording.url, recording.state);
-          call.hangup();
-        },
-      }
-    }).onStarted();
-  }
-});
-```
-
----
-
-### sendDigits
-
-- **sendDigits**(`digits`): `Promise`\<[`Call`][call]>
-
-Play DTMF digits to the other party on the call.
-
-#### Parameters
-
-<ParamField path="digits" type="string" required>
-  The DTMF digits to send to the other party on the call.
-</ParamField>
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-A promise that resolves to the current `Call` object.
-
-#### Example
-
-In this example, we dial a phone number and send DTMF tones to the other party on the call.
-After the tones are sent, we hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    call.answer();
-
-    // Send DTMF tones to the Inbound leg of the call
-    await call.sendDigits("123")
-    console.log("DTMF tones sent!");
-    call.hangup();
-
-  }
-});
-```
-
----
-
-### tap
-
-- **tap**(`params`): `Promise`\<[`CallTap`][calltap]>
-
-Intercept call media and stream it to the specified WebSocket endpoint.
-Prefer using [tapAudio][tapaudio] if you only need to tap audio.
-
-<Warning>
-
-This is an experimental method. The destination must be a hosted WebSocket/RTP server, with an address that SignalWire can reach.
-
-A current limitation of this method is that the destination device does not receive any metadata regarding the origin of the stream.
-
-</Warning>
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for tapping the call.
-</ParamField>
-
-<Indent>
-<ParamField path="device" type="TapDevice" required>
-  Destination device. Can be either WebSocket or RTP. See [`TapDevice`][tapdevice].
-</ParamField>
-
-<ParamField path="audio" type="object" required>
-  An object with the configuration for audio tapping. See audio parameters below.
-</ParamField>
-
-<Indent>
-<ParamField path="direction" type='"listen" | "speak" | "both"' required>
-  Direction to tap. Can be `"listen"` (what the caller hears), `"speak"` (what the caller says), or `"both"`.
-</ParamField>
-</Indent>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of tap events can be found [here][calltap]. Example event: [`onStarted`][calltap-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallTap`][calltap]>
-
-A promise that resolves to a [`CallTap`][calltap] object that you can use to
-view the current state and results of the `tap` session.
-
-#### Example
-
-In this example, we dial a phone number and tap the call audio
-to a WebSocket endpoint. After the call is tapped, we play a TTS message
-to the caller, and then stop the tap and hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    await call.answer();
-
-    // Start a tap
-    const callTap = await call.tap({
-      device: {
-        type: "ws",
-        uri: "wss://example.domain.com/websocket_endpoint"
-      },
-      audio: {
-        direction: "both",
-      },
-      listen: {
-        onStarted: () => {
-          console.log("Tap started");
-        },
-        onEnded: () => {
-          console.log("Tap ended");
-        },
-      }
-    }).onStarted();
-    await call.playTTS({ text: "We are currently tapping the call audio." });
-    // Stop the tap
-    await callTap.stop();
-    call.hangup();
-  }
-});
-```
-
----
-
-### tapAudio
-
-- **tapAudio**(`params`): `Promise`\<[`CallTap`][calltap]>
-
-Intercept call audio and stream it to the specified WebSocket endpoint.
-
-<Warning>
-
-This is an experimental method. The destination must be a hosted WebSocket/RTP server, with an address that SignalWire can reach.
-
-A current limitation of this method is that the destination device does not receive any metadata regarding the origin of the stream.
-
-</Warning>
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for tapping the call audio.
-</ParamField>
-
-<Indent>
-<ParamField path="device" type="TapDevice" required>
-  Destination device. Can be either WebSocket or RTP. See [`TapDevice`][tapdevice].
-</ParamField>
-
-<ParamField path="direction" type='"listen" | "speak" | "both"' required>
-  Direction to tap. Can be `"listen"` (what the caller hears), `"speak"` (what the caller says), or `"both"`.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Callback to listen for events. List of tap events can be found [here][calltap]. Example event: [`onStarted`][calltap-onstarted].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`CallTap`][calltap]>
-
-A promise that resolves to a [`CallTap`][calltap] object that you can use to
-view the current state and results of the `tap` session.
-
-#### Example
-
-In this example, we dial a phone number and tap the call audio
-to a WebSocket endpoint. After the call is tapped, we play a TTS message
-to the caller, and then stop the tap and hangup the call.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    await call.answer();
-
-    // Start a tap
-    const callTap = call.tapAudio({
-      direction: "both",
-      device: {
-        type: "ws",
-        uri: "wss://example.domain.com/websocket_endpoint"
-      },
-      listen: {
-        onStarted: () => {
-          console.log("Tap started");
-        },
-        onEnded: () => {
-          console.log("Tap ended");
-        }
-      }
-    }).onStarted();
-    await call.playTTS({ text: "We are currently tapping the call audio." });
-    // Stop the tap
-    await callTap.stop();
-    call.hangup();
-  }
-});
-```
-
----
-
-### waitFor
-
-- **waitFor**(`params`): `Promise<boolean>`
-
-Returns a promise that is resolved only after the current call is in one of the specified states.
-
-#### Parameters
-
-<ParamField path="params" type='"ended" | "ending" | ("ended" | "ending")[]' required>
-  The call state(s) to wait for.
-</ParamField>
-
-#### Returns
-
-`Promise<boolean>`
-
-A promise that resolves to `true` if the call is in one of the specified states, or `false` if the call is ended.
-
-#### Example
-
-In this example, we dial a phone number and play a TTS message.
-After the TTS message is finished, we hangup the call and wait for the call to end
-before printing a message to console.
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice;
-
-// Listen for incoming calls
-await voiceClient.listen({
-
-  topics: ["office"],
-  onCallReceived: async (call) => {
-    console.log("Call received");
-    // Answer the call
-    await call.answer();
-
-    // play TTS
-    await call.playTTS({ text: "Hello World" });
-
-    call.hangup();
-
-    call.waitFor("ended").then(() => {
-      console.log("Call ended");
-    });
-  }
-});
-```
-
----
-
-## **Events**
-
-This following examples demonstrate listening to all collect sessions within the application.
-
-<Tip>
-
-A `listen` can be passed on the call object as a method, or directly inside certain sessions as a parameter.
-To listen to a specific event within a single session, use `listen` at the parameter level.
-
-</Tip>
-
-### onStateChanged
-
-- **Call.listen**(`{ onStateChanged: Callback }`)
-
-Emitted when the state of the call changes. Your event handler
-will be called with an instance of the [`CallState`][callstate] object.
-
-#### Parameters
-
-<ParamField path="call" type="CallState" required>
-  A [`Call`][call] object containing the call state. See [`CallState`][callstate].
-</ParamField>
-
-### onCollectEnded
-
-- **Call.listen**(`{ onCollectEnded: Callback }`)
-
-Emitted when a collect session has ended. Your event handler
-will be called with an instance of the [`CallCollect`][callcollect] object.
-
-#### Parameters
-
-<ParamField path="collect" type="CallCollect" required>
-  A [`CallCollect`][callcollect] object.
-</ParamField>
-
-### onCollectFailed
-
-- **Call.listen**(`{ onCollectFailed: Callback }`)
-
-Emitted when a collect session has failed. Your event handler
-will be called with an instance of the [`CallCollect`][callcollect] object.
-
-#### Parameters
-
-<ParamField path="collect" type="CallCollect" required>
-  A [`CallCollect`][callcollect] object.
-</ParamField>
-
-### onCollectInputStarted [#voice_call_oncollectinputstarted]
-
-- **Call.listen**(`{ onCollectInputStarted: Callback }`)
-
-Emitted when a collect session has started. Your event handler
-will be called with an instance of the [`CallCollect`][callcollect] object.
-
-#### Parameters
-
-<ParamField path="collect" type="CallCollect" required>
-  A [`CallCollect`][callcollect] object.
-</ParamField>
-
-### onCollectStarted
-
-- **Call.listen**(`{ onCollectStarted: Callback }`)
-
-Emitted when a collect session has started. Your event handler
-will be called with an instance of the [`CallCollect`][callcollect] object.
-
-#### Parameters
-
-<ParamField path="collect" type="CallCollect" required>
-  A [`CallCollect`][callcollect] object.
-</ParamField>
-
-### onCollectUpdated
-
-- **Call.listen**(`{ onCollectUpdated: Callback }`)
-
-Emitted when the state of a collect session has changed. Your event handler
-will be called with an instance of the [`CallCollect`][callcollect] object.
-
-#### Parameters
-
-<ParamField path="collect" type="CallCollect" required>
-  A [`CallCollect`][callcollect] object.
-</ParamField>
-
-### onDetectEnded
-
-- **Call.listen**(`{ onDetectEnded: Callback }`)
-
-Emitted when a call detection session has ended. Your event handler
-will be called with an instance of the [`CallDetect`][calldetect] object.
-
-#### Parameters
-
-<ParamField path="detect" type="CallDetect" required>
-  A [`CallDetect`][calldetect] object.
-</ParamField>
-
-### onDetectStarted
-
-- **Call.listen**(`{ onDetectStarted: Callback }`)
-
-Emitted when a call detection session has started. Your event handler
-will be called with an instance of the [`CallDetect`][calldetect] object.
-
-#### Parameters
-
-<ParamField path="detect" type="CallDetect" required>
-  A [`CallDetect`][calldetect] object.
-</ParamField>
-
-### onDetectUpdated
-
-- **Call.listen**(`{ onDetectUpdated: Callback }`)
-
-Emitted when the state of a call detection session has changed. Your event handler
-will be called with an instance of the [`CallDetect`][calldetect] object.
-
-#### Parameters
-
-<ParamField path="detect" type="CallDetect" required>
-  A [`CallDetect`][calldetect] object.
-</ParamField>
-
-### onPlaybackEnded
-
-- **Call.listen**(`{ onPlaybackEnded: Callback }`)
-
-Emitted when a playback has ended. Your event handler
-will be called with an instance of the [`CallPlayback`][callplayback] object.
-
-#### Parameters
-
-<ParamField path="playback" type="CallPlayback" required>
-  A [`CallPlayback`][callplayback] object.
-</ParamField>
-
-### onPlaybackFailed
-
-• **Call.listen**(`{ onPlaybackFailed: Callback }`)
-
-Emitted when a playback has failed. Your event handler
-will be called with an instance of the [`CallPlayback`][callplayback] object.
-
-#### Parameters
-
-<ParamField path="playback" type="CallPlayback" required>
-  A [`CallPlayback`][callplayback] object.
-</ParamField>
-
-### onPlaybackStarted
-
-- **Call.listen**(`{ onPlaybackStarted: Callback }`)
-
-Emitted when a playback has started. Your event handler
-will be called with an instance of the [`CallPlayback`][callplayback] object.
-
-#### Parameters
-
-<ParamField path="playback" type="CallPlayback" required>
-  A [`CallPlayback`][callplayback] object.
-</ParamField>
-
-### onPlaybackUpdated
-
-- **Call.listen**(`{ onPlaybackUpdated: Callback }`)
-
-Emitted when the state of a playback has changed. Your event handler
-will be called with an instance of the [`CallPlayback`][callplayback] object.
-
-#### Parameters
-
-<ParamField path="playback" type="CallPlayback" required>
-  A [`CallPlayback`][callplayback] object.
-</ParamField>
-
-### onPromptEnded
-
-- **Call.listen**(`{ onPromptEnded: Callback }`)
-
-Emitted when a prompt has ended. Your event handler
-will be called with an instance of the [`CallPrompt`][callprompt] object.
-
-#### Parameters
-
-<ParamField path="prompt" type="CallPrompt" required>
-  A [`CallPrompt`][callprompt] object.
-</ParamField>
-
-### onPromptFailed
-
-- **Call.listen**(`{ onPromptFailed: Callback }`)
-
-Emitted when a prompt has failed. Your event handler
-will be called with an instance of the [`CallPrompt`][callprompt] object.
-
-#### Parameters
-
-<ParamField path="prompt" type="CallPrompt" required>
-  A [`CallPrompt`][callprompt] object.
-</ParamField>
-
-### onPromptStarted
-
-- **Call.listen**(`{ onPromptStarted: Callback }`)
-
-Emitted when a prompt has started. Your event handler
-will be called with an instance of the [`CallPrompt`][callprompt] object.
-
-#### Parameters
-
-<ParamField path="prompt" type="CallPrompt" required>
-  A [`CallPrompt`][callprompt] object.
-</ParamField>
-
-### onPromptUpdated
-
-- **Call.listen**(`{ onPromptUpdated: Callback }`)
-
-Emitted when the state of a prompt has changed. Your event handler
-will be called with an instance of the [`CallPrompt`][callprompt] object.
-
-#### Parameters
-
-<ParamField path="prompt" type="CallPrompt" required>
-  A [`CallPrompt`][callprompt] object.
-</ParamField>
-
-### onRecordingEnded
-
-- **Call.listen**(`{ onRecordingEnded: Callback }`)
-
-Emitted when a recording has ended. Your event handler
-will be called with an instance of the [`CallRecording`][callrecording] object.
-
-#### Parameters
-
-<ParamField path="recording" type="CallRecording" required>
-  A [`CallRecording`][callrecording] object.
-</ParamField>
-
-### onRecordingFailed
-
-- **Call.listen**( `{ onRecordingFailed: Callback }`)
-
-Emitted when a recording has failed. Your event handler
-will be called with an instance of the [`CallRecording`][callrecording] object.
-
-#### Parameters
-
-<ParamField path="recording" type="CallRecording" required>
-  A [`CallRecording`][callrecording] object.
-</ParamField>
-
-### onRecordingStarted
-
-- **Call.listen**(`{ onRecordingStarted: Callback }`)
-
-Emitted when a recording has started. Your event handler
-will be called with an instance of the [`CallRecording`][callrecording] object.
-
-#### Parameters
-
-<ParamField path="recording" type="CallRecording" required>
-  A [`CallRecording`][callrecording] object.
-</ParamField>
-
-### onRecordingUpdated
-
-- **Call.listen**(`{ onRecordingUpdated: Callback }`)
-
-Emitted when the state of a recording has changed. Your event handler
-will be called with an instance of the [`CallRecording`][callrecording] object.
-
-#### Parameters
-
-<ParamField path="recording" type="CallRecording" required>
-  A [`CallRecording`][callrecording] object.
-</ParamField>
-
-### onTapEnded
-
-- **Call.listen**(`{ onTapEnded: Callback }`)
-
-Emitted when a tap has ended. Your event handler
-will be called with an instance of the [`CallTap`][calltap] object.
-
-#### Parameters
-
-<ParamField path="tap" type="CallTap" required>
-  A [`CallTap`][calltap] object.
-</ParamField>
-
-### onTapStarted
-
-- **Call.listen**(`{ onTapStarted: Callback }`)
-
-Emitted when a tap has started. Your event handler
-will be called with an instance of the [`CallTap`][calltap] object.
-
-#### Parameters
-
-<ParamField path="tap" type="CallTap" required>
-  A [`CallTap`][calltap] object.
-</ParamField>
diff --git a/fern/products/realtime-sdk/pages/latest/tech-ref/voice/voice-client.mdx b/fern/products/realtime-sdk/pages/latest/tech-ref/voice/voice-client.mdx
deleted file mode 100644
index 795d61baa..000000000
--- a/fern/products/realtime-sdk/pages/latest/tech-ref/voice/voice-client.mdx
+++ /dev/null
@@ -1,292 +0,0 @@
----
-id: 30eb8900-82d6-41a6-8617-ce82c83c4433
-title: "Client"
-keywords: SignalWire, Realtime SDK, Node.js, voice client, call management, voice application
-slug: reference/voice/client
-description: Voice Client reference for initiating and receiving phone calls. Includes methods for dialing, listening to events, and managing active calls.
-max-toc-depth: 3
----
-
-[call-events]: ./voice-call.mdx#events
-[call]: ./voice-call.mdx
-[dialphone]: #dialphone
-[dialsip]: #dialsip
-[events]: #events
-[signalwire-realtime-client]: ../realtime-client/index.mdx
-[sipheader]: ./types.mdx#sipheader
-[voicedevicebuilder]: ./voice-devicebuilder.mdx
-
-You can use instances of this class to initiate or receive calls. Please see [Events][events] for the full list of events you can subscribe to.
-
-## **Voice Client**
-
-### Setting up a Voice Client
-To create a `Voice` client, you will need to create a [`SignalWire Realtime-Client`][signalwire-realtime-client] first.
-After the `SignalWire Client` is created, you can access the `Voice` client using the `voice` namespace.
-
-#### Example
-```javascript
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice
-```
-
----
-
-## **Methods**
-
-### dial
-
-- **dial**(`params`): `Promise`\<[`Call`][call]>
-
-Makes an outbound Call and waits until it has been answered or hung up. This is an advanced method that lets you call multiple devices in parallel or series: for simpler use cases, see [dialPhone][dialphone] and [dialSip][dialsip].
-
-With this method you can specify a configuration of devices to call in series and/or in parallel: as soon as one device answers the call, the returned promise is resolved. You specify a configuration through a [VoiceDeviceBuilder][voicedevicebuilder] object.
-
-#### Parameters
-
-<ParamField path="params" type="VoiceDeviceBuilder" required>
-  The device builder specifying the devices to call. See [`VoiceDeviceBuilder`][voicedevicebuilder].
-</ParamField>
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-A call object.
-
-#### Example
-
-Calls a phone number. If the number doesn't answer within 30 seconds, calls two different SIP endpoints in parallel.
-
-```js
-import { SignalWire, Voice } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice
-
-const devices = new Voice.DeviceBuilder()
-  .add(Voice.DeviceBuilder.Phone({ from: "+XXXXXX", to: "+YYYYYY", timeout: 30 }))
-  .add([
-    Voice.DeviceBuilder.Sip({ from: "sip:aaa@bbb.cc", to: "sip:xxx@yyy.zz" }),
-    Voice.DeviceBuilder.Sip({ from: "sip:aaa@bbb.cc", to: "sip:ppp@qqq.rr" })
-  ]);
-
-try {
-  const call = await voiceClient.dial(devices);
-  console.log("Call answered", call);
-} catch (e) {
-  console.log("Call not answered", e);
-}
-```
-
----
-
-### dialPhone
-
-- **dialPhone**(`params`): `Promise`\<[`Call`][call-5]>
-
-Makes an outbound call to a PSTN number.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for dialing a phone number.
-</ParamField>
-
-<Indent>
-<ParamField path="to" type="string" required>
-  The party you are attempting to call.
-</ParamField>
-
-<ParamField path="from" type="string">
-  The party the call is coming from. Must be a SignalWire number or SIP endpoint that you own.
-</ParamField>
-
-<ParamField path="timeout" type="number">
-  The time, in seconds, the call will ring before it is considered unanswered.
-</ParamField>
-
-<ParamField path="maxPricePerMinute" type="number">
-  The maximum price in USD acceptable for the call to be created. If the rate for the call is greater than this value, the call will not be created. If not set, all calls will be created. Price can have a maximum of four decimal places, i.e. `0.0075`.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Object that contains callbacks to listen for events. List of Call events can be found [here][call-events].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-A call object.
-
-#### Example
-
-```js
-import { SignalWire, Voice } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice
-
-try {
-  const call = await voiceClient.dialPhone({
-    from: "+YYYYYYYYYY",
-    to: "+XXXXXXXXXX",
-    timeout: 30
-  });
-  console.log("Call answered.", call);
-} catch (e) {
-  console.log("Call not answered.", e);
-}
-```
-
----
-
-### dialSip
-
-- **dialSip**(`params`): `Promise`\<[`Call`][call-5]>
-
-Makes an outbound call to a SIP endpoint.
-
-#### Parameters
-
-<ParamField path="params" type="object" required>
-  Object containing the parameters for dialing a SIP endpoint.
-</ParamField>
-
-<Indent>
-<ParamField path="from" type="string" required>
-  The party the call is coming from. Must be a SignalWire number or SIP endpoint that you own.
-</ParamField>
-
-<ParamField path="to" type="string" required>
-  The party you are attempting to call.
-</ParamField>
-
-<ParamField path="timeout" type="number">
-  The time, in seconds, the call will ring before it is considered unanswered.
-</ParamField>
-
-<ParamField path="headers" type="SipHeader[]">
-  Array of [`SipHeader`][sipheader] objects. Must be X- headers only, see example below.
-</ParamField>
-
-<ParamField path="codecs" type="SipCodec[]">
-  Optional array of desired codecs in order of preference. Supported values are `PCMU`, `PCMA`, `OPUS`, `G729`, `G722`, `VP8`, `H264`. Default is parent leg codec(s).
-</ParamField>
-
-<ParamField path="webrtcMedia" type="boolean">
-  If `true`, WebRTC media is negotiated. Default is parent leg setting.
-</ParamField>
-
-<ParamField path="sessionTimeout" type="number">
-  Non-negative value, in seconds, to use for the SIP `Session-Expires` header. If `0` or unset, SignalWire will pick the default (typically `600`).
-</ParamField>
-
-<ParamField path="maxPricePerMinute" type="number">
-  The maximum price in USD acceptable for the call to be created. If the rate for the call is greater than this value, the call will not be created. If not set, all calls will be created. Price can have a maximum of four decimal places, i.e. `0.0075`.
-</ParamField>
-
-<ParamField path="listen" type="object">
-  Object that contains callbacks to listen for events. List of Call events can be found [here][call-events].
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise`\<[`Call`][call]>
-
-A call object.
-
-#### Example
-
-```js
-import { SignalWire, Voice } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here" })
-
-const voiceClient = client.voice
-
-try {
-  const call = await voiceClient.dialSip({
-    from: "sip:xxx@yyy.zz",
-    to: "sip:ppp@qqq.rr",
-    timeout: 30,
-    headers: [
-      { name: "X-SomeKeyA", value: "SomeValueA" },
-      { name: "X-SomeKeyB", value: "SomeValueB" }
-    ]
-  });
-  console.log("Call answered.", call);
-} catch (e) {
-  console.log("Call not answered.", e);
-}
-```
-
----
-
-### listen
-
-- **listen**(`{event: Callback }`): `Promise<Call Events>`
-
-Listens for Voice events.
-
-#### Parameters
-
-<ParamField path="listenOptions" type="object" required>
-  Object containing the parameters of the method.
-</ParamField>
-
-<Indent>
-<ParamField path="topics" type="string[]" required>
-  Topics to listen on. Previously known as `"contexts"`.
-</ParamField>
-
-<ParamField path="EVENT" type="Callback">
-  The event to listen to. List of events can be found [here][events]. Example event: `onCallReceived`.
-</ParamField>
-</Indent>
-
-#### Returns
-
-`Promise<Call Events>` - See [Call Events][link] for the full list of events you can listen to.
-
-#### Example
-
-```js
-import { SignalWire } from "@signalwire/realtime-api";
-
-const client = await SignalWire({ project: "ProjectID Here", token: "Token Here"})
-
-const voiceClient = client.voice;
-
-await voiceClient.listen({
-  topics: ["office"],
-  onCallReceived: (call) => {
-    call.answer();
-    console.log("Call received", call);
-  }
-});
-```
-
----
-
-## **Events**
-
-### onCallReceived [#oncallreceived]
-
-- **client.voice.listen**(`{ onCallReceived: Callback }`)
-
-Emitted when a call is received. Your event handler will be called with a [`Call`][call-7] object.
-
-#### Parameters
-
-<ParamField path="call" type="Call" required>
-  The incoming [`Call`][call-7] object.
-</ParamField>
diff --git a/fern/products/realtime-sdk/pages/v2/guides/index.mdx b/fern/products/realtime-sdk/pages/v2/guides/index.mdx
deleted file mode 100644
index 6fef2e89f..000000000
--- a/fern/products/realtime-sdk/pages/v2/guides/index.mdx
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: c0e88962-6e8d-4608-a09e-311ae2bc6f8f
-title: Guides
-slug: guides
-description: Step-by-step tutorials for building voice and messaging applications with the SignalWire Realtime SDK v2. Deprecated - consider upgrading to v4.
-max-toc-depth: 3
----
-
-This section contains guides for using the SignalWire Realtime SDK.
-
-<CardGroup cols={2}>
-  <Card title="Migration Guide (v2 to v3)" href="/realtime-sdk/v2/guides/v2-vs-v3">
-    Guide for migrating from SDK v2 to v3
-  </Card>
-  <Card title="Stop Robocalls" href="/realtime-sdk/v2/guides/voice/stop-robocalls-with-signalwires-communication-api">
-    Build a robocall blocker with SignalWire's Communication API
-  </Card>
-</CardGroup>
diff --git a/fern/products/realtime-sdk/pages/v2/guides/voice/stop-robocalls-with-signalwires-communication-api.mdx b/fern/products/realtime-sdk/pages/v2/guides/voice/stop-robocalls-with-signalwires-communication-api.mdx
deleted file mode 100644
index 383dcd07e..000000000
--- a/fern/products/realtime-sdk/pages/v2/guides/voice/stop-robocalls-with-signalwires-communication-api.mdx
+++ /dev/null
@@ -1,309 +0,0 @@
----
-id: e39988a0-9bb4-472b-804f-a43959fa94ed
-title: Stop Robocalls with SignalWire's Communication API
-slug: guides/stop-robocalls
-x-custom:
-  ported_from_readme: true
-  repo: https://github.com/signalwire/spam-call-filter-example
-description: Learn how to stop robocalls with the SignalWire Realtime SDK v2.
-max-toc-depth: 3
-sidebar_custom_props:
-  platform: javascript
-  github: https://github.com/signalwire/spam-call-filter-example
-layout: guide
----
-
-[captcha]: https://en.wikipedia.org/wiki/CAPTCHA
-[full-application-on-github]: https://github.com/signalwire/spam-call-filter-example
-[getting-started-with-relay]: https://github.com/signalwire/signalwire-guides/blob/master/intros/getting_started_relay.md
-[github]: https://github.com/signalwire/spam-call-filter-example
-[here-1]: https://signalwire.com
-[here]: https://signalwire.com/signup
-[lenny]: https://en.wikipedia.org/wiki/Lenny_(bot)
-[navigating-your-signalwire-space]: https://my.signalwire.com/?page=credentials
-[node-persist]: https://github.com/simonlast/node-persist
-[on-the-trial-mode-resource-page]: https://signalwire.com/resources/getting-started/trial-mode
-[relay-documentation]: /realtime-sdk/v2/language/nodejs
-[signalwire-101]: https://signalwire.com/resources/getting-started/signalwire-101
-[signalwire-relay-sdk]: /realtime-sdk/
-[the-getting-started-with-relay]: https://github.com/signalwire/signalwire-guides/blob/master/intros/getting_started_relay.md
-
-# Stopping Robocalls with a CAPTCHA - Node.js (Relay v2)
-
-
-Robocalling and spam calls have been increasing in number over the past few years. Only in the US, there were 165.1 million robocalls placed in 2020, an average of 14.1 per person, including children and people who do not have a phone! SignalWire can help with its communication technology, which allows us to easily create a robocall protection service.
-
-By the end of this guide, we will have a fully-functional call forwarding service with a voice CAPTCHA to determine if the caller is a human. If they are, it forwards the call to your phone number or another number you configured as the destination.
-
-A [CAPTCHA][captcha] is an automated mechanism used to determine if the user of a service is a human or a machine. You have certainly interacted with visual ones such as "pick all of the pictures with a boat in it" on websites. In this application, we ask the caller for the result of the sum of two random numbers.
-
-In case the incoming caller is determined to be a spammer, it is sent straight to Lenny (more on that below), and it is flagged as a robo-call if someone tries to answer the CAPTCHA three times and fails. If the caller solves the CAPTCHA, their call gets forwarded to the configured private phone number for the DID.
-
-Once the calls are connected, the user that received the call on their private number can press `**` on their DTMF keypad at any time: 
-this will instantly flag the caller as spammer and add it to the database. 
-That way, if a human unwanted caller makes it through the CAPTCHA, they can still be banned.
-
-### What is Lenny?
-
-[Lenny][lenny]>) is one of the most widely known anti-spam chatbots, designed to waste the time of telemarketers.
-
-It is a set of connected audio files, spoken in a somewhat-Australian accent, that uses generic phrases such as "Are you there?" to lure a spammer into a long conversation about its "family", a supposed very smart daughter, or other topics. The average time wasted for a spam call is over 10 minutes, and it is also very fun to listen to recordings.
-
-The bot itself is simple in its ingenuity, but setting up your own version has always been complicated due to needing some telephony infrastructure and a bit of logic. The SignalWire Communication API makes it easy to do.
-
-### What do I need to run this code?
-
-As with all SignalWire scripts, you will need your API credentials (**SignalWire Space URL, Project ID, and API token**) from your SignalWire Space. For more information on how to find this information, you can read more about [Navigating your SignalWire Space][navigating-your-signalwire-space]!
-
-The application uses [node-persist][node-persist], a simple file-based database, to keep track of flagged numbers and automatically reject calls. In a production application, you would maybe use a different database such as PostgreSQL. Every phone number is saved and remembered, so any callers who you want to receive calls from will automatically get through the second time they dial-in. Spammers, on the other hand, will just be sent to have a chat with Lenny!
-
-Lastly, you will also need to have the [SignalWire RELAY SDK][signalwire-relay-sdk] installed.
-
-<Warning title="Remember">
-
-The application database is persistent, so you will have to remove the `.node-persist` folder in the directory to reset the database if you would like to test multiple times with the same number, or your call will be handled automatically as a spammer or a human depending on how you responded the first time.
-
-</Warning>
-
-Find the code for this application on [GitHub][github]!
-
-## Configuring the Code
-
-Start by copying the `env.example` file to a file named `.env`, and fill in the necessary information.
-
-The application needs a SignalWire API token. You can sign up [here][here], then put the Project ID and Token in the `.env` file as `SIGNALWIRE_PROJECT_ID` and `SIGNALWIRE_API_TOKEN`.
-
-You also need to configure a phone number where legitimate calls will be forwarded. This can be any number (i.e., your personal number), and you can set it up in the `.env` file as `MY_NUMBER`.
-
-Finally, you need a DID (phone number) that people will call instead of dialing your own number directly. For this, buy a phone number from your SignalWire Dashboard, then configure it to handle incoming calls using `Relay Application`, with the same Relay context name that you configure in `.env` as `SIGNALWIRE_CONTEXT`. By default, the example config file uses `captcha` as context name.
-
-## Running the Application
-
-If you are running the application locally, run `npm install` followed by `npm start`.
-
-You can also run the application via Docker, by first building the image with `docker build -t nodelenny .` followed by ` docker run -it --rm -v ``pwd``/.node-persist:/app/.node-persist --name nodelenny --env-file .env nodelenny `.
-
-If you prefer, you can just run `sh run_docker.sh` in your shell and the container will be built and started for you. To test the code, give a call to the phone number you set up above and prepare for a simple math quiz... unless you are a robot!
-
-## Code Breakdown
-
-Let's now walk through the more interesting code snippets.
-
-### Overall Organization
-
-The application is composed of four files:
-
-- index.js, the entry point,
-- captcha.js, for the implementation of the captcha,
-- transfer.js, for connecting to the real phone number after the captcha is solved, and
-- lenny.js, for having fun with human spammers
-
-The possible paths that a call can take are defined in index.js in the form of a state machine:
-
-```
-             +--> HANGUP <---+
-             |               |
-      START -+--> CAPTCHA ---+    (captcha.js)
-             |       |       |
-             |       v       |
-             +--> TRANSFER --+    (transfer.js)
-             |       |       |
-             |       v       |
-             +---> LENNY ----+    (lenny.js)
-```
-
-Right after the application is started, we create a RELAY Consumer to connect with SignalWire:
-
-```js
-const { RelayConsumer } = require('@signalwire/node');
-
-const consumer = new RelayConsumer({
-  project: process.env.SIGNALWIRE_PROJECT_ID,
-  token: process.env.SIGNALWIRE_API_TOKEN,
-  contexts: [process.env.SIGNALWIRE_CONTEXT],
-  onIncomingCall: onIncomingCallHandler,
-});
-
-consumer.run();
-```
-
-Whenever someone calls a number which we have associated to the same topic specified in `SIGNALWIRE_CONTEXT`, the RELAY Consumer will call our `onIncomingCallHandler` function. In there, we first answer the call:
-
-```js
-await call.answer();
-```
-
-We start recording:
-
-```js
-const recordResult = await call.record({
-  direction: "both",
-  initial_timeout: 10,
-  end_silence_timeout: 0,
-  stereo: true,
-});
-
-console.log("Recording the call to " + recordResult.url);
-```
-
-And we go into the `START` state. From there, is the caller is not known yet (i.e., is not in our db), we will switch to the `CAPTCHA` state.
-
-### The CAPTCHA
-
-The CAPTCHA implementation can be found in the `captcha.js` file. In there, we first play a text-to-speech message to assert the current state of the call:
-
-```js
-await call.playTTS({
-  text: "Hello! To complete your call, Please verify you are a human, by dialing or speaking the answer to this simple question.",
-  gender: "male"
-});
-```
-
-Then we generate two digits at random, and we prompt the user for the sum of those numbers:
-
-```js
-const digit1 = Math.floor(Math.random() * 10);
-const digit2 = Math.floor(Math.random() * 10);
-const expectedAnswer = digit1 + digit2;
-
-const result = await call.promptTTS({
-  type: 'both',
-  digits_max: 2,
-  digits_timeout: 10,
-  digits_terminators: "#",
-  speech_timeout: 10,
-  speech_end_silence_timeout: 2,
-  text: "What is " + digit1 + " plus " + digit2 + "?",
-  gender: "male"
-});
-```
-
-At this point the user will hear, for example: "What is 3 plus 9?". They can answer either by speaking, or by using the keypad. We find the answer in the `result` variable:
-
-```js
-if (result.digits.trim() == expectedAnswer || result.text.includes(expectedAnswer.toString())) {
-  await call.playTTS({
-    text: "That is correct. You are probably a human, enjoy your call!",
-    gender: "male"
-  });
-  storage.set(call.from, { isHuman: true });
-  return true;
-}
-```
-
-### Transfering the Call
-
-If the captcha is solved successfully, or if the caller is a known legitimate human, they are transferred to the real phone number. In `transfer.js`, you can see how to connect the currently active call (`call`) to our real phone number:
-
-```js
-const dial = await call.connect({
-  type: "phone", 
-  to: destinationNumber,
-  from: call.from,
-  timeout: 30
-});
-```
-
-At this point we have:
-
-- `call`, the original call, and
-- `dial.call`, the nested call to our real phone number
-
-Now comes the interesting part. Say that a human spammer has been able to get to this point. We want to let the user mark them as a spammer while they're speaking. We'll do that by dialing `**`. As soon as the user dials `**`, we hangup the nested phone call and connect the spammer to Lenny for an endless meaningless conversation.
-
-First, we connect an event to detect the digits that the user dials:
-
-```js
-// Detect if the user presses '**'. If so, mark caller as spammer.
-let dialed = "";
-dial.call.on('detect.update', async (call, params) => {
-  if (params.detect.type === 'digit') {
-    const digit = params.detect.params.event;
-    console.log('Dialed', digit);
-    dialed += digit;
-
-    if (dialed.endsWith('**')) {
-      console.log('Marking as scammer');
-      await storage.set(call.from, { isHuman: true, isScammer: true });
-      dial.call.hangup(); // Hangup the nested call
-    }
-  }
-});
-```
-
-Then, we start the actual detection of the digits:
-
-```js
-// Start the asynchronous detection
-await dial.call.detectAsync({
-  type: 'digit',
-  timeout: 0
-});
-```
-
-The detection runs asynchronously while the user speaks.
-
-### Lenny
-
-<Warning title="Don't use this in production!">
-
-We are showing how to transfer the call to Lenny just for teaching purposes! In real applications, you may want to skip this step, otherwise you will be charged for all the minutes during which Lenny is talking!
-
-</Warning>
-
-If the current caller has been marked as a spammer by dialing `**`, or if they were a known spammer to begin with, the result is the same: they are sent to Lenny.
-
-Lenny consists in a sequence of audio files with the voice of a convincing old man. The sentences that Lenny uses are general enough to be appropriate for a large set of contexts: it is going to take a while before the spammer realizes they're talking with a record player!
-
-How does Lenny know when to start speaking, so to avoid talking over the other person? Surprisingly, Lenny is quite simple. First, we simply play an audio (we pick audio files in sequence):
-
-```js
-await call.playAudio({
-  url: lennyConfig.soundBase + "/" + lennyConfig.responses[responseId],
-  volume: 20
-});
-```
-
-Then, in order to wait for whatever the other person is replying, we use `prompt` (the same function we used for the captcha), using as audio a light background noise:
-
-```js
-await call.prompt({
-  type: 'speech',
-  speech_end_silence_timeout: 1.0,
-  media: [
-    {
-      type: 'audio',
-      url: lennyConfig.soundBase + "/" + lennyConfig.background
-    }
-  ]
-});
-```
-
-And that's it!
-
-## Conclusion
-
-Now you have a powerful and persistent way to prevent robocalls from hitting your personal phone or your businesses' phones, brought to you by the power of the SignalWire Communication APIs. To see a live demonstration of this application at work, feel free to watch our previous LIVEWire on it below.
-
-<iframe
-  width="560"
-  height="315"
-  src="https://www.youtube.com/embed/gn7Z8xB58gc"
-  title="YouTube video player"
-  frameborder="0"
-  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
-  allowfullscreen
-></iframe>
-
-## Get Started With SignalWire
-
-You can sign up for a new SignalWire Space [here][here-1]! If you sign up for the first time, your account will start in trial mode, which you can exit by making a manual top up of $5.00. You can find more information [on the Trial Mode resource page][on-the-trial-mode-resource-page].
-
-You can find more information, including where to get your credentials and how to set up the phone number, in [the Getting Started with RELAY][the-getting-started-with-relay] guide.
-
-Here are some other resources that may be helpful for you:
-
-- [**Full Application on GitHub**][full-application-on-github]
-- [RELAY Documentation][relay-documentation]
-- [Getting Started with RELAY][getting-started-with-relay]
-- [SignalWire 101][signalwire-101]
\ No newline at end of file
diff --git a/fern/products/realtime-sdk/pages/v3/guides/index.mdx b/fern/products/realtime-sdk/pages/v3/guides/index.mdx
deleted file mode 100644
index 693789cc5..000000000
--- a/fern/products/realtime-sdk/pages/v3/guides/index.mdx
+++ /dev/null
@@ -1,27 +0,0 @@
----
-id: 1207f582-ef0d-4c71-8ae3-752f2fc540af
-title: Guides
-slug: guides
-description: Step-by-step tutorials for building voice and messaging applications with the SignalWire Realtime SDK v3. Learn to make calls, send SMS, and more.
-max-toc-depth: 3
-layout: guide
----
-
-This section contains guides for building real-time communication applications with the SignalWire Realtime SDK v3.
-
-<CardGroup cols={2}>
-  <Card
-    title="Voice Guides"
-    href="/realtime-sdk/v3/guides/voice/first-steps-with-voice"
-    icon="fa-solid fa-phone"
-  >
-    Build voice applications including call handling, voicemail, and IVRs
-  </Card>
-  <Card
-    title="Messaging Guides"
-    href="/realtime-sdk/v3/guides/messaging/first-steps-with-messaging"
-    icon="fa-solid fa-message"
-  >
-    Send and receive SMS/MMS messages, forward texts to email, and more
-  </Card>
-</CardGroup>
diff --git a/fern/products/realtime-sdk/pages/v3/guides/messaging/first-steps-with-messaging.mdx b/fern/products/realtime-sdk/pages/v3/guides/messaging/first-steps-with-messaging.mdx
deleted file mode 100644
index 9ebec2e4e..000000000
--- a/fern/products/realtime-sdk/pages/v3/guides/messaging/first-steps-with-messaging.mdx
+++ /dev/null
@@ -1,131 +0,0 @@
----
-id: 8c092675-74d7-41cb-8a8f-439ac3500625
-title: First Steps with Messaging with the Realtime SDK
-slug: guides/messaging/first-steps-with-messaging
-max-toc-depth: 3
-x-custom:
-  ported_from_readme: true
-description: Learn how to send and receive SMS messages with the SignalWire Realtime SDK.
-sidebar_custom_props:
-  platform: javascript
-layout: guide
----
-
-[buy-a-new-phone-number]: /platform/phone-numbers/getting-started/buying-a-phone-number
-[campaign-registry-everything-you-need-to-know]: /messaging/get-started/campaign-registry
-[log-in]: https://signalwire.com/signin
-
-Send and receive SMS messages from your own Node.js application.
-
-## Installation
-
-First, you need to obtain the Realtime SDK. If you are using npm or yarn, from
-your terminal you can run the following command:
-
-```shell npm2yarn
-npm install @signalwire/realtime-api@~3
-```
-
-Then, you can include the package in JavaScript as follows:
-
-```js
-import { Messaging } from "@signalwire/realtime-api";
-```
-
-## Obtaining and configuring a number
-
-[Log in][log-in] to your SignalWire Space.
-From the Phone Numbers section, you can
-[buy a new phone number][buy-a-new-phone-number].
-You will need at least one number to send and receive messages.
-After you have acquired a number, open its settings by clicking on "Edit Settings".
-Scroll down until you reach "Messaging Settings", as shown in the next figure, and configure it to:
-
-- handle messages using a RELAY application,
-- forward the call to the "office" RELAY context
-
-<Frame caption="Number configuration setting for handling Messages.">
-
-![The Messaging Settings page.](/assets/images/dashboard/relay/app_message_handler.webp)
-
-</Frame>
-
-<Info title="Context">
-In RELAY V3, a context is a named scope that allows you to group resources together. 
-When you configure a phone number to handle messages with a RELAY application 
-and specify a context, all messages to that number will be delivered to RELAY 
-clients listening on that context.
-</Info>
-
-<Info title="Ensuring message delivery">
-
-If you are sending messages to the US from a 10DLC number, you _must_ register your traffic with the Campaign Registry.
-Otherwise, the carriers will not deliver your messages.
-Please see our [**Campaign Registry - Everything You Need To Know**][campaign-registry-everything-you-need-to-know]
-guide for more information.
-
-</Info>
-
-## Sending your first message
-
-To send a message from Node.js you need to instantiate a Messaging client, and then call its `send` method.
-
-```js
-import { Messaging } from "@signalwire/realtime-api";
-
-const client = new Messaging.Client({
-  project: "your-project-id",
-  token: "your-api-token",
-  contexts: ["office"],
-});
-
-try {
-  const status = await client.send({
-    context: "office",
-    from: "+1xxx", // The number you bought from SignalWire
-    to: "+1yyy",
-    body: "Hello World!",
-  });
-
-  console.log(status);
-} catch (e) {
-  console.error(e);
-}
-```
-
-We used the "office" context in two places:
-first, when initializing the Messaging client.
-Then, when calling `send`.
-You use the `contexts` array in the Client constructor to specify the list of contexts you want to listen to for events.
-Instead, the `context` in the `send` method determines the `context` to associate to the message.
-If the two contexts match, your Client will receive events (`message.updated`) for this outgoing message too.
-
-You also need to specify a Project ID and API token: find these in the API
-section of your Space, as shown in the following figure. Make sure that your
-token has the "Messaging" scope enabled.
-
-<Frame caption="You can find your Project ID and Token from the API tab in your SignalWire Space. Make sure your token has the 'Messaging' scope enabled." >
-
-![The API page.](/assets/images/dashboard/credentials/api-credentials.webp)
-
-</Frame>
-
-## Receiving incoming messages
-
-Once a Client is initialized, you can listen for incoming messages on the
-selected contexts (in our example, just "office"). For example:
-
-```js
-client.on("message.received", (message) => {
-  console.log("Message received:", message);
-});
-```
-
-Your event handler receives a message object, which you can use to access fields
-such as `message.body`, `message.from`, `message.to`, etc.
-
-## Next steps
-
-Congratulations!
-You can now send and receive messages with your Node.js application.
-You are now ready to explore the advanced guides in the Messaging section from the left menu.
\ No newline at end of file
diff --git a/fern/products/realtime-sdk/pages/v3/guides/messaging/forwarding-texts-to-email-nodejs.mdx b/fern/products/realtime-sdk/pages/v3/guides/messaging/forwarding-texts-to-email-nodejs.mdx
deleted file mode 100644
index cfc4b1c8d..000000000
--- a/fern/products/realtime-sdk/pages/v3/guides/messaging/forwarding-texts-to-email-nodejs.mdx
+++ /dev/null
@@ -1,158 +0,0 @@
----
-id: b9ff9d38-6a88-4041-a836-0c29772995d8
-title: Forwarding Texts to Email
-slug: guides/messaging/forwarding-texts-to-email-nodejs
-max-toc-depth: 3
-x-custom:
-  ported_from_readme: true
-  repo: https://github.com/signalwire/guides/tree/main/Messaging/Forward%20Messages%20to%20Email%20-%20NodeJS
-description: Learn how to forward texts to an email address using the SignalWire Realtime SDK.
-sidebar_custom_props:
-  platform: javascript
-layout: guide
----
-
-[buy-one]: /platform/phone-numbers/getting-started/buying-a-phone-number
-[github-1]: https://github.com/signalwire/guides/tree/main/Messaging/Forward%20Messages%20to%20Email%20-%20NodeJS
-[github-repo-1]: https://github.com/signalwire/guides/tree/main/Messaging/Forward%20Messages%20to%20Email%20-%20NodeJS
-[github-repo]: https://github.com/signalwire/guides/tree/main/Messaging/Forward%20Messages%20to%20Email%20-%20NodeJS
-[mailgun-1]: https://www.mailgun.com/
-[mailgun-api-1]: https://www.mailgun.com/
-[navigating-your-signalwire-space-2]: https://my.signalwire.com?page=credentials
-[relay-realtime-sdk-1]: /realtime-sdk/
-[signalwire-s-relay-realtime-api]: /realtime-sdk/
-
-This guide will show you how to write a webhook to handle incoming text messages to a SignalWire phone number and forward them to an email address.
-
-We will write a simple server that listens for a message event from SignalWire when an SMS is received, then uses Mailgun.js to send an email.
-
-## What You Need to Run This Code
-
-- You can find the full code for this application on
-[GitHub][github-1].
-- You will need a [Mailgun][mailgun-1] API key and Domain.
-- You will need your SignalWire credentials (i.e., Space URL, Project ID, and API token). These can be found in the [API Credentials][navigating-your-signalwire-space-2] page of your SignalWire Dashboard.
-- You will also need to visit your SignalWire Space to set up your SignalWire phone number message handler.
-
-### Configuring the phone number
-
-First, we need to create a new RELAY Application resource.
-To do so, go to the "Resources" section from your sidebar, and create a new RELAY ApplicationResource.
-
-![RELAY Application resource selector with cXML highlighted.](/assets/images/dashboard/resources/add-new-relay-application.webp)
-
-When configuring the RELAY Application, set the context to "office" (to match what we have in the code).
-
-<Markdown src="/snippets/dashboard/ui-accordion.mdx" />
-
-If you don't have a phone
-number yet, make sure to [buy one][buy-one]. You
-will need at least one number to receive messages.
-
-You can do that from the "Phone Numbers" section in the Sidebar. Go to the Settings page of the number you
-want to configure. In the `Inbound Message Settings` section, assign your RELAY application.
-
-![Assign Resource.](/assets/images/dashboard/phone-numbers/assign-resource-full.webp)
-
-<Accordion 
-  title="If you're on the Legacy UI"
-  defaultOpen={false}
->
-
-You don't need to create a new resource for your call.
-
-Simply open the settings for the number you want to configure, and under "**Inbound Message Settings**", 
-choose to handle incoming messages using "RELAY Application", and set the context to "office" to match the code.
-
-![legacy UI RELAY application configuration.](/assets/images/dashboard/legacy/number-message-config-relay.webp)
-
-</Accordion>
-
-<Info title="Note on Email Delivery Service">
-
-Feel free to use the email delivery service of your choice. Our example will use Mailgun, but this implementation works just as well with other services. Just check their documentation for how to call their API.
-
-</Info>
-
-## How to Run the Application
-
-### Build and Run on Docker
-
-Start by building the image with `docker build -t smstoemail .` Then run the container with the command `docker run -it --rm -p 3000:3000 --name smstoemail --env-file .env smstoemail`.
-
-### Build and Run Natively
-
-If you would like to run it natively, clone the [GitHub repo][github-repo] and run it with `npm start` in your terminal.
-
-## Code Walkthrough
-
-Within the repo, we will work with two files:
-
-- `.env.sample` which will serve as a template for your `.env` file
-- `index.js` where you will find the main application code.
-
-### Set Your Environment Variables
-
-1. Copy from `.env.sample` and fill in your values.
-
-You will need a SignalWire phone number as well as your API Credentials (API Token, Space URL, and Project ID) from within the API tab of your SignalWire Space. If you need help finding these values, please see the [Navigating your SignalWire Space][navigating-your-signalwire-space-2] guide.
-
-You will also need your Credentials from the MailGun API.
-
-2. Save the filled-in file as `.env`.
-
-### The Application
-
-This code is quite simple. We will create a Node.js script, listen for incoming SMS messages with the [SignalWire's RELAY Realtime API][signalwire-s-relay-realtime-api], and send an email in response to each message event with Mailgun.js.
-
-Then we connect to the SignalWire RELAY Realtime API:
-
-```javascript
-require("dotenv").config();
-let { Messaging } = require("@signalwire/realtime-api");
-
-const swClient = new Messaging.Client({
-  project: process.env.PROJECT_ID,
-  token: process.env.API_TOKEN,
-  contexts: ["office"],
-});
-```
-
-Finally, we set an event listener for incoming SMS messages which will trigger a network call to Mailgun to send an email with the SMS message and details:
-
-```javascript
-swClient.on("message.received", (message) => {
-  let date = new Date().toISOString();
-  let body = message.body;
-  let from = message.from;
-  let to = message.to;
-  let media = message.media;
-  let data = {
-    from: process.env.EMAIL_FROM,
-    to: process.env.EMAIL_TO,
-    subject: "Incoming Message to " + to,
-    text: `At ${date} you received a message from ${from} to ${to}. The message body was: '${body}'. 
-    The included media was: ${media}`,
-  };
-
-  mgClient.messages
-    .create(process.env.MAILGUN_DOMAIN, data)
-    .then((res) => {
-      console.log(data);
-      console.log(res);
-    })
-    .catch((err) => {
-      console.error(err);
-    });
-});
-```
-
-## Wrap Up
-
-When dealing with SMS messages on a large scale, you may want to convert them into a more manageable format. This guide has demonstrated one possibility by converting them to emails using a remarkable short script of code.
-
-### Resources
-
-- [GitHub Repo][github-repo-1]
-- [Mailgun API][mailgun-api-1]
-- [RELAY Realtime SDK][relay-realtime-sdk-1]
\ No newline at end of file
diff --git a/fern/products/realtime-sdk/pages/v3/guides/messaging/send-sms-from-the-browser-using-node-js.mdx b/fern/products/realtime-sdk/pages/v3/guides/messaging/send-sms-from-the-browser-using-node-js.mdx
deleted file mode 100644
index a8cf294f1..000000000
--- a/fern/products/realtime-sdk/pages/v3/guides/messaging/send-sms-from-the-browser-using-node-js.mdx
+++ /dev/null
@@ -1,195 +0,0 @@
----
-id: b11cb040-7a54-46ed-873d-e8374dd9ee5a
-title: Sending SMS from the Browser
-slug: guides/messaging/send-sms-from-the-browser-using-node-js
-max-toc-depth: 3
-x-custom:
-  ported_from_readme: true
-  repo: https://github.com/signalwire/guides/tree/main/Messaging/Sending%20SMS%20from%20the%20Browser%20-%20NodeJS
-description: Learn how to send SMS from the browser using the SignalWire Realtime SDK.
-sidebar_custom_props:
-  platform: javascript
-layout: guide
----
-
-[community-discord]: https://discord.com/invite/F2WNYTNjuF
-[create-a-signalwire-account-and-space]: https://m.signalwire.com/signups/new?s=1
-[first-steps-with-messaging-1]: ./first-steps-with-messaging
-[github-repo]: https://github.com/signalwire/guides/tree/main/Messaging/Sending%20SMS%20from%20the%20Browser%20-%20NodeJS
-[here-2]: https://m.signalwire.com/signups/new?s=1
-[here]: https://github.com/signalwire/guides/tree/main/Messaging/Sending%20SMS%20from%20the%20Browser%20-%20NodeJS
-[navigating-your-signalwire-space]: https://my.signalwire.com/?page=credentials
-[realtime-sdk-1]: /realtime-sdk/
-[signalwire-realtime-sdk-1]: /realtime-sdk/
-[this-project]: https://github.com/signalwire/guides/tree/main/Messaging/Sending%20SMS%20from%20the%20Browser%20-%20NodeJS
-
-This guide will use SignalWire's Messaging API to create a simple web application that can send SMS through the browser.
-
-## What do I need?
-
-Find the full code on Github [here][here].
-
-You will need the [SignalWire Realtime SDK][signalwire-realtime-sdk-1] running on Node.js. It'll help if you are familiar with the Express framework.
-
-Additionally, you will need a SignalWire account which you can create [here][here-2]. From your SignalWire Space, you need your [SignalWire API credentials][navigating-your-signalwire-space].
-
-## Trying it out
-
-### Run Natively
-
-Navigate to [this project][this-project]
-in the SignalWire Guides GitHub Repo, and follow the instructions in README.md.
-
-<Info title="This example should not be used in a live environment">
-
-Exposing this web app to a live endpoint means anybody with the URL could send SMS requests through your SignalWire Space.
-
-</Info>
-
-## Code Walkthrough
-
-The main code for this demo (`index.js`) is a very simple file server with a minimal backend with a single route (`/sendSMS`). The file server delivers `index.html` to the user's browser.
-
-To perform API calls to the SignalWire servers, we need to send some authentication information: Project ID and the API token. This information is sensitive, so we take special precautions in storing them. We keep them in the `.env` file and add a rule on `.gitignore` to not push the `.env` file to GitHub. And while we're at it, we also store the phone number in the `.env` file, for ease of maintenance.
-
-### Server-side code
-
-#### Set-up
-
-The server-side code for this is very simple. First, we will import the required packages, set our environment variables, and create a client that will handle our SMS requests.
-
-```javascript
-require("dotenv").config();
-const { Messaging } = require("@signalwire/realtime-api");
-
-const sendingPhoneNumber = process.env.PHONE_NUMBER;
-
-const client = new Messaging.Client({
-  project: process.env.PROJECT_ID,
-  token: process.env.API_TOKEN,
-});
-```
-
-#### Index Route
-
-Next, we will write some code to serve the client-side code (`index.html`). When integrating this project, this may not be needed depending on how you're hosting the frontend.
-
-```javascript
-app.use("/", express.static("html")); // serve the html folder
-```
-
-#### Create SMS Handler Route
-
-Finally, for our server-side, we will create a route that actually handles the creation of our SMS requests to the client. We'll name it `/sendSMS`.
-
-First, we get the destination phone number and the SMS body from the client. We need to make sure that the values are legitimate. In particular, we need to make sure the phone number is in the required E.164 format. To do so, we call the `isE164PhoneNumber()` function provided by the `is-e164-phone-number` package on NPM. You can, of course, choose to validate the numbers however you like, including regular expressions. You might also want to verify that the destination country code is supported by you.
-
-We will try to send the message we retrieved from the client, and return a confirmation to the client. In this case, there is no validation if a message was delivered successfully, only that the request was created.
-
-Alternatively, if our conditions aren't met, we just assume something went wrong and return an error message to the client.
-
-While the rest of the parameters to `client.send` (`body`, `to`, `from`) are self-explanatory, the `context` parameter needs an introduction. It is used to segregate calls and messages (so you can, for example, subscribe to events from a group of phone numbers in the same context). For further information, please read [First steps with Messaging][first-steps-with-messaging-1].
-
-```javascript
-app.post("/sendSMS", async (req, res) => {
-  let { phoneno, body } = req.body;
-  if (typeof body !== "string" || body === "") return res.send("Invalid body");
-  if (!isE164PhoneNumber(phoneno)) return res.send("Invalid Phone Number");
-
-  console.log("Sending message to phone number", phoneno);
-  try {
-    const status = await client.send({
-      context: "office",
-      from: sendingPhoneNumber, // The number you bought from SignalWire
-      to: phoneno,
-      body,
-    });
-
-    console.log(status);
-    return res.send("Your SMS was sent");
-  } catch (e) {
-    console.error(e);
-    return res.send("Error sending SMS");
-  }
-});
-```
-
-### Client-side Code
-
-Our client-side code is just a simple HTML file `index.html` and its styling in `index.css`.
-
-Most of this code is just the default/boilerplate HTML. The heart of our client boils down to the `<body>`.
-
-First, we will create a new `<form>` with the action URL being our `/sendSMS` route. Note that we want to send the information as a POST request to `/sendSMS` route, which will be received by the `app.post('/sendSMS', ...)` function above.
-
-There we add two input fields, one for the destination phone number and one for the text. A button submits the information to the server.
-
-```html
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>SMS with SignalWire RealTime API</title>
-    <link rel="stylesheet" media="all" href="index.css" />
-  </head>
-  <body>
-    <div class="body">
-      <form method="POST" action="/sendSMS">
-        <h1>Send an SMS with SignalWire</h1>
-        <label>Phone Number</label>
-        <input type="input" placeholder="E.164 number like +18001234567" name="phoneno" />
-        <br />
-        <br />
-        Message:
-        <textarea name="body"></textarea>
-        <button>Send</button>
-      </form>
-    </div>
-  </body>
-</html>
-```
-
-```css index.css
-body {
-  margin: 0;
-  padding: 0;
-}
-.body {
-  width: 100vw;
-  height: 100vh;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-form {
-  width: 300px;
-  height: 300px;
-}
-
-label {
-  width: 100%;
-}
-input {
-  width: 100%;
-}
-textarea {
-  width: 100%;
-  max-width: 100%;
-  min-width: 100%;
-  max-height: 300px;
-}
-```
-
-## Wrap Up
-
-This is a simple and flexible way to allow data to be passed from the client to your server which can then be validated before we create requests to the SignalWire API! While this guide focuses on SMS, this same principle can be used to implement a wide variety of features into your web app!
-
-### Required Resources:
-
-[Github Repo][github-repo]  
-[RealTime SDK][realtime-sdk-1]
-
-## Sign Up Here
-
-If you would like to test this example out, [create a SignalWire account and Space][create-a-signalwire-account-and-space].
-
-Please feel free to reach out to us on our [Community Discord][community-discord] or create a Support ticket if you need guidance!
\ No newline at end of file
diff --git a/fern/products/realtime-sdk/pages/v3/guides/voice/first-steps-with-voice.mdx b/fern/products/realtime-sdk/pages/v3/guides/voice/first-steps-with-voice.mdx
deleted file mode 100644
index c85f7d121..000000000
--- a/fern/products/realtime-sdk/pages/v3/guides/voice/first-steps-with-voice.mdx
+++ /dev/null
@@ -1,109 +0,0 @@
----
-id: 198fbd9a-88c0-4839-9983-48cf2fbe66d8
-title: Making and Receiving Phone Calls
-slug: guides/voice/first-steps-with-voice
-max-toc-depth: 3
-x-custom:
-  author: danieleds
-description: Learn how to get started with voice with the SignalWire Realtime SDK.
-sidebar_custom_props:
-  platform: javascript
-layout: guide
----
-
-[buy-a-new-phone-number]: /platform/phone-numbers/getting-started/buying-a-phone-number
-[log-in]: https://signalwire.com/signin
-[realtime-sdk]: https://www.npmjs.com/package/@signalwire/realtime-api
-
-This introductory guide will show you how to make and receive calls from your own Node.js application.
-
-## Obtaining and configuring a number
-
-[Log in][log-in] to your SignalWire Space. From the Phone Numbers section, you can [buy a new phone number][buy-a-new-phone-number]. You will need at least one number to make and receive calls. After you have acquired a number, open its settings by clicking on "Edit Settings". Scroll down until you reach "Voice and Fax Settings", as shown in the next figure, and configure it to:
-
-- handle incoming calls using a RELAY application,
-- forward the call to the "office" RELAY context
-
-<Frame caption="Voice configuration setting for handling incoming calls.">
-
-![The Voice and Fax Settings pane.](/assets/images/dashboard/relay/app_voice_handler.webp)
-
-</Frame>
-
-<Info title="Context">
-In RELAY V3, a context is a named scope that allows you to group resources together. 
-When you configure a phone number to handle calls with a RELAY application 
-and specify a context, all calls to that number will be delivered to RELAY 
-clients listening on that context.
-</Info>
-
-## Installation of the SDK
-
-First, you need to obtain the [Realtime SDK][realtime-sdk] from npm. From your terminal you can run the following command to install it:
-
-```shell npm2yarn
-npm install --save @signalwire/realtime-api@~3
-```
-
-Then, include the package in JavaScript as follows:
-
-```js
-import { Voice } from "@signalwire/realtime-api";
-```
-
-### Making your first call
-
-To make a call from Node.js you need to instantiate a Voice client, and then call one of its dialing methods.
-
-```js
-import { Voice } from "@signalwire/realtime-api";
-
-const client = new Voice.Client({
-  project: "your-project-id",
-  token: "your-api-token",
-  contexts: ["office"],
-});
-
-try {
-  const call = await client.dialPhone({
-    from: "+1xxx", // Must be a number in your SignalWire Space
-    to: "+1yyy",
-    timeout: 30,
-  });
-
-  console.log("The call has been answered!", call.id);
-} catch (e) {
-  console.error(e);
-}
-```
-
-We used the "office" context when initializing the Voice client. You use the `contexts` array in the Client constructor to indicate which group of calls you want to receive. For the moment we are not listening for incoming calls, to the context doesn't have any effect. Still, it will be useful for later, when we are going to listen for incoming calls.
-
-You also need to specify a Project ID and API token: find these in the API section of your Space, as shown in the following figure. Make sure that your token has the "Voice" scope enabled.
-
-<Frame caption="You can find your Project ID and Token from the API tab in your SignalWire Space. Make sure your token has the 'Voice' scope enabled.">
-![the API tab, showing the Project ID, Space URL, and API Token.](/assets/images/dashboard/credentials/api-credentials.webp)
-</Frame>
-
-## Receiving incoming calls
-
-Once a Client is initialized, you can listen for incoming calls on the selected contexts (in our example, just "office"). For example:
-
-```js
-client.on("call.received", async (call) => {
-  console.log("Call received:", call.id, call.from, call.to);
-
-  try {
-    await call.answer();
-    console.log("Inbound call answered");
-  } catch (error) {
-    console.error("Error answering inbound call", error);
-  }
-});
-```
-
-Your event handler receives a call object, which you can use to answer the call, to access fields such as `call.from` and `call.to`, or to call additional methods (playing audio, prompting for input, transferring the call, etc.)
-
-## Next steps
-
-Congratulations! You can now make and receive calls with your Node.js application. You are now ready to explore the advanced guides in the Voice section from the left menu.
\ No newline at end of file
diff --git a/fern/products/realtime-sdk/pages/v3/guides/voice/setting-up-voicemail.mdx b/fern/products/realtime-sdk/pages/v3/guides/voice/setting-up-voicemail.mdx
deleted file mode 100644
index 1927262a4..000000000
--- a/fern/products/realtime-sdk/pages/v3/guides/voice/setting-up-voicemail.mdx
+++ /dev/null
@@ -1,163 +0,0 @@
----
-id: 15f7f61e-50c9-47bc-983a-ff9c64f6eca8
-title: Setting Up Voicemail
-slug: guides/voice/setting-up-voicemail
-description: Learn how to record voicemails from your callers when you are unable to take the call.
-max-toc-depth: 3
-sidebar_custom_props:
-  platform: javascript
-layout: guide
----
-
-[buy-one]: /platform/phone-numbers/getting-started/buying-a-phone-number
-[realtime-sdk-documentation]: /realtime-sdk/
-
-A popular and important use case is recording a voicemail from your callers when you are unable to speak with them. This guide will show how to do exactly that.
-
-In this guide we will see how to implement a voicemail using Node.js. This allows you the most flexibility in case you want to integrate voicemails with complex workflows.
-
-## Assigning a Phone Number to a RELAY Context
-
-To handle calls using Node.js, you should first set up a phone number to handle incoming calls using a RELAY application.
-
-Click the **Phone Numbers** tab on your lefthand side nav within your SignalWire Space, and click the specific number you would like to set up call forwarding on.
-If you don't have a number yet, now is the time to [buy one][buy-one]!
-
-<Frame caption = "To configure your number to handle incoming calls with a RELAY application, set 'Handle calls using' to 'RELAY Application', then specify the name of a context (here we choose 'office').">
-
-![the Voice and Fax Settings pane.](/assets/images/dashboard/relay/app_voice_handler.webp)
-
-</Frame>
-
-## Building the application
-
-Our phone number is now configured. Let's see how to build the voicemail with Node.js.
-
-### Installation
-
-First, you need to obtain the Realtime SDK. From your terminal you can run:
-
-```shell npm2yarn
-npm install --save @signalwire/realtime-api@~3
-```
-
-This will install the Realtime SDK from npm into your project.
-
-### Code
-
-The first thing we need to do is to import the Realtime SDK and initialize a Voice client. We can do it like this:
-
-```js
-import { Voice } from "@signalwire/realtime-api";
-
-const client = new Voice.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-  contexts: ["office"],
-});
-```
-
-We want to execute our logic whenever a call is received. Let's attach an
-event handler to the `call.received` event, from which we can answer the call
-and play a message:
-
-```js
-client.on("call.received", async (call) => {
-  console.log("Got call", call.from, call.to);
-
-  await call.answer();
-
-  const tts = await call.playTTS({
-    text: "Please leave a message with your name and number at the beep. Press the pound key when finished.",
-  });
-  await tts.waitForEnded();
-});
-```
-
-Right after playing the introduction message, we need to start recording. But
-before that, let's set up an event listener within the `call.received` handler
-which will notify us when the recording has ended:
-
-```js
-// inside the "call.received" event handler
-
-call.on("recording.ended", async (rec) => {
-  const tts = await call.playTTS({
-    text: "Thank you for your message. A member of our team will contact you shortly. Goodbye!",
-  });
-  await tts.waitForEnded();
-
-  console.log("Recording URL:", rec.url);
-
-  await call.hangup();
-});
-```
-
-We can finally start the recording. Since we also want the recording to be no
-more than 15 seconds long, we will set a timeout which will stop it if it didn't
-already end.
-
-```js
-const recording = await call.recordAudio({
-  endSilenceTimeout: 0,
-  terminators: "#",
-});
-
-// Stop the recording after 15 seconds.
-setTimeout(() => recording.stop(), 15000);
-```
-
-Putting all of the parts together, here is the full code:
-
-<Accordion title="index.js">
-
-```js title="index.js"
-import { Voice } from "@signalwire/realtime-api";
-
-const client = new Voice.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-  contexts: ["office"],
-});
-
-client.on("call.received", async (call) => {
-  console.log("Got call", call.from, call.to);
-
-  await call.answer();
-
-  const tts = await call.playTTS({
-    text: "Please leave a message with your name and number at the beep. Press the pound key when finished.",
-  });
-  await tts.waitForEnded();
-
-  // Callback to be executed when the recording ends.
-  call.on("recording.ended", async (rec) => {
-    const tts = await call.playTTS({
-      text: "Thank you for your message. A member of our team will contact you shortly. Goodbye!",
-    });
-    await tts.waitForEnded();
-
-    console.log("Recording URL:", rec.url);
-
-    await call.hangup();
-  });
-
-  const recording = await call.recordAudio({
-    endSilenceTimeout: 0,
-    terminators: "#",
-  });
-
-  // Stop the recording after 15 seconds.
-  setTimeout(() => recording.stop(), 15000);
-});
-
-console.log("Started.");
-```
-
-</Accordion>
-
-## Wrapping up
-
-The Realtime SDK allows you to build powerful applications with a simple API.
-You are not limited to phone calls: you can also control messaging, chat, video,
-and more. See all available options in the [Realtime SDK documentation][realtime-sdk-documentation].
\ No newline at end of file
diff --git a/fern/products/realtime-sdk/pages/v3/guides/voice/weather-phone-with-signalwire-realtime-api.mdx b/fern/products/realtime-sdk/pages/v3/guides/voice/weather-phone-with-signalwire-realtime-api.mdx
deleted file mode 100644
index 2305a89b7..000000000
--- a/fern/products/realtime-sdk/pages/v3/guides/voice/weather-phone-with-signalwire-realtime-api.mdx
+++ /dev/null
@@ -1,303 +0,0 @@
----
-id: 0f3dee1a-ff76-408f-a0e9-fd51dedb1ecb
-title: Weather Phone IVR
-slug: guides/voice/weather-phone-with-signalwire-realtime-api
-max-toc-depth: 3
-x-custom:
-  ported_from_readme: true
-  repo: https://github.com/signalwire/examples/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
-description: Learn how to build a weather phone IVR application with the SignalWire Realtime SDK.
-sidebar_custom_props:
-  platform: javascript
-  github: https://github.com/signalwire/examples/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
-layout: guide
----
-
-[17712093222-2]: tel:+17712093222
-[buying-a-phone-number-2]: /platform/phone-numbers/getting-started/buying-a-phone-number
-[call-1]: /realtime-sdk/voice/call
-[call-playtts-1]: /realtime-sdk/voice/call#playtts
-[call-prompt-1]: /realtime-sdk/voice/call#prompt
-[community-discord]: https://discord.com/invite/F2WNYTNjuF
-[connectphone-1]: /realtime-sdk/voice/call#connectphone
-[connectsip-1]: /realtime-sdk/voice/call#connectsip
-[create-a-signalwire-account-and-space]: https://m.signalwire.com/signups/new?s=1
-[device-builder]: /realtime-sdk/voice/device-builder
-[here-1]: https://github.com/signalwire/guides/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
-[here]: https://m.signalwire.com/signups/new?s=1
-[project-id-and-api-token]: https://my.signalwire.com?page=credentials
-[signalwire-realtime-api-1]: /realtime-sdk/
-[signalwire-realtime-sdk-reference-2]: /realtime-sdk/
-[signalwire-realtime-sdk-reference]: /realtime-sdk/voice/
-[the-github-repo]: https://github.com/signalwire/guides/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
-[view-the-related-github-repository-to-explore-this-codebase]: https://github.com/signalwire/guides/tree/main/Voice/Weather%20Phone%20IVR%20-%20NodeJS
-[voice-client-s-1]: /realtime-sdk/voice/client
-
-## Overview
-
-This code sample is a simple weather phone IVR application that uses the [SignalWire
-Realtime API][signalwire-realtime-api-1] to provide current weather report
-to the caller in Washington DC either as a phone call or text.
-
-In particular, this sample demonstrates how you can use the SignalWire realtime API to easily accomplish the following:
-
-- Making a phone call programmatically using your numbers
-- Waiting for, and programmatically receiving, phone calls to your numbers
-- Taking user input from their dial pad to select between actions
-- Connecting to a different phone call
-- Sending a text message to the caller
-- Playing audio, Text-to-Speech and ringtones through the phone
-
-The code we'll write is waiting for you at the other end.
-
-## Required Resources
-
-To be able to run this example, you will need a SignalWire account which you can create [here][here]. From your SignalWire Space, you need your [SignalWire API credentials][project-id-and-api-token].
-
-Further, you'll need to get a number from SignalWire which will be used as the number for the IVR. You can get that from your SignalWire Dashboard. You can follow [Buying a Phone Number][buying-a-phone-number-2] if you need help.
-
-If you are planning to make or allow calls outside of the US from SignalWire numbers, please note that you'll have to manually enable it. Follow [Enabling International Outbound Voice & SMS]\(Enabling International Outbound Voice & SMS) guide for more information.
-
-To be able to run this project, you need to have Node.js and Node Package Manager (npm) installed.
-
-This sample code is available on GitHub
-[here][here-1].
-You can follow the README.md instructions to download and run the sample.
-
-## How to Run the Application
-
-1. Edit the settings of your phone number so that our code can handle it. The RELAY Context you specify here needs to match the one you specify in the code later. In this case, we have used 'office'.
-
-<Frame caption="A screenshot of the Edit Settings page of a phone number in SignalWire. The number is set to accept incoming calls as Voice Calls, handle the calls using a RELAY Application, and forward the call to a RELAY context called 'office'." >
-
-![the Edit Settings page of a phone number in SignalWire.](/assets/images/dashboard/relay/app_voice_handler.webp)
-
-</Frame>
-
-2. Start by adding your Project ID and API credentials, and the phone number you bought to the `env.sample` file, in the format specified.
-3. Rename the `env.sample` file as `.env`.
-4. Run `yarn install` in the directory to download the required libraries.
-5. Run `node index.js` to start the program. If all went well, it should now be listening for phone calls to the number specified in `.env` file.
-
-Alternatively, if you want to use docker to run a container. Instead of doing `yarn install`, do the following instead:
-
-1. `docker build . -t weather-ivr` to build the container using the dockerfile already in the repo.
-2. `docker run -d weather-ivr` to run it.
-
-## Code
-
-The main code for this project lives in a single file: `index.js`, and from there we'll make and receive the phone call. Other than that, there are a few more files that we will briefly discuss:
-
-1. `.env.sample` file contains the format in which you will provide your SignalWire API credentials to the code. Copy this file to `.env` and provide your credentials. Please take care to not commit your `.env` file on GitHub, or make it public in any way.
-
-2. `package.json` lists out the dependencies that you will need to run the code. This includes the SignalWire Realtime SDK. When you run `npm install` or `yarn install`, the packages listed here will be downloaded and installed.
-
-[View the related GitHub Repository to explore this
-codebase.][view-the-related-github-repository-to-explore-this-codebase]
-
-### Abridged code sample
-
-```javascript
-const DC_WEATHER_PHONE = "+12025891212";
-const PHONE_NUMBER = process.env.PHONE_NUMBER;
-const REALTIME_CONFIG = {
-  project: process.env.PROJECT_ID,
-  token: process.env.API_TOKEN,
-  contexts: ["office"],
-};
-const { Voice, Messaging } = require("@signalwire/realtime-api");
-const messageClient = new Messaging.Client(REALTIME_CONFIG);
-const voiceClient = new Voice.Client(REALTIME_CONFIG);
-
-// How to call a number and play a song there.
-async function callWithRainDance(number) {
-  try {
-    let call = await voiceClient.dialPhone({
-      from: PHONE_NUMBER,
-      to: number,
-      timeout: 30,
-    });
-    const rainDance = await call.playAudio({
-      url: "https://swrooms.com/rain.mp3",
-    });
-    await rainDance.ended();
-    await call.hangup();
-  } catch (e) {
-    console.log("Call not answered.", e);
-  }
-}
-
-// How to wait for calls and how to answer them
-voiceClient.on("call.received", async (call) => {
-  console.log("Got call from", call.from, "to number", call.to);
-  await call.answer();
-
-  let welcomeSpeech = await call.playTTS({
-    text: "Hello! Welcome to Knee Rub's Weather Helpline.",
-    gender: "male",
-  });
-  await welcomeSpeech.ended();
-
-  const cmdPrompt = await call.promptTTS({
-    text: `Please enter 
-      1 for Washington weather, 
-      2 for washington weather message, 
-      3 to play rain dance, 
-      4 to send rain dance`,
-    digits: {
-      max: 1,
-      digitTimeout: 15,
-    },
-  });
-  let { digits } = await cmdPrompt.ended();
-
-  switch (digits) {
-    case "1": // We are going to dial a washington weather
-      // number and connect the call.
-      await call.connectPhone({
-        from: call.from,
-        to: DC_WEATHER_PHONE,
-        ringback: new Voice.Playlist().add(
-          Voice.Playlist.TTS({
-            text: "ring. ring. ring. ring. ring. ring. ring. ring",
-          })
-        ),
-      });
-      await call.waitUntilConnected();
-      break;
-
-    case "2": // We are going to query a weather API, find the weather of
-      // Washington, and message that weather to the user's number.
-      let weather = await getWeatherFromOpenWeatherMap("Washington DC");
-      let message = `Washington weather: ${
-        weather.weather[0].description
-      }. Temperature: ${(weather.main.temp - 273).toFixed(2)}°C`;
-
-      try {
-        await messageClient.send({
-          from: PHONE_NUMBER,
-          to: call.to,
-          body: message,
-        });
-      } catch (e) {
-        let pb = await call.playTTS({
-          text: "Sorry, Couldn't send the message.",
-        });
-        await pb.ended();
-      }
-      break;
-
-    case "3": // We are going to play a rain dance song hosted on our servers.
-      const rainDance = await call.playAudio({
-        url: "https://swrooms.com/rain.mp3",
-      });
-      await rainDance.ended();
-      break;
-
-    case "4": // We are going to ask for a phone number to dial and play a
-      // rain dance song to it.
-      const prompt = await call.promptTTS({
-        text: "Please enter your friend's number then dial #.",
-        digits: {
-          max: 15,
-          digitTimeout: 15,
-          terminators: "#",
-        },
-      });
-      const { digits } = await prompt.ended();
-
-      if (ise164("+" + digits)) {
-        callWithRainDance("+" + digits);
-      } else {
-        let pb = await call.playTTS({
-          text: "The number is invalid. Bye.",
-        });
-        await pb.ended();
-      }
-  }
-  await call.hangup(); // hang up
-});
-```
-
-As evident from the source code above, SignalWire Voice API makes it incredibly easy to write complex IVRs. You can get pretty far by using the [SignalWire Realtime SDK reference][signalwire-realtime-sdk-reference] and this code as a starting point.
-
-In case there's some confusion, here's a brief walkthrough anyway:
-
-### Installing the libraries
-
-Download the required SignalWire Realtime Libraries by using `npm install @signalwire/realtime-api@~3`. After you've done this, you can import required namespaces into your project using the following line:
-
-```javascript
-const { Voice, Messaging } = require("@signalwire/realtime-api");
-```
-
-### Instantiating Voice and Messaging client
-
-Using your [Project ID and API token][project-id-and-api-token], you can instantiate both Voice and Messaging Client.
-
-`contexts` parameter: Relay context allows you to treat a bunch of phone numbers as one, so that you can subscribe to and receive events (calls, messages etc) from your group of numbers at once. You can pick which numbers are in which Relay context from the SignalWire Dashboard. For this example, I've already set up my number to be in the `office` context (read [Buying a Phone Number][buying-a-phone-number-2] if you're unfamiliar with the process).
-
-```javascript
-const realtimeConfig = {
-  project: process.env.PROJECT_ID,
-  token: process.env.API_TOKEN,
-  contexts: ["office"],
-};
-
-const messageClient = new Messaging.Client(realtimeConfig);
-const voiceClient = new Voice.Client(realtimeConfig);
-```
-
-### Waiting for calls
-
-Once you've successfully instantiated your Realtime Clients, you can use them to register events pertaining to the context you've selected (like waiting for calls and messages to the numbers). In the example below, notice how easy it is to register event listener for incoming calls.
-
-```javascript
-console.log("Waiting for calls...");
-voiceClient.on("call.received", async (call) => {
-  console.log("Got call from", call.from, "to number", call.to);
-  await call.answer();
-  console.log("Inbound call answered");
-});
-```
-
-With this simple bit of code, as long as this program is running, the phone call to your number will automatically be received by this code.
-
-Of course, picking up the call is but the first step. Now you'll have to interact with the user. Simply use the [Call][call-1] object that is passed to the event listener as parameter to perform actions and listen for user input. Like maybe:
-
-1. making a robot say hello with [`call.playTTS`][call-playtts-1]
-2. taking in user input with [`call.prompt`][call-prompt-1]
-3. connecting the call to another phone call (like the Washington Weather Phone Number) with [`connectPhone`][connectphone-1] or [`connectSip`][connectsip-1]
-
-And more.
-
-### Making calls
-
-Making calls is even simpler. Use the [Voice Client's][voice-client-s-1] `dialPhone` and `dialSip` methods to make calls. In fact, if these are too simple for you, feel free to use the more general purpose `dial` method with [`Device Builder`][device-builder] to make series and parallel calls at once.
-
-```javascript
-// Call someone and play them a nice song.
-
-let call = await voiceClient.dialPhone({
-  from: PHONE_NUMBER,
-  to: "{NUMBER TO CALL IN E.164 FORMAT}",
-  timeout: 30,
-});
-const rainDance = await call.playAudio({
-  url: "https://cdn.signalwire.com/swml/April_Kisses.mp3",
-});
-await rainDance.ended();
-await call.hangup();
-```
-
-## Wrap up
-
-[The GitHub Repo][the-github-repo]
-
-[SignalWire RealTime SDK Reference][signalwire-realtime-sdk-reference-2]
-
-## Sign Up Here
-
-If you would like to test this example out, you can [create a SignalWire account and space][create-a-signalwire-account-and-space].
-
-Please feel free to reach out to us on our [Community Discord][community-discord] or create a Support ticket from your SignalWire Space if you need guidance!
\ No newline at end of file
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/chat/chat-client.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/chat/chat-client.mdx
deleted file mode 100644
index 36b6dfeb3..000000000
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/chat/chat-client.mdx
+++ /dev/null
@@ -1,449 +0,0 @@
----
-id: b031f15a-d6f2-4255-b459-598573d898d1
-title: "Client"
-slug: reference/chat/client
-description: Chat Client reference for real-time chat functionality. Subscribe to channels, publish messages, get message history, and manage channel members.
-max-toc-depth: 3
----
-
-[chatmember-4]: ./chat-chatmember.mdx
-[chatmessage-1]: ./chat-chatmessage.mdx
-[link-1]: #chatmessageentity
-[link-2]: #unsubscribe
-[link]: #chatmemberentity
-
-You can use instances of this class to control the chat and subscribe to its events.
-
-#### Example
-
-```javascript
-const chatClient = new Chat.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-});
-
-await chatClient.subscribe(["mychannel1", "mychannel2"]);
-
-chatClient.on("message", (message) => {
-  // prettier-ignore
-  console.log("Received", message.content,
-              "on", message.channel,
-              "at", message.publishedAt);
-});
-
-await chatClient.publish({
-  channel: "mychannel1",
-  content: "hello world",
-});
-```
-
-## Constructors
-
-### constructor
-
-- **new Client**(`chatOptions`)
-
-Creates a new Chat client.
-
-#### Parameters
-
-| Name                              | Type      | Description                                                        |
-|:----------------------------------|:----------|:-------------------------------------------------------------------|
-| `chatOptions`                     | `Object`  | -                                                                  |
-| `chatOptions.project`             | `string`  | SignalWire project id, e.g. `a10d8a9f-2166-4e82-56ff-118bc3a4840f` |
-| `chatOptions.token`               | `string`  | SignalWire API token                                               |
-| `chatOptions.debug?`              | `Object`  | -                                                                  |
-| `chatOptions.debug.logWsTraffic?` | `boolean` | If `true`, logs all WebSocket traffic. Default is `false`.         |
-
-#### Example
-
-```js
-import { Chat } from "@signalwire/realtime-api";
-
-const chatClient = new Chat.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-});
-```
-
-## Methods
-
-### disconnect
-
-- **disconnect**(): `void`
-
-Disconnects this client. The client will stop receiving events and you will need to create a new instance if you want to use it again.
-
-#### Returns
-
-`void`
-
-#### Example
-
-```js
-client.disconnect();
-```
-
----
-
-### getMemberState
-
-- **getMemberState**(`params`): `Promise<{ channels: Record<string, ChatChannelState> }>`
-
-Returns the states of a member in the specified channels.
-
-#### Parameters
-
-| Name               | Type                   | Description                                  |
-|:-------------------|:-----------------------|:---------------------------------------------|
-| `params`           | `Object`               | -                                            |
-| `params.channels?` | `string` \| `string[]` | Channels for which to get the state.         |
-| `params.memberId`  | `string`               | Id of the member for which to get the state. |
-
-#### Returns
-
-`Promise<{ channels: Record<string, ChatChannelState> }>`
-
-#### Example
-
-```js
-const s = await chatClient.getMemberState({
-  channels: ["chan1", "chan2"],
-  memberId: "my-member-id",
-});
-
-s.channels.length; // 2
-s.channels.chan1.state; // the state object for chan1
-```
-
----
-
-### getMembers
-
-- **getMembers**(`params`): `Promise<{ members: ChatMemberEntity[] }>` - See [`ChatMemberEntity`][link] for more details.
-
-Returns the list of members in the given channel.
-
-#### Parameters
-
-| Name             | Type     | Description                                       |
-|:-----------------|:---------|:--------------------------------------------------|
-| `params`         | `Object` | -                                                 |
-| `params.channel` | `string` | The channel for which to get the list of members. |
-
-#### Returns
-
-`Promise<{ members: ChatMemberEntity[] }>` - See [`ChatMemberEntity`][link] for more details.
-
-#### Example
-
-```js
-const m = await chatClient.getMembers({ channel: "my-channel" });
-
-m.members.length; // 7
-m.members[0]; // { id: ..., channel: ..., state: ... }
-```
-
----
-
-### getMessages
-
-- **getMessages**(`params`): `Promise<{ cursor: PaginationCursor ; messages: ChatMessageEntity[] }>` - See [`ChatMessageEntity`][link-1] for more details.
-
-Returns the list of messages that were sent to the specified channel.
-
-#### Parameters
-
-| Name             | Type               | Description                                 |
-|:-----------------|:-------------------|:--------------------------------------------|
-| `params`         | `Object`           | -                                           |
-| `params.channel` | `string`           | Channel for which to retrieve the messages. |
-| `params.cursor?` | `PaginationCursor` | Cursor for pagination.                      |
-
-#### Returns
-
-`Promise<{ cursor: PaginationCursor ; messages: ChatMessageEntity[] }>` - See [`ChatMessageEntity`][link-1] for more details.
-
-#### Example
-
-```js
-const m = await chatClient.getMessages({ channel: "chan1" });
-
-m.messages.length; // 23
-m.messages[0]; // the most recent message
-m.messages[0].member; // the sender
-m.messages[0].content; // the content
-m.messages[0].meta; // the metadata (if any)
-
-m.cursor.next; // if not null, there are more messages.
-
-// Get the next page using the cursor
-const next = await chatClient.getMessages({
-  channel: "chan1",
-  cursor: {
-    after: m.cursor.after,
-  },
-});
-```
-
----
-
-### off
-
-<Markdown src="/snippets/realtime-sdk/method_off.mdx" />
-
----
-
-### on
-
-<Markdown src="/snippets/realtime-sdk/method_on.mdx" />
-
----
-
-### once
-
-<Markdown src="/snippets/realtime-sdk/method_once.mdx" />
-
----
-
-### publish
-
-- **publish**(`params`): `Promise<void>`
-
-Publish a message into the specified channel.
-
-#### Parameters
-
-| Name             | Type               | Description                                                                                 |
-|:-----------------|:-------------------|:--------------------------------------------------------------------------------------------|
-| `params`         | `Object`           | -                                                                                           |
-| `params.channel` | `string`           | Channel in which to send the message.                                                       |
-| `params.content` | `any`              | The message to send. This can be any JSON-serializable object or value.                     |
-| `params.meta?`   | `Record<any, any>` | Metadata associated with the message. There are no requirements on the content of metadata. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Examples
-
-Publishing a message as a string:
-
-```js
-await chatClient.publish({
-  channel: "my-channel",
-  content: "Hello, world."
-});
-```
-
-Publishing a message as an object:
-
-```js
-await chatClient.publish({
-  channel: "my-channel",
-  content: {
-    field_one: "value_one",
-    field_two: "value_two"
-  },
-});
-```
-
----
-
-### removeAllListeners
-
-<Markdown src="/snippets/realtime-sdk/method_removealllisteners.mdx" />
-
----
-
-### setMemberState
-
-- **setMemberState**(`params`): `Promise<void>`
-
-Sets a state object for a member, for the specified channels. The previous state object will be completely replaced.
-
-#### Parameters
-
-| Name              | Type                   | Description                                                              |
-|:------------------|:-----------------------|:-------------------------------------------------------------------------|
-| `params`          | `Object`               | -                                                                        |
-| `params.channels` | `string` \| `string[]` | Channels for which to set the state.                                     |
-| `params.memberId` | `string`               | Id of the member to affect.                                              |
-| `params.state`    | `Record<any, any>`     | The state to set. There are no requirements on the content of the state. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-await chatClient.setMemberState({
-  channels: ["chan1", "chan2"],
-  state: {
-    online: true,
-    typing: false,
-  },
-});
-```
-
----
-
-### subscribe
-
-- **subscribe**(`channels`): `Promise<void>`
-
-List of channels for which you want to receive messages.
-
-Note that the `subscribe` function is idempotent, and calling it again with a different set of channels _will not_ unsubscribe you from the old ones. To unsubscribe, use [unsubscribe][link-2].
-
-#### Parameters
-
-| Name       | Type                   | Description                                                                                            |
-|:-----------|:-----------------------|:-------------------------------------------------------------------------------------------------------|
-| `channels` | `string` \| `string[]` | The channels to subscribe to, either in the form of a string (for one channel) or an array of strings. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-const chatClient = new Chat.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-});
-
-chatClient.on("message", (m) => console.log(m));
-
-await chatClient.subscribe("my-channel");
-await chatClient.subscribe(["chan-2", "chan-3"]);
-```
-
----
-
-### unsubscribe
-
-- **unsubscribe**(`channels`): `Promise<void>`
-
-List of channels from which you want to unsubscribe.
-
-#### Parameters
-
-| Name       | Type                   | Description                                                                                                |
-|:-----------|:-----------------------|:-----------------------------------------------------------------------------------------------------------|
-| `channels` | `string` \| `string[]` | The channels to unsubscribe from, either in the form of a string (for one channel) or an array of strings. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-await chatClient.unsubscribe("my-channel");
-await chatClient.unsubscribe(["chan-2", "chan-3"]);
-```
-
-## Events
-
-### member.joined
-
-- **member.joined**(`member`)
-
-A new member joined the chat.
-
-#### Parameters
-
-| Name     | Type                                 |
-|:---------|:-------------------------------------|
-| `member` | [`ChatMember`][chatmember-4] |
-
----
-
-### member.left
-
-- **member.left**(`member`)
-
-A member left the chat.
-
-#### Parameters
-
-| Name     | Type                                 |
-|:---------|:-------------------------------------|
-| `member` | [`ChatMember`][chatmember-4] |
-
----
-
-### member.updated
-
-- **member.updated**(`member`)
-
-A member updated its state.
-
-#### Parameters
-
-| Name     | Type                                 |
-|:---------|:-------------------------------------|
-| `member` | [`ChatMember`][chatmember-4] |
-
----
-
-### message
-
-- **message**(`message`)
-
-A new message has been received.
-
-#### Parameters
-
-| Name      | Type                                   |
-|:----------|:---------------------------------------|
-| `message` | [`ChatMessage`][chatmessage-1] |
-
-## Type Aliases
-
-### ChatMemberEntity
-
-An object representing a Chat Member with only the state properties of [`ChatMember`][chatmember-4].
-
-#### Properties
-
-- `Readonly` **channel**: `string`
-
-The channel of this member.
-
-- `Readonly` **id**: `string`
-
-The id of this member.
-
-- `Readonly` **state**: `Record<any, any>`
-
-The state of this member.
-
-### ChatMessageEntity
-
-An object representing a Chat Message with only the state properties of [`ChatMessage`][chatmessage-1].
-
-#### Properties
-
-- `Readonly` **content**: `any`
-
-The content of this message.
-
-- `Readonly` **id**: `string`
-
-The id. of this message
-
-- `Readonly` **member**: [`ChatMember`][chatmember-4]
-
-The member which sent this message.
-
-- `Readonly` **meta?**: `any`
-
-Any metadata associated with this message.
-
-- `Readonly` **publishedAt**: `Date`
-
-The date and time at which this message was published.
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/chat/client/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/chat/client/index.mdx
index d60134b1f..f6f5ca161 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/chat/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/chat/client/index.mdx
@@ -1,6 +1,7 @@
 ---
 id: ef18c80d-4bdd-42db-9611-41223f6b4ef3
 title: "Chat Client"
+sidebar-title: Client
 slug: reference/chat/client
 description: Chat Client reference for chat messaging.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/chat/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/chat/overview.mdx
similarity index 97%
rename from fern/products/realtime-sdk/pages/v3/tech-ref/chat/index.mdx
rename to fern/products/realtime-sdk/pages/v3/tech-ref/chat/overview.mdx
index f44130453..2e2f59e56 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/chat/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/chat/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 952fc9a5-3b75-45a5-adb7-d48ceab0f0fb
 title: "Chat"
+sidebar-title: Overview
+position: 0
 slug: reference/chat
 description: Access the Chat API for building real-time chat applications. Subscribe to channels, send messages, and track member presence in chat rooms.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/guides/realtime-relay-v4-vs-v3.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/core/migration-to-v4.mdx
similarity index 99%
rename from fern/products/realtime-sdk/pages/v3/guides/realtime-relay-v4-vs-v3.mdx
rename to fern/products/realtime-sdk/pages/v3/tech-ref/core/migration-to-v4.mdx
index 44d3fa956..f392980c4 100644
--- a/fern/products/realtime-sdk/pages/v3/guides/realtime-relay-v4-vs-v3.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/core/migration-to-v4.mdx
@@ -1,7 +1,8 @@
 ---
 id: cadc62d8-629b-4a93-b058-d76b1ef7c73f
 title: Upgrading to RELAY v4
-slug: guides/realtime-relay-v4-vs-v3
+sidebar-title: Migration to v4
+slug: /migration-to-v4
 description: Easily upgrade to the version 4 of the Realtime SDK.
 max-toc-depth: 3
 layout: guide
diff --git a/fern/products/realtime-sdk/pages/v3/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/core/overview.mdx
similarity index 99%
rename from fern/products/realtime-sdk/pages/v3/index.mdx
rename to fern/products/realtime-sdk/pages/v3/tech-ref/core/overview.mdx
index fab1dc2b8..0609dd9ff 100644
--- a/fern/products/realtime-sdk/pages/v3/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/core/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 842057a6-bbf3-4870-a3ef-e74b7440cd07
 title: "RELAY Realtime SDK v3"
+sidebar-title: Overview
+position: 0
 slug: /
 subtitle: Node.js server SDK for real-time communication (deprecated - consider upgrading to v4)
 description: RELAY Realtime SDK v3 for Node.js. Build real-time voice, video, messaging, and chat applications. Deprecated - upgrade to v4 for the latest features.
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/client/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/client/index.mdx
index 8faa1e5bf..7077852ae 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/client/index.mdx
@@ -1,6 +1,7 @@
 ---
 id: 888135e0-b3df-461f-9624-d89d7b067c8a
 title: "Messaging Client"
+sidebar-title: Client
 slug: reference/messaging/client
 description: Messaging Client reference for sending and receiving messages.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/messaging-client.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/messaging-client.mdx
deleted file mode 100644
index 85ff753ef..000000000
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/messaging-client.mdx
+++ /dev/null
@@ -1,191 +0,0 @@
----
-id: d5422e3a-1af9-4c0c-8721-d53c3cdcadec
-title: "Client"
-slug: reference/messaging/client
-description: Messaging Client reference for sending and receiving SMS/MMS messages. Listen for inbound messages and send outbound messages with media attachments.
-max-toc-depth: 3
----
-
-[messagecontract-1]: /realtime-sdk/v3/messaging/message-contract
-[messagingsendresult-1]: /realtime-sdk/v3/messaging/messaging-sendresult
-
-You can use instances of this class to send or receive messages.
-
-#### Example
-
-```javascript
-import { Messaging } from "@signalwire/realtime-api";
-
-const client = new Messaging.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-  topics: ["office"],
-});
-
-client.on("message.received", (message) => {
-  console.log("message.received", message);
-});
-
-await client.send({
-  topic: "office",
-  from: "+1xxx",
-  to: "+1yyy",
-  body: "Hello World!"
-});
-```
-
-## Constructors
-
-### constructor
-
-- **new Client**(`opts`)
-
-#### Parameters
-
-| Name                       | Type       | Description                                                                      |
-|:---------------------------|:-----------|:---------------------------------------------------------------------------------|
-| `opts`                     | `Object`   | -                                                                                |
-| `opts.topics`              | `string[]` | SignalWire topics, e.g. ['home', 'office']. Previously known as `"context"`.     |
-| `opts.project`             | `string`   | SignalWire Project ID, e.g. `a10d8a9f-2166-4e82-56ff-118bc3a4840f`.              |
-| `opts.token`               | `string`   | SignalWire API token, e.g. `PT9e5660c101cd140a1c93a0197640a369cf5f16975a0079c9`. |
-| `opts.debug?`              | `Object`   | -                                                                                |
-| `opts.debug.logWsTraffic?` | `boolean`  | If `true`, logs all WebSocket traffic. Default is `false`.                       |
-
-## Methods
-
-### disconnect
-
-- **disconnect**(): `void`
-
-Disconnects this client. The client will stop receiving events and you will need to create a new instance if you want to use it again.
-
-#### Returns
-
-`void`
-
-#### Example
-
-```js
-client.disconnect();
-```
-
----
-
-### off
-
-<Markdown src="/snippets/realtime-sdk/method_off.mdx" />
-
----
-
-### on
-
-<Markdown src="/snippets/realtime-sdk/method_on.mdx" />
-
----
-
-### once
-
-<Markdown src="/snippets/realtime-sdk/method_once.mdx" />
-
----
-
-### removeAllListeners
-
-<Markdown src="/snippets/realtime-sdk/method_removealllisteners.mdx" />
-
----
-
-### send
-
-- **send**(`params`): `Promise<MessagingSendResult>` - See [`MessagingSendResult`][messagingsendresult-1]
-
-Send an outbound SMS or MMS message.
-
-#### Parameters
-
-| Name             | Type       | Description                                                                                                                                       |
-|:-----------------|:-----------|:--------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params`         | `Object`   | -                                                                                                                                                 |
-| `params.body?`   | `string`   | The content of the message. Optional if `media` is present.                                                                                       |
-| `params.topic?`  | `string`   | Inbound events for the message will be received on this topic. If not specified, a `default` topic will be used. Previously known as `"context"`. |
-| `params.from`    | `string`   | The phone number to place the message from. Must be a SignalWire phone number or short code that you own.                                         |
-| `params.media?`  | `string[]` | Array of URLs to send in the message. Optional if `body` is present.                                                                              |
-| `params.region?` | `string`   | Region of the world to originate the message from. A default value is picked based on account preferences or device location.                     |
-| `params.tags?`   | `string[]` | Array of strings to tag the message with for searching in the UI.                                                                                 |
-| `params.to`      | `string`   | The phone number to send to.                                                                                                                      |
-
-#### Returns
-
-`Promise<MessagingSendResult>` - See [`MessagingSendResult`][messagingsendresult-1]
-
-Asynchronously returns a result object.
-
-#### Example
-
-> Send a message.
-
-```js
-try {
-  const sendResult = await client.send({
-    from: "+1xxx",
-    to: "+1yyy",
-    body: "Hello World!",
-  });
-  console.log("Message ID: ", sendResult.messageId);
-} catch (e) {
-  console.error(e.message);
-}
-```
-
-## Events
-
-### message.received
-
-- **message.received**(`message`)
-
-Emitted whenever a message is received. Your event handler receives a message object. Example:
-
-```javascript
-const client = new Messaging.Client(...)
-client.on('message.received', (message) => {
-  console.log('Message received:', message)
-  // message.from
-  // message.to
-  // message.body
-  // ...
-})
-```
-
-#### Parameters
-
-| Name      | Type                                                | Description                         |
-|:----------|:----------------------------------------------------|:------------------------------------|
-| `message` | [`MessageContract`][messagecontract-1] | The message that has been received. |
-
----
-
-### message.updated
-
-- **message.updated**(`message`)
-
-Emitted when the status of a message is updated. You can use this event to track the different stages that an outbound message goes through for delivery. Example:
-
-```javascript
-const client = new Messaging.Client(...)
-client.on('message.updated', (message) => {
-  console.log('Message updated:', message)
-  // message.from
-  // message.to
-  // message.direction
-  // message.state
-  // ...
-})
-
-client.send(...)
-```
-
-#### Parameters
-
-| Name      | Type                                                | Description  |
-|:----------|:----------------------------------------------------|:-------------|
-| `message` | [`MessageContract`][messagecontract-1] | The message. |
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/overview.mdx
similarity index 98%
rename from fern/products/realtime-sdk/pages/v3/tech-ref/messaging/index.mdx
rename to fern/products/realtime-sdk/pages/v3/tech-ref/messaging/overview.mdx
index 0de638263..d15f8677e 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/messaging/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 508e082e-8dad-45ff-b100-fb687cadbbb4
 title: "Messaging"
+sidebar-title: Overview
+position: 0
 slug: reference/messaging
 description: Access the Messaging API to send and receive SMS and MMS messages programmatically. Handle inbound messages and track delivery status with events.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/client/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/client/index.mdx
index 52b80911e..1f2b89c70 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/client/index.mdx
@@ -1,6 +1,7 @@
 ---
 id: 7d7d2884-9319-4c8e-9329-37e8dcabcd89
 title: "PubSub Client"
+sidebar-title: Client
 slug: reference/pubsub/client
 description: PubSub Client reference for publishing and subscribing to messages.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/overview.mdx
similarity index 97%
rename from fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/index.mdx
rename to fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/overview.mdx
index e8419180d..0b374d770 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: e70a9375-0dfd-4429-8837-0a31cab4d86e
 title: "PubSub"
+sidebar-title: Overview
+position: 0
 slug: reference/pubsub
 description: Access the PubSub API for publish-subscribe messaging patterns. Subscribe to channels, publish messages, and build real-time event-driven applications.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/pubsub-client.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/pubsub-client.mdx
deleted file mode 100644
index 6058d5c5d..000000000
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/pubsub/pubsub-client.mdx
+++ /dev/null
@@ -1,196 +0,0 @@
----
-id: ec58511d-a072-4943-8bbe-e969ee2ec521
-title: "Client"
-slug: reference/pubsub/client
-description: PubSub Client reference for publish-subscribe messaging. Subscribe to channels, publish messages, and listen for real-time message events.
-max-toc-depth: 3
----
-
-[pubsub-client]: ./pubsub-client.mdx#unsubscribe
-[pubsubmessage]: ./pubsub-pubsubmessage.mdx
-
-## Constructors
-
-### constructor
-
-- **new Client**(`pubSubOptions`)
-
-Creates a new PubSub client.
-
-#### Parameters
-
-| Name                                | Type      | Description                                                        |
-|:------------------------------------|:----------|:-------------------------------------------------------------------|
-| `pubSubOptions`                     | `Object`  | -                                                                  |
-| `pubSubOptions.project`             | `string`  | SignalWire project id, e.g. `a10d8a9f-2166-4e82-56ff-118bc3a4840f` |
-| `pubSubOptions.token`               | `string`  | SignalWire API token                                               |
-| `pubSubOptions.debug?`              | `Object`  | -                                                                  |
-| `pubSubOptions.debug.logWsTraffic?` | `boolean` | If `true`, logs all WebSocket traffic. Default is `false`.         |
-
-#### Example
-
-```js
-import { PubSub } from "@signalwire/realtime-api";
-
-const pubSubClient = new PubSub.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-});
-```
-
-## Methods
-
-### disconnect
-
-- **disconnect**(): `void`
-
-Disconnects this client. The client will stop receiving events and you will need to create a new instance if you want to use it again.
-
-#### Returns
-
-`void`
-
-#### Example
-
-```js
-client.disconnect();
-```
-
----
-
-### off
-
-<Markdown src="/snippets/realtime-sdk/method_off.mdx" />
-
----
-
-### on
-
-<Markdown src="/snippets/realtime-sdk/method_on.mdx" />
-
----
-
-### once
-
-<Markdown src="/snippets/realtime-sdk/method_once.mdx" />
-
----
-
-### publish
-
-- **publish**(`params`): `Promise<void>`
-
-Publish a message into the specified channel.
-
-#### Parameters
-
-| Name             | Type               | Description                                                                                 |
-|:-----------------|:-------------------|:--------------------------------------------------------------------------------------------|
-| `params`         | `Object`           | -                                                                                           |
-| `params.channel` | `string`           | Channel in which to send the message.                                                       |
-| `params.content` | `any`              | The message to send. This can be any JSON-serializable object.                              |
-| `params.meta?`   | `Record<any, any>` | Metadata associated with the message. There are no requirements on the content of metadata. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Examples
-
-Publishing a message as a string:
-
-```js
-await pubSubClient.publish({
-  channel: "my-channel",
-  content: "Hello, world.",
-});
-```
-
-Publishing a message as an object:
-
-```js
-await pubSubClient.publish({
-  channel: "my-channel",
-  content: {
-    field_one: "value_one",
-    field_two: "value_two",
-  },
-});
-```
-
----
-
-### removeAllListeners
-
-<Markdown src="/snippets/realtime-sdk/method_removealllisteners.mdx" />
-
----
-
-### subscribe
-
-- **subscribe**(`channels`): `Promise<void>`
-
-List of channels for which you want to receive messages.
-
-Note that the `subscribe` function is idempotent, and calling it again with a different set of channels _will not_ unsubscribe you from the old ones. To unsubscribe, use [unsubscribe][pubsub-client].
-
-#### Parameters
-
-| Name       | Type                   | Description                                                                                            |
-|:-----------|:-----------------------|:-------------------------------------------------------------------------------------------------------|
-| `channels` | `string` \| `string[]` | The channels to subscribe to, either in the form of a string (for one channel) or an array of strings. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-const pubSubClient = new PubSub.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-});
-
-await pubSubClient.subscribe("my-channel");
-await pubSubClient.subscribe(["chan-2", "chan-3"]);
-```
-
----
-
-### unsubscribe
-
-- **unsubscribe**(`channels`): `Promise<void>`
-
-List of channels from which you want to unsubscribe.
-
-#### Parameters
-
-| Name       | Type                   | Description                                                                                                |
-|:-----------|:-----------------------|:-----------------------------------------------------------------------------------------------------------|
-| `channels` | `string` \| `string[]` | The channels to unsubscribe from, either in the form of a string (for one channel) or an array of strings. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-await pubSubClient.unsubscribe("my-channel");
-await pubSubClient.unsubscribe(["chan-2", "chan-3"]);
-```
-
-## Events
-
-### message
-
-- **message**(`message`)
-
-A new message has been received.
-
-#### Parameters
-
-| Name      | Type                                         | Description                         |
-|:----------|:---------------------------------------------|:------------------------------------|
-| `message` | [`PubSubMessage`][pubsubmessage] | The message that has been received. |
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/realtime-client/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/realtime-client/index.mdx
index 496d1e7a6..45979418d 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/realtime-client/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/realtime-client/index.mdx
@@ -4,8 +4,7 @@ title: "Realtime Client"
 slug: reference/realtime-client
 description: DEPRECATED - Technical reference for the realtime client.
 max-toc-depth: 3
-sidebar_custom_props:
-  hideFromIndex: true
+availability: deprecated
 ---
 
 [createclient]: /realtime-sdk/v3/technical-reference#createclient
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/task/client/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/task/client/index.mdx
index d75439f71..23460606e 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/task/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/task/client/index.mdx
@@ -1,6 +1,7 @@
 ---
 id: 2ff45949-f7b9-467e-a3c0-447c5ce85a8d
 title: "Task Client"
+sidebar-title: Client
 slug: reference/task/client
 description: Task Client reference for task management.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/task/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/task/overview.mdx
similarity index 98%
rename from fern/products/realtime-sdk/pages/v3/tech-ref/task/index.mdx
rename to fern/products/realtime-sdk/pages/v3/tech-ref/task/overview.mdx
index 667d871a1..31d62d543 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/task/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/task/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 16e9f6d9-1eac-42e4-b871-72fb1e938bcd
 title: "Task"
+sidebar-title: Overview
+position: 0
 slug: reference/task
 description: Access the Task API for inter-application communication. Send and receive tasks between different applications using topics for routing.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/task/task-client.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/task/task-client.mdx
deleted file mode 100644
index 3ebc787aa..000000000
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/task/task-client.mdx
+++ /dev/null
@@ -1,118 +0,0 @@
----
-id: fe5d9bd4-5725-4c9b-96fd-29c12eb6b52b
-title: Task.Client
-slug: reference/task/client
-description: Task Client reference for inter-application messaging. Send tasks to topics and receive task data from other applications in your project.
-max-toc-depth: 3
----
-
-[index]: ./index.mdx#send
-[task]: ./index.mdx
-
-A [Task][task] client. On your server, use instances of this client to receive data emitted with [Task.send][index].
-
-#### Example
-
-```javascript
-const client = new Task.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-  topics: ["office"],
-});
-
-client.on("task.received", (payload) => {
-  console.log("Task Received", payload);
-  // Do something with the payload...
-});
-```
-
-## Constructors
-
-### constructor
-
-- **new Client**(`opts`)
-
-#### Parameters
-
-| Name                       | Type       | Description                                                                          |
-|:---------------------------|:-----------|:-------------------------------------------------------------------------------------|
-| `opts`                     | `Object`   | -                                                                                    |
-| `opts.topics`              | `string[]` | SignalWire topics, e.g. ['home', 'office']. Previously known as `"context"`.         |
-| `opts.project`             | `string`   | SignalWire project id, e.g. `a10d8a9f-2166-4e82-56ff-118bc3a4840f`.                  |
-| `opts.token`               | `string`   | SignalWire project token, e.g. `PT9e5660c101cd140a1c93a0197640a369cf5f16975a0079c9`. |
-| `opts.debug?`              | `Object`   | -                                                                                    |
-| `opts.debug.logWsTraffic?` | `boolean`  | If `true`, logs all WebSocket traffic. Default is `false`.                           |
-
-#### Example
-
-```js
-const client = new Task.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-  topics: ["office"],
-});
-```
-
-## Methods
-
-### disconnect
-
-- **disconnect**(): `void`
-
-Disconnects this client. The client will stop receiving events and you will need to create a new instance if you want to use it again.
-
-#### Returns
-
-`void`
-
-#### Example
-
-```js
-client.disconnect();
-```
-
----
-
-### off
-
-<Markdown src="/snippets/realtime-sdk/method_off.mdx" />
-
----
-
-### on
-
-<Markdown src="/snippets/realtime-sdk/method_on.mdx" />
-
----
-
-### once
-
-<Markdown src="/snippets/realtime-sdk/method_once.mdx" />
-
----
-
-### removeAllListeners
-
-<Markdown src="/snippets/realtime-sdk/method_removealllisteners.mdx" />
-
-## Events
-
-### task.received
-
-- **task.received**(`payload`)
-
-Emitted whenever a task is received. Your event handler receives the payload. Example:
-
-```javascript
-const client = new Task.Client(...)
-client.on('task.received', (payload) => {
-  console.log('Task Received', payload)
-  // Do something with the payload...
-})
-```
-
-#### Parameters
-
-| Name      | Type                      | Description          |
-|:----------|:--------------------------|:---------------------|
-| `payload` | `Record<string, unknown>` | The message payload. |
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/video/client/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/video/client/index.mdx
index b72cc3005..f4020ee0f 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/video/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/video/client/index.mdx
@@ -1,6 +1,7 @@
 ---
 id: 720d0446-1b7f-4bdc-a51a-a39b6b319022
 title: "Video Client"
+sidebar-title: Client
 slug: reference/video/client
 description: Video Client reference for subscribing to video room events.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/video/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/video/overview.mdx
similarity index 98%
rename from fern/products/realtime-sdk/pages/v3/tech-ref/video/index.mdx
rename to fern/products/realtime-sdk/pages/v3/tech-ref/video/overview.mdx
index 5efb8aaae..eaadc0590 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/video/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/video/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: 37a798cc-097f-4527-a88c-54a04b5b6c2b
 title: "Video"
+sidebar-title: Overview
+position: 0
 slug: reference/video
 description: Access the Video API for building video conferencing applications. Manage room sessions, members, recordings, playback, and RTMP streaming.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/video/video-roomsession.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/video/video-roomsession.mdx
deleted file mode 100644
index 80af26a5b..000000000
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/video/video-roomsession.mdx
+++ /dev/null
@@ -1,1404 +0,0 @@
----
-id: 715d96b0-ad81-43f7-b52e-148842d0a573
-title: "RoomSession"
-slug: reference/video/room-session
-sidebar-title: RoomSession
-description: RoomSession reference for managing video room sessions. Control members, layouts, recordings, playback, and RTMP streams within a video room.
-max-toc-depth: 3
----
-
-[creating-the-video-room-token-1]: /rest/signalwire-rest/endpoints/video/create-room-token
-[link-1]: #promote
-[link-2]: #demote
-[link-3]: #setmembermeta
-[link-4]: #setmeta
-[link]: #getrecordings
-[roomsession]: ./video-roomsession.mdx
-[roomsessionfullstate-2]: ./video-roomsessionfullstate.mdx
-[roomsessionmember-6]: ./video-roomsessionmember.mdx
-[roomsessionplayback-5]: ./video-roomsessionplayback.mdx
-[roomsessionrecording-5]: ./video-roomsessionrecording.mdx
-[roomsessionstream-4]: ./video-roomsessionstream.mdx
-[roomsessionstream-6]: ./video-roomsessionstream.mdx
-[video-client]: ./client/index.mdx
-[video-roomsession-1]: ./video-roomsession.mdx#audiounmute
-[video-roomsession-2]: ./video-roomsession.mdx#setlayout
-[video-roomsession-3]: ./video-roomsession.mdx#videomute
-[video-roomsession-4]: ./video-roomsession.mdx#getlayouts
-[video-roomsession-5]: ./video-roomsession.mdx#setinputvolume
-[video-roomsession-6]: ./video-roomsession.mdx#setoutputvolume
-[video-roomsession-7]: ./video-roomsession.mdx#audiomute
-[video-roomsession]: ./video-roomsession.mdx#sethidevideomuted
-
-Represents a room session. You can obtain instances of this class by subscribing to the appropriate events from [Video.Client][video-client].
-
-#### Example
-
-```javascript
-const video = new Video.Client({
-  project: "<project-id>",
-  token: "<project-token>",
-});
-
-video.on("room.started", async (roomSession) => {
-  console.log("This is my RoomSession object:", roomSession);
-});
-```
-
-## Properties
-
-### displayName
-
-- **displayName**: `string`
-
-Display name for this room. Defaults to the value of `name`
-
----
-
-### hideVideoMuted
-
-- **hideVideoMuted**: `boolean`
-
-Whether muted videos are shown in the room layout. See [setHideVideoMuted][video-roomsession]
-
----
-
-### id
-
-- **id**: `string`
-
-Unique id for this room session
-
----
-
-### layoutName
-
-- **layoutName**: `string`
-
-Current layout name used in the room.
-
----
-
-### meta
-
-- **meta**: [`Record`][record-type]`<string, unknown>`
-
-Metadata associated to this room session.
-
----
-
-### name
-
-- **name**: `string`
-
-Name of this room
-
----
-
-### previewUrl
-
-- `Optional` **previewUrl**: `string`
-
-URL to the room preview.
-
----
-
-### layoutName
-
-- `Optional` **layoutName**: `string`
-
-Current layout name used in the room.
-
----
-
-### recording
-
-- **recording**: `boolean`
-
-Whether recording is active
-
----
-
-### recordings
-
-- `Optional` **recordings**: `any[]`
-
-<Warning title="Deprecated">
-
-Please use [getRecordings][link] instead.
-
-</Warning>
-
-List of active recordings in the room
-
----
-
-### roomId
-
-- **roomId**: `string`
-
-Id of the room associated to this room session
-
-## Methods
-
-### audioMute
-
-- **audioMute**(`params`): `Promise<void>`
-
-Puts the microphone of a given member on mute. The other participants will not hear audio from the muted participant anymore.
-
-#### Parameters
-
-| Name              | Type     | Description               |
-|:------------------|:---------|:--------------------------|
-| `params`          | `Object` | -                         |
-| `params.memberId` | `string` | Id of the member to mute. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.audioMute({ memberId: id });
-```
-
----
-
-### audioUnmute
-
-- **audioUnmute**(`params`): `Promise<void>`
-
-Unmutes the microphone of a given member if it had been previously muted.
-
-#### Parameters
-
-| Name              | Type     | Description                 |
-|:------------------|:---------|:----------------------------|
-| `params`          | `Object` | -                           |
-| `params.memberId` | `string` | Id of the member to unmute. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.audioUnmute({ memberId: id });
-```
-
----
-
-### deaf
-
-- **deaf**(`params`): `Promise<void>`
-
-Mutes the incoming audio for a given member. The affected participant will not hear audio from the other participants anymore.
-
-Note that in addition to making a participant deaf, this will also automatically mute the microphone of the target participant. If you want, you can then manually unmute it by calling [audioUnmute][video-roomsession-1].
-
-#### Parameters
-
-| Name              | Type     | Description                 |
-|:------------------|:---------|:----------------------------|
-| `params`          | `Object` | -                           |
-| `params.memberId` | `string` | Id of the member to affect. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.deaf({ memberId: id });
-```
-
----
-
-### deleteMemberMeta
-
-- **deleteMemberMeta**(`params`): `Promise<void>`
-
-Deletes the specified keys from the metadata for the specified member.
-
-#### Parameters
-
-| Name               | Type       | Description                                                                             |
-|:-------------------|:-----------|:----------------------------------------------------------------------------------------|
-| `params`           | `Object`   | -                                                                                       |
-| `params.memberId?` | `string`   | Id of the member to affect. If omitted, affects the default device in the local client. |
-| `params.keys`      | `string[]` | The keys to remove.                                                                     |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-roomSession.on("member.updated", (e) => {
-  // We can set an event listener to log changes to the metadata.
-  console.log(e.member.meta);
-});
-
-await roomSession.setMemberMeta({
-  memberId: "...",
-  meta: { foo: "bar", baz: true },
-});
-// The logger will now print `{ foo: "bar", baz: true }`
-
-await roomSession.deleteMemberMeta({ memberId: "...", keys: ["foo"] });
-// The logger will now print `{ baz: true }`
-```
-
----
-
-### deleteMeta
-
-- **deleteMeta**(`keys`): `Promise<void>`
-
-Deletes the specified keys from the metadata for this RoomSession.
-
-#### Parameters
-
-| Name   | Type       | Description         |
-|:-------|:-----------|:--------------------|
-| `keys` | `string[]` | The keys to remove. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-roomSession.on("room.updated", (e) => {
-  // We can set an event listener to log changes to the metadata.
-  console.log(e.room.meta);
-});
-
-await roomSession.setMeta({ foo: "bar", baz: true });
-// The logger will now print `{ foo: "bar", baz: true }`
-
-await roomSession.deleteMeta(["foo"]);
-// The logger will now print `{ baz: true }`
-```
-
----
-
-### demote
-
-- **demote**(`params`): `Promise<void>`
-
-Demotes a participant from "member" to "audience". See [promote][link-1].
-
-#### Parameters
-
-| Name                   | Type                                        | Description                                                                                                      |
-|:-----------------------|:--------------------------------------------|:-----------------------------------------------------------------------------------------------------------------|
-| `params`               | `Object`                                    | -                                                                                                                |
-| `params.memberId`      | `string`                                    | Id of the member to affect.                                                                                      |
-| `params.mediaAllowed?` | `"all"` \| `"audio-only"` \| `"video-only"` | Specifies the media that the client will be allowed to _receive_. An audience participant cannot send any media. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```javascript
-await roomSession.demote({
-  memberId: "de550c0c-3fac-4efd-b06f-b5b8614b8966",
-  mediaAllowed: "all",
-});
-```
-
----
-
-### getLayouts
-
-- **getLayouts**(): `Promise<{ layouts: string[] }>`
-
-Returns a list of available layouts for the room. To set a room layout, use [setLayout][video-roomsession-2].
-
-#### Returns
-
-`Promise<{ layouts: string[] }>`
-
-#### Example
-
-```typescript
-await roomSession.getLayouts()
-// returns:
-{
-  "layouts": [
-    "8x8", "2x1", "1x1", "5up", "5x5",
-    "4x4", "10x10", "2x2", "6x6", "3x3",
-    "grid-responsive", "highlight-1-responsive"
-  ]
-}
-```
-
----
-
-### getMembers
-
-- **getMembers**(): `Promise<{ members: VideoMemberEntity[] }>`
-
-Returns a list of members currently in the room.
-
-#### Returns
-
-`Promise<{ members: VideoMemberEntity[] }>`
-
-an object with type: `Promise<{ members: VideoMemberEntity[] }>`
-
-#### Example
-
-```typescript
-await roomSession.getMembers()
-// returns:
-{
-"members": [
-    {
-         "visible": true,
-         "room_session_id": "fde15619-13c1-4cb5-899d-96afaca2c52a",
-         "input_volume": 0,
-         "id": "1bf4d4fb-a3e4-4d46-80a8-3ebfdceb2a60",
-         "input_sensitivity": 50,
-         "output_volume": 0,
-         "audio_muted": false,
-         "name": "Mark",
-         "deaf": false,
-         "video_muted": false,
-         "room_id": "aae25822-892c-4832-b0b3-34aac3a0e8d1",
-         "type": "member"
-    },
-    {
-         "visible": true,
-         "room_session_id": "fde15619-13c1-4cb5-899d-96afaca2c52a",
-         "input_volume": 0,
-         "id": "e0c5be44-d6c7-438f-8cda-f859a1a0b1e7",
-         "input_sensitivity": 50,
-         "output_volume": 0,
-         "audio_muted": false,
-         "name": "David",
-         "deaf": false,
-         "video_muted": false,
-         "room_id": "aae25822-892c-4832-b0b3-34aac3a0e8d1",
-         "type": "member"
-    }
-]
-}
-```
-
----
-
-### getMemberMeta
-
-- **getMemberMeta**(): `Promise<{ meta: Object }>`
-
-Returns the metadata assigned to the specified member.
-
-#### Parameters
-
-| Name              | Type     | Description                                        |
-|:------------------|:---------|:---------------------------------------------------|
-| `params`          | `Object` | -                                                  |
-| `params.memberId` | `string` | Id of the member for which to obtain the metadata. |
-
-#### Returns
-
-`Promise<{ meta: Object }>`
-
-#### Example
-
-```javascript
-const { meta } = await roomSession.getMemberMeta();
-console.log(meta);
-```
-
----
-
-### getMeta
-
-- **getMeta**(): `Promise<{ meta: Object }>`
-
-Returns the metadata assigned to this Room Session.
-
-#### Returns
-
-`Promise<{ meta: Object }>`
-
-#### Example
-
-```javascript
-const { meta } = await roomSession.getMeta();
-console.log(meta);
-```
-
----
-
-### getPlaybacks
-
-- **getPlaybacks**(): `Promise<{ playbacks: RoomSessionPlayback }>` - See [RoomSessionPlayback][roomsessionplayback-5] for more details.
-
-Obtains a list of playbacks for the current room session.
-
-#### Returns
-
-`Promise<{ playbacks: RoomSessionPlayback }>` - See [RoomSessionPlayback][roomsessionplayback-5] for more details.
-
-#### Example
-
-```js
-const pl = await roomSession.getPlaybacks();
-if (pl.playbacks.length > 0) {
-  console.log(rec.playbacks[0].id, recs.playbacks[0].state);
-}
-```
-
----
-
-### getRecordings
-
-- **getRecordings**(): `Promise<{ recordings: RoomSessionRecording }>` - See [RoomSessionRecording][roomsessionrecording-5] for more details.
-
-Obtains a list of recordings for the current room session.
-
-#### Returns
-
-`Promise<{ recordings: RoomSessionRecording }>` - See [RoomSessionRecording][roomsessionrecording-5] for more details.
-
-#### Example
-
-```javascript
-const recs = await roomSession.getRecordings();
-if (recs.recordings.length > 0) {
-  console.log(recs.recordings[0].id, recs.recordings[0].duration);
-}
-```
-
----
-
-### getStreams
-
-- **getStreams**(): `Promise<{ streams: RoomSessionStream }>` - See [RoomSessionStream][roomsessionstream-4] for more details.
-
-Obtains a list of active streams for this RoomSession. These are RTMP streams of
-the audio/video content of this room, which will be sent to an external party
-(e.g., to YouTube).
-
-#### Returns
-
-`Promise<{ streams: RoomSessionStream }>` - See [RoomSessionStream][roomsessionstream-4] for more details.
-
-#### Example
-
-```javascript
-const s = await roomSession.getStreams();
-for (const stream of s.streams) {
-  console.log(stream.id, stream.url);
-}
-```
-
----
-
-### lock
-
-- **lock**(`params`): `Promise<void>`
-
-Locks the room. This prevents new participants from joining the room.
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-await roomSession.lock();
-```
-
----
-
-### off
-
-<Markdown src="/snippets/realtime-sdk/method_off.mdx" />
-
----
-
-### on
-
-<Markdown src="/snippets/realtime-sdk/method_on.mdx" />
-
----
-
-### once
-
-<Markdown src="/snippets/realtime-sdk/method_once.mdx" />
-
----
-
-### play
-
-- **play**(`params`): `Promise<RoomSessionPlayback>` - See [RoomSessionPlayback][roomsessionplayback-5] for more details.
-
-Starts a playback in the room. You can use the returned [RoomSessionPlayback][roomsessionplayback-5] object to control the playback (e.g., pause, resume, setVolume and stop).
-
-#### Parameters
-
-| Name                   | Type             | Description                                                                                                                    |
-|:-----------------------|:-----------------|:-------------------------------------------------------------------------------------------------------------------------------|
-| `params`               | `Object`         | -                                                                                                                              |
-| `params.url`           | `string`         | The url (http, https, rtmp, rtmps) of the stream to reproduce.                                                                 |
-| `params.seekPosition?` | `number`         | The starting timecode in milliseconds for playback. Defaults to `0`.                                                           |
-| `params.positions?`    | `VideoPositions` | Positions to assign as soon as the playback starts. You can use the special keyword `self` to refer to the id of the playback. |
-| `params.layout?`       | `string`         | Layout to change to when the playback starts.                                                                                  |
-
-#### Returns
-
-`Promise<RoomSessionPlayback>` - See [RoomSessionPlayback][roomsessionplayback-5] for more details.
-
-#### Example
-
-```typescript
-const playback = await roomSession.play({ url: "rtmp://example.com/foo" });
-await playback.stop();
-```
-
----
-
-### promote
-
-- **promote**(`params`): `Promise<void>`
-
-Promotes a participant from "audience" to "member". See [demote][link-2].
-
-#### Parameters
-
-| Name                     | Type                                        | Description                                                                                                       |
-|:-------------------------|:--------------------------------------------|:------------------------------------------------------------------------------------------------------------------|
-| `params`                 | `Object`                                    | -                                                                                                                 |
-| `params.memberId`        | `string`                                    | Id of the audience participant to promote.                                                                        |
-| `params.joinAudioMuted?` | `boolean`                                   | Force the member's audio to be muted right after the promotion.                                                   |
-| `params.joinVideoMuted?` | `boolean`                                   | Force the member's video to be muted right after the promotion.                                                   |
-| `params.mediaAllowed?`   | `"all"` \| `"audio-only"` \| `"video-only"` | Specifies the media that the client will be allowed to _send_. A member participant can always receive all media. |
-| `params.meta?`           | [`Record`][record-type]`<string, unknown>`  | Metadata to assign to the member.                                                                                 |
-| `params.permissions?`    | `string[]`                                  | List of [permissions][permissions] to grant when the Audience participant will become a Member.                   |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```javascript
-await roomSession.promote({
-  memberId: "de550c0c-3fac-4efd-b06f-b5b8614b8966",
-  mediaAllowed: "all",
-  permissions: [
-    "room.self.audio_mute",
-    "room.self.audio_unmute",
-    "room.self.video_mute",
-    "room.self.video_unmute",
-    "room.list_available_layouts",
-  ],
-});
-```
-
----
-
-### removeAllListeners
-
-<Markdown src="/snippets/realtime-sdk/method_removealllisteners.mdx" />
-
----
-
-### removeAllMembers
-
-- **removeAllMembers**(): `Promise<void>`
-
-Removes all the members from this room session. The room session will end.
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-await roomSession.removeAllMembers();
-```
-
----
-
-### removeMember
-
-- **removeMember**(`params`): `Promise<void>`
-
-Removes a specific participant from the room.
-
-#### Parameters
-
-| Name              | Type     | Description                 |
-|:------------------|:---------|:----------------------------|
-| `params`          | `Object` | -                           |
-| `params.memberId` | `string` | Id of the member to remove. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.removeMember({ memberId: id });
-```
-
----
-
-### setHideVideoMuted
-
-- **setHideVideoMuted**(`value`): `Promise<void>`
-
-Show or hide muted videos in the room layout. Members that have been muted via [videoMute][video-roomsession-3] not appear in the video stream, instead of appearing as a mute image, if this setting is enabled.
-
-Muted videos are shown by default.
-
-#### Parameters
-
-| Name    | Type      | Description                                      |
-|:--------|:----------|:-------------------------------------------------|
-| `value` | `boolean` | Whether to hide muted videos in the room layout. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-await roomSession.setHideVideoMuted(false);
-```
-
----
-
-### setInputSensitivity
-
-- **setInputSensitivity**(`params`): `Promise<void>`
-
-Sets the input level at which the participant is identified as currently speaking.
-
-#### Parameters
-
-| Name              | Type     | Description                                                                                                               |
-|:------------------|:---------|:--------------------------------------------------------------------------------------------------------------------------|
-| `params`          | `Object` | -                                                                                                                         |
-| `params.memberId` | `string` | Id of the member to affect.                                                                                               |
-| `params.value`    | `number` | Desired sensitivity from 0 (lowest sensitivity, essentially muted) to 100 (highest sensitivity). The default value is 30. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.setInputSensitivity({ memberId: id, value: 80 });
-```
-
----
-
-### setInputVolume
-
-- **setInputVolume**(`params`): `Promise<void>`
-
-Sets the input volume for a given member (e.g., the microphone input level).
-
-#### Parameters
-
-| Name              | Type     | Description                                                       |
-|:------------------|:---------|:------------------------------------------------------------------|
-| `params`          | `Object` | -                                                                 |
-| `params.memberId` | `string` | Id of the member to affect.                                       |
-| `params.volume`   | `number` | Desired volume. Values range from -50 to 50, with a default of 0. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.setInputVolume({ memberId: id, volume: -10 });
-```
-
----
-
-### setLayout
-
-- **setLayout**(`params`): `Promise<void>`
-
-Sets a layout for the room. You can obtain a list of available layouts with [getLayouts][video-roomsession-4].
-
-#### Parameters
-
-| Name                | Type             | Description                                           |
-|:--------------------|:-----------------|:------------------------------------------------------|
-| `params`            | `Object`         | -                                                     |
-| `params.name`       | `string`         | Name of the layout.                                   |
-| `params.positions?` | `VideoPositions` | Positions to assign as soon as the new layout is set. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-Set the 6x6 layout:
-
-```typescript
-await roomSession.setLayout({ name: "6x6" });
-```
-
----
-
-### setMemberMeta
-
-- **setMemberMeta**(`params`): `Promise<void>`
-
-Assigns custom metadata to the specified RoomSession member. You can use this to store metadata whose meaning is entirely defined by your application.
-
-Note that calling this method overwrites any metadata that had been previously set on the specified member.
-
-#### Parameters
-
-| Name              | Type                                       | Description                                  |
-|:------------------|:-------------------------------------------|:---------------------------------------------|
-| `params`          | `Object`                                   | -                                            |
-| `params.memberId` | `string`                                   | Id of the member to affect.                  |
-| `params.meta`     | [`Record`][record-type]`<string, unknown>` | The medatada object to assign to the member. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-Setting metadata for a member:
-
-```js
-await roomSession.setMemberMeta({
-  memberId: 'de550c0c-3fac-4efd-b06f-b5b8614b8966'  // you can get this from getMembers()
-  meta: {
-    email: 'joe@example.com'
-  }
-})
-```
-
----
-
-### setMemberPosition
-
-- **setMemberPosition**(`params`): `Promise<void>`
-
-Assigns a position in the layout to the specified member.
-
-#### Parameters
-
-| Name              | Type            | Description                       |
-|:------------------|:----------------|:----------------------------------|
-| `params`          | `Object`        | -                                 |
-| `params.memberId` | `string`        | Id of the member to affect.       |
-| `params.position` | `VideoPosition` | Position to assign in the layout. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-await roomSession.setMemberPosition({
-  memberId: "1bf4d4fb-a3e4-4d46-80a8-3ebfdceb2a60",
-  position: "off-canvas",
-});
-```
-
----
-
-### setMeta
-
-- **setMeta**(`meta`): `Promise<void>`
-
-Assigns custom metadata to the RoomSession. You can use this to store metadata whose meaning is entirely defined by your application.
-
-Note that calling this method overwrites any metadata that had been previously set on this RoomSession.
-
-#### Parameters
-
-| Name   | Type                                       | Description                                       |
-|:-------|:-------------------------------------------|:--------------------------------------------------|
-| `meta` | [`Record`][record-type]`<string, unknown>` | The metadata object to assign to the RoomSession. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-await roomSession.setMeta({ foo: "bar" });
-```
-
----
-
-### setMicrophoneVolume
-
-- **setMicrophoneVolume**(`params`): `Promise<void>`
-
-> ⚠️ Deprecated.
-> Use [setInputVolume][video-roomsession-5] instead.
-> `setMicrophoneVolume` will be removed in v4.0.0
-
-#### Parameters
-
-| Name              | Type     |
-|:------------------|:---------|
-| `params`          | `Object` |
-| `params.memberId` | `string` |
-| `params.volume`   | `number` |
-
-#### Returns
-
-`Promise<void>`
-
----
-
-### setOutputVolume
-
-- **setOutputVolume**(`params`): `Promise<void>`
-
-Sets the output volume for the member (e.g., the speaker output level).
-
-#### Parameters
-
-| Name              | Type     | Description                                                       |
-|:------------------|:---------|:------------------------------------------------------------------|
-| `params`          | `Object` | -                                                                 |
-| `params.memberId` | `string` | Id of the member to affect.                                       |
-| `params.volume`   | `number` | Desired volume. Values range from -50 to 50, with a default of 0. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.setOutputVolume({ memberId: id, volume: -10 });
-```
-
----
-
-### setPositions
-
-- **setPositions**(`params`): `Promise<void>`
-
-Assigns a position in the layout for multiple members.
-
-#### Parameters
-
-| Name               | Type             | Description                                    |
-|:-------------------|:-----------------|:-----------------------------------------------|
-| `params`           | `Object`         | -                                              |
-| `params.positions` | `VideoPositions` | Mapping of member IDs and positions to assign. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-await roomSession.setPositions({
-  positions: {
-    "1bf4d4fb-a3e4-4d46-80a8-3ebfdceb2a60": "reserved-1",
-    "e0c5be44-d6c7-438f-8cda-f859a1a0b1e7": "auto"
-  },
-});
-```
-
----
-
-### setPrioritizeHandraise
-
-- **setPrioritizeHandraise**(`params`): `Promise<boolean>`
-
-Set whether to prioritize hand-raise or not.
-Users with raised hands will be shown in the main video area over other participants who don't have their hand raised.
-
-#### Parameters
-
-| Name    | Type      | Description                                                                                                                                                             |
-|:--------|:----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `param` | `boolean` | Whether to prioritize participants on the canvas with their hand-raised. Default: `true`. If omitted, the hand status is toggled to the opposite of the current status. |
-
-#### Permissions
-
-- `video.prioritize_handraise`
-
-You need to specify the permissions when [creating the Video Room Token][creating-the-video-room-token-1] on the server side.
-
-#### Returns
-
-`Promise<boolean>`
-
-#### Example
-
-```javascript
-await room.setPrioritizeHandraise(false)
-```
-
----
-
-### setRaisedHand
-
-- **setRaisedHand**(`params`): `Promise<void>`
-
-Sets the raised hand status for the current member.
-
-#### Parameters
-
-| Name              | Type      | Description                                                                                                                        |
-|:------------------|:----------|:-----------------------------------------------------------------------------------------------------------------------------------|
-| `params`          | `Object`  | -                                                                                                                                  |
-| `params.memberId` | `string`  | Id of the member to affect.                                                                                                        |
-| `params.raised?`  | `boolean` | Whether to raise or lower the hand. Default: `true`. If omitted, the hand status is toggled to the opposite of the current status. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Permissions
-
-- `video.member.raisehand`: to raise a hand
-- `video.member.lowerhand`: to lower a hand
-
-You need to specify the permissions when [creating the Video Room Token][creating-the-video-room-token-1] on the server side.
-
-#### Example
-
-```javascript
-await room.setRaisedHand({
-  memberId: "de550c0c-3fac-4efd-b06f-b5b86...",
-  raised: false
-});
-```
-
----
-
-### setSpeakerVolume
-
-- **setSpeakerVolume**(`params`): `Promise<void>`
-
-> ⚠️ Deprecated.
-> Use [setOutputVolume][video-roomsession-6] instead.
-> `setSpeakerVolume` will be removed in v4.0.0
-
-#### Parameters
-
-| Name              | Type     |
-|:------------------|:---------|
-| `params`          | `Object` |
-| `params.memberId` | `string` |
-| `params.volume`   | `number` |
-
-#### Returns
-
-`Promise<void>`
-
----
-
-### startRecording
-
-- **startRecording**(): `Promise<RoomSessionRecording>` - See [RoomSessionRecording][roomsessionrecording-5] for more details.
-
-Starts the recording of the room. You can use the returned [RoomSessionRecording][roomsessionrecording-5] object to control the recording (e.g., pause, resume, stop).
-
-#### Returns
-
-`Promise<RoomSessionRecording>` - See [RoomSessionRecording][roomsessionrecording-5] for more details.
-
-#### Example
-
-```javascript
-const rec = await roomSession.startRecording();
-await rec.stop();
-```
-
----
-
-### startStream
-
-- **startStream**(): `Promise<RoomSessionStream>` - See [RoomSessionStream][roomsessionstream-4] for more details.
-
-Starts streaming the audio/video of this room to an external service. You can
-use the returned [RoomSessionStream][roomsessionstream-4] object to
-interact with the stream.
-
-#### Parameters
-
-| Name         | Type     | Description                                                                                    |
-|:-------------|:---------|:-----------------------------------------------------------------------------------------------|
-| `params`     | `Object` |                                                                                                |
-| `params.url` | `string` | RTMP or RTMPS url. This must be the address of a server accepting incoming RTMP/RTMPS streams. |
-
-#### Returns
-
-`Promise<RoomSessionStream>` - See [RoomSessionStream][roomsessionstream-4] for more details.
-
-#### Example
-
-```javascript
-const stream = await roomSession.startStream({ url: "rtmp://example.com" });
-
-// Stop the stream after 60 seconds
-setTimeout(() => stream.stop(), 60000);
-```
-
----
-
-### subscribe
-
-- **subscribe**(): `Promise<RoomSessionFullState>` - See [RoomSessionFullState][roomsessionfullstate-2] for more details.
-
-Listens for the events for which you have provided event handlers and returns the [RoomSessionFullState][roomsessionfullstate-2] that contains the full state of the room session.
-
-Note that you don't need to manually call this method to start listening to events, since they are listened automatically.
-
-#### Returns
-
-`Promise<RoomSessionFullState>` - See [RoomSessionFullState][roomsessionfullstate-2] for more details.
-
-#### Example
-
-```typescript
-const client = ...  // get a client with createClient()
-
-client.video.on('room.started', async (roomSession) => {
-  // attach event listeners...
-  // roomSession.on(...)
-
-  // This gives you the full state of the room session!
-  const roomSessionState = await roomSession.subscribe()
-  console.log('room name:', roomSessionState.name)
-  console.log('members:', roomSessionState.members)
-}
-```
-
----
-
-### undeaf
-
-- **undeaf**(`params`): `Promise<void>`
-
-Unmutes the incoming audio for a given member. The affected participant will start hearing audio from the other participants again.
-
-Note that in addition to allowing a participants to hear the others, this will also automatically unmute the microphone of the target participant. If you want, you can then manually mute it by calling [audioMute][video-roomsession-7].
-
-#### Parameters
-
-| Name              | Type     | Description                 |
-|:------------------|:---------|:----------------------------|
-| `params`          | `Object` | -                           |
-| `params.memberId` | `string` | Id of the member to affect. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.undeaf({ memberId: id });
-```
-
----
-
-### updateMemberMeta
-
-- **updateMemberMeta**(`params`): `Promise<void>`
-
-Updates a member's metadata in only the specified fields. This is different from
-[setMemberMeta][link-3], which replaces the whole metadata object.
-
-#### Parameters
-
-| Name               | Type                                       | Description                                                         |
-|:-------------------|:-------------------------------------------|:--------------------------------------------------------------------|
-| `params`           | `Object`                                   | -                                                                   |
-| `params.memberId?` | `string`                                   | Id of the member to affect. If omitted, affects the current member. |
-| `params.meta`      | [`Record`][record-type]`<string, unknown>` | The update to the metadata.                                         |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-roomSession.on("member.updated", (e) => {
-  // We can set an event listener to log changes to the metadata.
-  console.log(e.member.meta);
-});
-
-await roomSession.setMemberMeta({
-  memberId: "...",
-  meta: { foo: "bar", baz: true },
-});
-// The logger will now print `{ foo: "bar", baz: true }`
-
-await roomSession.updateMemberMeta({
-  memberId: "...",
-  meta: { baz: false, t: 10 },
-});
-// The logger will now print `{ foo: "bar", baz: false, t: 10 }`
-```
-
----
-
-### updateMeta
-
-- **updateMeta**(`meta`): `Promise<void>`
-
-Updates the RoomSession metadata by only setting the specified fields. This is
-different from [setMeta][link-4], which replaces the whole metadata object.
-
-#### Parameters
-
-| Name   | Type                                       | Description                 |
-|:-------|:-------------------------------------------|:----------------------------|
-| `meta` | [`Record`][record-type]`<string, unknown>` | The update to the metadata. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-roomSession.on("room.updated", (e) => {
-  // We can set an event listener to log changes to the metadata.
-  console.log(e.room.meta);
-});
-
-await roomSession.setMeta({ foo: "bar", baz: true });
-// The logger will now print `{ foo: "bar", baz: true }`
-
-await roomSession.updateMeta({ baz: false, t: 10 });
-// The logger will now print `{ foo: "bar", baz: false, t: 10 }`
-```
-
----
-
-### unlock
-
-- **unlock**(`params`): `Promise<void>`
-
-Unlocks the room if it had been previously locked. This allows new participants to join the room.
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```javascript
-await roomSession.unlock();
-```
-
----
-
-### videoMute
-
-- **videoMute**(`params`): `Promise<void>`
-
-Puts the video of a given member on mute. Participants will see a mute image instead of the video stream.
-
-#### Parameters
-
-| Name              | Type     | Description               |
-|:------------------|:---------|:--------------------------|
-| `params`          | `Object` | -                         |
-| `params.memberId` | `string` | Id of the member to mute. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.videoMute({ memberId: id });
-```
-
----
-
-### videoUnmute
-
-- **videoUnmute**(`params`): `Promise<void>`
-
-Unmutes the video of a given member if it had been previously muted. Participants will start seeing the video stream again.
-
-#### Parameters
-
-| Name              | Type     | Description                 |
-|:------------------|:---------|:----------------------------|
-| `params`          | `Object` | -                           |
-| `params.memberId` | `string` | Id of the member to unmute. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```typescript
-const id = "de550c0c-3fac-4efd-b06f-b5b8614b8966"; // you can get this from getMembers()
-await roomSession.videoUnmute({ memberId: id });
-```
-
-## Events
-
-You can use this object to subscribe to the following events.
-
-### Room events
-
-- **room.started**,
-- **room.updated**,
-- **room.ended**:
-
-Emitted when the room session is, respectively, started, updated, or ended. Your event handler receives an object which is an instance of [RoomSession][roomsession].
-
-- **recording.started**,
-- **recording.updated**,
-- **recording.ended**:
-
-Emitted when a recording is, respectively, started, updated, or ended. Your event handler receives an object which is an instance of [RoomSessionRecording][roomsessionrecording-5].
-
-- **playback.started**,
-- **playback.updated**,
-- **playback.ended**:
-
-Emitted when a playback is, respectively, started, updated, or ended. Your event handler receives an object which is an instance of [RoomSessionPlayback][roomsessionplayback-5].
-
-- **layout.changed**:
-
-Emitted when the layout of the room changes.
-
-### Member events
-
-- **member.joined**:
-
-Emitted when a member joins the room. Your event handler receives an object of type [RoomSessionMember][roomsessionmember-6].
-
-- **member.left**:
-
-Emitted when a member leaves the room. Your event handler receives an object of type [RoomSessionMember][roomsessionmember-6].
-
-- **member.talking**:
-
-Emitted when a member starts or stops talking. Your event handler receives an object of type [RoomSessionMember][roomsessionmember-6].
-
-- **member.talking.started**:
-
-Emitted when a member starts talking. Your event handler receives an object of type [RoomSessionMember][roomsessionmember-6].
-
-- **member.talking.ended**:
-
-Emitted when a member stops talking. Your event handler receives an object of type [RoomSessionMember][roomsessionmember-6].
-
-- **member.updated**:
-
-Emitted when any property of one of the members is updated. Your event handler receives an object `member` of type [RoomSessionMember][roomsessionmember-6]. Use
-`member.updated` to access the list of updated properties. Example:
-
-```typescript
-roomSession.on('member.updated', (member) => {
-    console.log(member.updated)
-    // [ 'audioMuted' ]
-}
-```
-
-- **member.updated.audioMuted**,
-- **member.updated.videoMuted**,
-- **member.updated.deaf**,
-- **member.updated.onHold**,
-- **member.updated.visible**,
-- **member.updated.inputVolume**,
-- **member.updated.outputVolume**,
-- **member.updated.inputSensitivity**:
-
-Each of the above events is emitted when the associated property changes. Your event handler receives an object `member` of type [RoomSessionMember][roomsessionmember-6].
-
----
-
-### room.audience_count
-
-- **room.audience_count**(`e`)
-
-This event is received periodically, and contains a total count of audience members.
-
-Audience members joining and leaving trigger this event.
-
-#### Parameters
-
-| Name                | Type     | Description                       |
-|:--------------------|:---------|:----------------------------------|
-| `e`                 | `Object` | -                                 |
-| `e.room_session_id` | `string` | Id of the room session.           |
-| `e.room_id`         | `string` | Id of the room.                   |
-| `e.total`           | `number` | Total number of audience members. |
-
----
-
-### stream.ended
-
-- **stream.ended**(`stream`)
-
-A stream ended (e.g., it was stopped).
-
-#### Parameters
-
-| Name     | Type                                                 |
-|:---------|:-----------------------------------------------------|
-| `stream` | [`RoomSessionStream`][roomsessionstream-6] |
-
----
-
-### stream.started
-
-- **stream.started**(`stream`)
-
-A new stream started.
-
-#### Parameters
-
-| Name     | Type                                                 |
-|:---------|:-----------------------------------------------------|
-| `stream` | [`RoomSessionStream`][roomsessionstream-6] |
-
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/voice/client/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/voice/client/index.mdx
index 7a7c8020b..a153910af 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/voice/client/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/voice/client/index.mdx
@@ -1,6 +1,7 @@
 ---
 id: ff1e62ac-0124-46dd-8f4a-fa47e982544d
 title: "Voice Client"
+sidebar-title: Client
 slug: reference/voice/client
 description: Voice Client reference for initiating and receiving calls.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/voice/index.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/voice/overview.mdx
similarity index 99%
rename from fern/products/realtime-sdk/pages/v3/tech-ref/voice/index.mdx
rename to fern/products/realtime-sdk/pages/v3/tech-ref/voice/overview.mdx
index 3529c4b7f..fa3679402 100644
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/voice/index.mdx
+++ b/fern/products/realtime-sdk/pages/v3/tech-ref/voice/overview.mdx
@@ -1,6 +1,8 @@
 ---
 id: f0bdfe3e-5643-4106-b2be-bd0c93387267
 title: "Voice"
+sidebar-title: Overview
+position: 0
 slug: reference/voice
 description: Access the Voice API to make and receive phone calls programmatically. Includes methods for call control, playback, recording, and speech detection.
 max-toc-depth: 3
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/voice/voice-call.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/voice/voice-call.mdx
deleted file mode 100644
index be53a53e7..000000000
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/voice/voice-call.mdx
+++ /dev/null
@@ -1,1706 +0,0 @@
----
-id: e56f3fd0-820f-4846-943b-0f8bb0c71aa5
-title: "Call"
-slug: reference/voice/call
-description: Voice Call object reference with methods for call control including answer, hangup, play audio, record, collect digits, detect speech, and transfer calls.
-max-toc-depth: 3
----
-
-[call-10]: ./voice-call.mdx
-[call-19]: ./voice-call.mdx
-[callcollect-1]: ./callcollect.mdx
-[callcollect-6]: ./callcollect.mdx
-[callcollect]: ./callcollect.mdx#startinputtimers
-[calldetect-8]: ./calldetect.mdx
-[callplayback-12]: ./callplayback.mdx
-[callplayback-9]: ./callplayback.mdx
-[callprompt-11]: ./callprompt.mdx
-[callprompt-7]: ./callprompt.mdx
-[callrecording-3]: ./callrecording.mdx
-[callrecording-7]: ./callrecording.mdx
-[callstate-6]: ./callstate.mdx
-[calltap-3]: ./calltap.mdx
-[calltap-5]: ./calltap.mdx
-[connectphone]: #connectphone
-[connectsip]: #connectsip
-[devicebuilder-1]: ./voice-devicebuilder.mdx
-[here-3]: /voice/getting-started/voice-and-languages/
-[link-1]: #collectstartofinput
-[link-2]: #amd
-[link-3]: #detectfax
-[link-4]: #detectdigit
-[link-5]: #prompt
-[link-6]: #connect
-[link-7]: #recordaudio
-[link-8]: #disconnected
-[link]: #detectansweringmachine
-[supported-voices-and-languages-1]: /voice/getting-started/voice-and-languages
-[types-1]: ./types.mdx#collectdigitsconfig
-[types-2]: ./types.mdx#collectspeechconfig
-[types-3]: ./types.mdx#ringtonename
-[types-4]: ./types.mdx#tapdevice
-[types]: ./types.mdx#sipheader
-[voice-call-10]: ./voice-call.mdx#tapaudio
-[voice-call-1]: ./voice-call.mdx#promptringtone
-[voice-call-2]: ./voice-call.mdx#prompttts
-[voice-call-3]: ./voice-call.mdx#disconnected
-[voice-call-4]: ./voice-call.mdx#connectphone
-[voice-call-5]: ./voice-call.mdx#connectsip
-[voice-call-6]: ./voice-call.mdx#playaudio
-[voice-call-7]: ./voice-call.mdx#playsilence
-[voice-call-8]: ./voice-call.mdx#playtts
-[voice-call-9]: ./voice-call.mdx#playringtone
-[voice-call]: ./voice-call.mdx#promptaudio
-[voice-client-1]: ./voice-client.mdx
-[voice-client-1]: ./voice-client.mdx#dialphone
-[voice-client-2]: ./voice-client.mdx#dialsip
-[voice-client-3]: ./voice-client.mdx#callreceived
-[voice-client]: ./voice-client.mdx
-[voicedevicebuilder-1]: ./voice-devicebuilder.mdx
-[voiceplaylist-4]: ./voice-playlist.mdx
-[voiceplaylist]: ./voice-playlist.mdx
-
-A Call object represents an active call. You can get instances of a Call object from a [Voice.Client][voice-client], by answering or initiating calls.
-
-#### Examples
-
-Dialing a phone number and playing a message.
-
-```js
-import { Voice } from "@signalwire/realtime-api";
-
-const client = new Voice.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-  topics: ["office"],
-});
-
-const call = await client.dialPhone({
-  from: "+YYYYYYYYYY",
-  to: "+XXXXXXXXXX",
-});
-
-await call.playTTS({ text: "Welcome to SignalWire!" });
-```
-
-Answering an incoming phone call and playing a message.
-
-```js
-import { Voice } from "@signalwire/realtime-api";
-
-const client = new Voice.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-  topics: ["office"],
-});
-
-client.on("call.received", async (call) => {
-  console.log("Got call", call.from, call.to);
-
-  try {
-    await call.answer();
-    console.log("Inbound call answered");
-
-    await call.playTTS({ text: "Welcome to SignalWire!" });
-  } catch (error) {
-    console.error("Error answering inbound call", error);
-  }
-});
-```
-
-## Properties
-
-### device
-
-- **device**: `any`
-
----
-
-### direction
-
-- **direction**: `"inbound"` \| `"outbound"`
-
-Whether you are making or receiving the call.
-
----
-
-### from
-
-- **from**: `string`
-
-The phone number that the call is coming from.
-
----
-
-### headers
-
-- `Optional` **headers**: [`SipHeader`][types][]
-
----
-
-### id
-
-- `Readonly` **id**: `string`
-
-Unique id for this voice call
-
----
-
-### state
-
-- **state**: `created` | `ringing` | `answered` | `ending` | `ended`
-
-The current state of the call.
-
----
-
-### to
-
-- **to**: `string`
-
-The phone number you are attempting to call.
-
----
-
-### type
-
-- **type**: `"phone"` \| `"sip"`
-
-The type of call. Only phone and sip are currently supported.
-
-## Methods
-
-### amd
-
-- **amd**(`params?`): `Promise<CallDetect>` - See [CallDetect][calldetect-8] for more details.
-
-Detects the presence of an answering machine. Alias for [detectAnsweringMachine][link].
-
----
-
-### answer
-
-- **answer**(): `Promise<Call>` - See [Call][call-19] for more details.
-
-Answers the incoming call.
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-19] for more details.
-
-#### Example
-
-```js
-client.on("call.received", async (call) => {
-  try {
-    await call.answer();
-    console.log("Inbound call answered");
-  } catch (error) {
-    console.error("Error answering inbound call", error);
-  }
-});
-```
-
----
-
-### collect
-
-**collect**(`params`): `Promise<CallCollect>` - See [CallCollect][callcollect-1] for more details.
-
-Collect user input. For methods that include a prompt to the user, please see [promptAudio][voice-call], [promptRingtone][voice-call-1], or [promptTTS][voice-call-2].
-
-#### Parameters
-
-| Name                       | Type                                                     | Description                                                                                                                                                                                                                                          |
-|:---------------------------|:---------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params`                   | `Object`                                                 | -                                                                                                                                                                                                                                                    |
-| `params.continuous?`       | `boolean`                                                | Detect utterances and digits until stopped. Defaults to false.                                                                                                                                                                                       |
-| `params.digits?`           | [`CollectDigitsConfig`][types-1] | Configuration for collecting digits. You must either set this, or `speech`.                                                                                                                                                                          |
-| `params.speech?`           | [`CollectSpeechConfig`][types-2] | Configuration for collecting speech. You must either set this, or `digits`.                                                                                                                                                                          |
-| `params.initialTimeout?`   | `number`                                                 | Number of seconds to wait for initial input before giving up. Default is 4 seconds. Will be used only when `startInputTimers` is true or when the timer is started manually via the [`startInputTimers`][callcollect] method. |
-| `params.partialResults?`   | `boolean`                                                | If true, partial result events are fired. Default is false.                                                                                                                                                                                          |
-| `params.sendStartOfInput?` | `boolean`                                                | If true, the [`startOfInput`][link-1] event is fired when input is detected. Default is false.                                                                                                                                         |
-| `params.startInputTimers?` | `boolean`                                                | If true, the `initialTimeout` timer is started. Default is false.                                                                                                                                                                                    |
-
-#### Returns
-
-`Promise<CallCollect>` - See [CallCollect][callcollect-1] for more details.
-
-#### Examples
-
-Collecting digits input:
-
-```js
-const collect = await call.collect({
-  digits: {
-    max: 5,
-    digitTimeout: 2,
-    terminators: "#*",
-  },
-});
-const { type, digits, terminator } = await collect.ended();
-```
-
-Collecting speech input:
-
-```js
-const collect = await call.collect({
-  speech: {
-    endSilenceTimeout: 2,
-    speechTimeout: 10,
-    language: "en-US",
-    hints: ["sales", "support", "representative"],
-  },
-});
-const { type, speech } = await collect.ended();
-```
-
-Collecting digits and listening for results using the events:
-
-```js
-call.on("collect.started", (collect) => {
-  console.log("collect.started", collect);
-});
-call.on("collect.startOfInput", (collect) => {
-  console.log("Input collection started.");
-});
-call.on("collect.updated", (collect) => {
-  console.log("collect.updated", collect.digits);
-});
-call.on("collect.ended", (collect) => {
-  console.log("collect.ended", collect.digits);
-});
-call.on("collect.failed", (collect) => {
-  console.log("collect.failed", collect.reason);
-});
-
-const collect = await call.collect({
-  digits: {
-    max: 4,
-    digitTimeout: 10,
-    terminators: "#",
-  },
-  partialResults: true,
-  sendStartOfInput: true,
-});
-```
-
----
-
-### connect
-
-- **connect**(`params`): `Promise<Call>` - See [Call][call-19] for more details.
-
-Attempt to connect an existing call to a new outbound call. The two devices will hear each other. You can wait until the new peer is disconnected by calling [disconnected][voice-call-3].
-
-This is a generic method that allows you to connect to multiple devices in series, parallel, or combinations of both with the use of a [DeviceBuilder][devicebuilder-1]. For simpler use cases, prefer using [connectPhone][voice-call-4] or [connectSip][voice-call-5].
-
-#### Parameters
-
-| Name     | Type                                                                                                             | Description                                                                                                                                                                                                                       |
-|:---------|:-----------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params` | [`VoiceDeviceBuilder`][voicedevicebuilder-1] \| `{ devices: VoiceDeviceBuilder ; ringback?: VoicePlaylist }` | Pass only the Dialer specifying the devices to call or an object with the Dialer and Ringback audio to play to call leg. You can play audio, TTS, silence or ringtone. See [VoicePlaylist][voiceplaylist] for more details. |
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-19] for more details.
-
-A promise that resolves to a [`Call`][call-10] object that you can use to control the new peer. The promise resolves only after the new peer picks up the call.
-
-#### Examples
-
-Connecting to a new SIP call.
-
-```js
-const plan = new Voice.DeviceBuilder().add(
-  Voice.DeviceBuilder.Sip({
-    from: "sip:user1@domain.com",
-    to: "sip:user2@domain.com",
-    timeout: 30,
-  })
-);
-
-const peer = await call.connect(plan);
-
-await call.playTTS({ text: "You are peer 1" });
-await peer.playTTS({ text: "You are peer 2" });
-
-await call.disconnected();
-await call.playTTS({ text: "The peer disconnected" });
-```
-
-Connecting to a new SIP call, while playing ringback audio.
-
-```js
-const plan = new Voice.DeviceBuilder().add(
-  Voice.DeviceBuilder.Sip({
-    from: "sip:user1@domain.com",
-    to: "sip:user2@domain.com",
-    timeout: 30,
-  })
-);
-
-const ringback = new Voice.Playlist().add(
-  Voice.Playlist.Ringtone({
-    name: "it",
-  })
-);
-const peer = await call.connect({
-  devices: plan,
-  ringback: ringback,
-});
-```
-
----
-
-### connectPhone
-
-- **connectPhone**(`params`): `Promise<Call>` - See [Call][call-19] for more details.
-
-Attempt to connect an existing call to a new outbound phone call. The two devices will hear each other. You can wait until the new peer is disconnected by calling [disconnected][voice-call-3].
-
-#### Parameters
-
-| Name                        | Type                                   | Description                                                                                                                                                                                                                                             |
-|:----------------------------|:---------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params`                    | `Object`                               | -                                                                                                                                                                                                                                                       |
-| `params.callStateEvents`    | `string[]`                             | An optional array of event names to be notified about. Allowed values are `created`, `ringing`, `answered`, and `ended`. Default is `ended`.                                                                                                            |
-| `params.callStateUrl`       | `string`                               | Optional webhook URL to which SignalWire will send call status change notifications. See the payload specifications under [`CallState`][callstate-6].                                                                                               |
-| `params.from`               | `string`                               | The party the call is coming from. Must be a SignalWire number or SIP endpoint that you own.                                                                                                                                                            |
-| `params.maxPricePerMinute?` | `number`                               | The maximum price in USD acceptable for the call to be created. If the rate for the call is greater than this value, the call will not be created. If not set, all calls will be created. Price can have a maximum of four decimal places, i.e. 0.0075. |
-| `params.ringback?`          | [`VoicePlaylist`][voiceplaylist-4] | Ringback audio to play to call leg. You can play audio, TTS, silence or ringtone.                                                                                                                                                                       |
-| `params.timeout?`           | `number`                               | The time, in seconds, the call will ring before it is considered unanswered.                                                                                                                                                                            |
-| `params.to`                 | `string`                               | The party you are attempting to call.                                                                                                                                                                                                                   |
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-19] for more details.
-
-A promise that resolves to a [`Call`][call-10] object that you can use to control the new peer. The promise resolves only after the new peer picks up the call.
-
-#### Example
-
-```js
-const peer = await call.connectPhone({
-  from: "+xxxxxx",
-  to: "+yyyyyy",
-  timeout: 30,
-});
-
-await call.playTTS({ text: "You are peer 1" });
-await peer.playTTS({ text: "You are peer 2" });
-
-await call.disconnected();
-await call.playTTS({ text: "The peer disconnected" });
-```
-
----
-
-### connectSip
-
-- **connectSip**(`params`): `Promise<Call>` - See [Call][call-19] for more details.
-
-Attempt to connect an existing call to a new outbound SIP call. The two devices will hear each other. You can wait until the new peer is disconnected by calling [disconnected][voice-call-3].
-
-#### Parameters
-
-| Name                        | Type                                   | Description                                                                                                                                                                                                                                             |
-|:----------------------------|:---------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params`                    | `Object`                               | -                                                                                                                                                                                                                                                       |
-| `params.callStateEvents`    | `string[]`                             | An optional array of event names to be notified about. Allowed values are `created`, `ringing`, `answered`, and `ended`. Default is `ended`.                                                                                                            |
-| `params.callStateUrl`       | `string`                               | Optional webhook URL to which SignalWire will send call status change notifications. See the payload specifications under [`CallState`][callstate-6].                                                                                               |
-| `params.codecs?`            | `SipCodec`[]                           | Optional array of desired codecs in order of preference. Supported values are PCMU, PCMA, OPUS, G729, G722, VP8, H264. Default is parent leg codec(s).                                                                                                  |
-| `params.from`               | `string`                               | The party the call is coming from. Must be a SignalWire number or SIP endpoint that you own.                                                                                                                                                            |
-| `params.headers?`           | [`SipHeader`][types][] | Array of [`SipHeader`][types] objects. Must be X- headers only, see example below.                                                                                                                                                      |
-| `params.maxPricePerMinute?` | `number`                               | The maximum price in USD acceptable for the call to be created. If the rate for the call is greater than this value, the call will not be created. If not set, all calls will be created. Price can have a maximum of four decimal places, i.e. 0.0075. |
-| `params.ringback?`          | [`VoicePlaylist`][voiceplaylist-4] | Ringback audio to play to call leg. You can play audio, TTS, silence or ringtone.                                                                                                                                                                       |
-| `params.timeout?`           | `number`                               | The time, in seconds, the call will ring before it is considered unanswered.                                                                                                                                                                            |
-| `params.to`                 | `string`                               | The party you are attempting to call.                                                                                                                                                                                                                   |
-| `params.webrtcMedia?`       | `boolean`                              | If true, WebRTC media is negotiated. Default is parent leg setting.                                                                                                                                                                                     |
-| `params.sessionTimeout?`    | `number`                               | Non-negative value, in seconds, to use for the SIP `Session-Expires` header. If 0 or unset, SignalWire will pick the default (typically 600).                                                                                                           |
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-19] for more details.
-
-A promise that resolves to a [`Call`][call-10] object that you can use to control the new peer. The promise resolves only after the new peer picks up the call.
-
-#### Example
-
-```js
-const peer = await call.connectSip({
-  from: "sip:user1@domain.com",
-  to: "sip:user2@domain.com",
-  timeout: 30,
-  headers: [
-    { name: "X-SomeKeyA", value: "SomeValueA" },
-    { name: "X-SomeKeyB", value: "SomeValueB" },
-  ],
-});
-
-await call.playTTS({ text: "You are peer 1" });
-await peer.playTTS({ text: "You are peer 2" });
-
-await call.disconnected();
-await call.playTTS({ text: "The peer disconnected" });
-```
-
----
-
-### detect
-
-- **detect**(`params`): `Promise<CallDetect>` - See [CallDetect][calldetect-8] for more details.
-
-Generic method. Please see [amd][link-2], [detectFax][link-3], [detectDigit][link-4].
-
-#### Parameters
-
-| Name          | Type                                            | Description                                                                                                                                                                                                                                                                                                                                                                                    |
-|:--------------|:------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params`      | `object`                                        | -                                                                                                                                                                                                                                                                                                                                                                                              |
-| `params.type` | `"fax"` \| `"machine"` \| `"digit"` \| `"beep"` | <ul> <li>if type="digit", see the method parameters for [detectDigit][link-4]</li><li> if type="fax", see the method parameters for [detectFax][link-3]</li><li>if type="machine", see the method parameters for [detectAnsweringMachine][link]</li><li>if type="beep", see the method parameters for [detectAnsweringMachine][link]</li></ul> |
-
-#### Returns
-
-`Promise<CallDetect>` - See [CallDetect][calldetect-8] for more details.
-
----
-
-### detectAnsweringMachine
-
-- **detectAnsweringMachine**(`params?`): `Promise<CallDetect>` - See [CallDetect][calldetect-8] for more details.
-
-Detects the presence of an answering machine.
-
-#### Parameters
-
-| Name                            | Type      | Description                                                                                                                                                                              |
-|:--------------------------------|:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params?`                       | `Object`  | -                                                                                                                                                                                        |
-| `params.endSilenceTimeout?`     | `number`  | Number of seconds to wait for voice to finish. Defaults to 1.0.                                                                                                                          |
-| `params.initialTimeout?`        | `number`  | Number of seconds to wait for initial voice before giving up. Defaults to 4.5.                                                                                                           |
-| `params.machineVoiceThreshold?` | `number`  | How many seconds of voice to decide it is a machine. Defaults to 1.25.                                                                                                                   |
-| `params.machineWordsThreshold?` | `number`  | How many words to count to decide it is a machine. Defaults to 6.                                                                                                                        |
-| `params.timeout?`               | `number`  | Number of seconds to run the detector for. Defaults to 30.0.                                                                                                                             |
-| `params.waitForBeep?`           | `boolean` | Whether to wait until the device is ready for voicemail delivery. Defaults to false.                                                                                                     |
-| `params.detect_interruptions?`  | `boolean` | If set to true, a `NOT_READY` event is fired if speech is detected after the `READY` event. This allows application to restart message delivery to answering machine. Defaults to false. |
-
-#### Returns
-
-`Promise<CallDetect>` - See [CallDetect][calldetect-8] for more details.
-
-#### Example
-
-```js
-const detect = await call.detectAnsweringMachine();
-const result = await detect.ended();
-
-console.log("Detect result:", result.type);
-```
-
----
-
-### detectDigit
-
-- **detectDigit**(`params?`): `Promise<CallDetect>` - See [CallDetect][calldetect-8] for more details.
-
-Detects when a digit is pressed in an audio stream. To gather digit input from a caller, please see [prompt][link-5].
-
-#### Parameters
-
-| Name                  | Type      | Description                                                                          |
-|:----------------------|:----------|:-------------------------------------------------------------------------------------|
-| `params?`             | `Object`  | -                                                                                    |
-| `params.digits?`      | `string`  | The digits to detect. Defaults to "0123456789#\*".                                   |
-| `params.timeout?`     | `number`  | Number of seconds to run the detector for. Defaults to 30.0.                         |
-| `params.waitForBeep?` | `boolean` | Whether to wait until the device is ready for voicemail delivery. Defaults to false. |
-
-#### Returns
-
-`Promise<CallDetect>` - See [CallDetect][calldetect-8] for more details.
-
-#### Example
-
-```js
-const detect = await call.detectDigit();
-const result = await detect.ended();
-
-console.log("Detect result:", result.type);
-```
-
----
-
-### detectFax
-
-- **detectFax**(`params?`): `Promise<CallDetect>` - See [CallDetect][calldetect-8] for more details.
-
-Detects the presence of a fax machine.
-
-#### Parameters
-
-| Name                  | Type               | Description                                                                                 |
-|:----------------------|:-------------------|:--------------------------------------------------------------------------------------------|
-| `params?`             | `Object`           | -                                                                                           |
-| `params.timeout?`     | `number`           | Number of seconds to run the detector for. Defaults to 30.0.                                |
-| `params.tone?`        | `"CED"` \| `"CNG"` | The fax tone to detect: <code>CED</code> or <code>CNG</code>. Defaults to <code>CED</code>. |
-| `params.waitForBeep?` | `boolean`          | Whether to wait until the device is ready for voicemail delivery. Defaults to false.        |
-
-#### Returns
-
-`Promise<CallDetect>` - See [CallDetect][calldetect-8] for more details.
-
-#### Example
-
-```js
-const detect = await call.detectFax();
-const result = await detect.ended();
-
-console.log("Detect result:", result.type);
-```
-
----
-
-### dial
-
-- **dial**(`params`): `Promise<Call>` - See [Call][call-19] for more details.
-
-Create a new outbound call.
-
-This is a generic method that allows you to dial multiple devices in series, parallel, or combinations of both with the use of a [DeviceBuilder][devicebuilder-1]. For simpler use cases, prefer using [dialPhone][voice-client-1] or [dialSip][voice-client-2].
-
-#### Parameters
-
-| Name     | Type                                                                                                   | Description                                                                                                                               |
-|:---------|:-------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------|
-| `params` | [`VoiceDeviceBuilder`][voicedevicebuilder-1] \| `{ devices: VoiceDeviceBuilder ; region: string }` | Pass only the Dialer specifying the devices to call or an object with the Dialer and a Region of the world to originate the message from. |
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-19] for more details.
-
----
-
-### disconnect
-
-- **disconnect**(): `Promise<void>`
-
-#### Returns
-
-`Promise<void>`
-
----
-
-### disconnected
-
-- **disconnected**(): `Promise<Call>` - See [Call][call-19] for more details.
-
-Call this method after connecting a peer (e.g., using [connect][link-6],
-[connectPhone][voice-call-4], or [connectSip][voice-call-5]) to wait until the
-peer disconnects.
-
-This is equivalent to calling `peer.waitFor("ended")` on the connected peer.
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-19] for more details.
-
-#### Example
-
-```js
-const plan = new Voice.DeviceBuilder().add(
-  Voice.DeviceBuilder.Sip({
-    from: "sip:user1@domain.com",
-    to: "sip:user2@domain.com",
-    timeout: 30,
-  })
-);
-
-const peer = await call.connect(plan);
-
-await call.disconnected(); // same as `peer.waitFor("ended")`
-
-await call.playTTS({ text: "The peer disconnected" });
-```
-
----
-
-### hangup
-
-- **hangup**(`reason?`): `Promise<void>`
-
-Hangs up the call.
-
-#### Parameters
-
-| Name      | Type                                                                             | Description                     |
-|:----------|:---------------------------------------------------------------------------------|:--------------------------------|
-| `reason?` | `"error"` \| `"hangup"` \| `"cancel"` \| `"busy"` \| `"noAnswer"` \| `"decline"` | Optional reason for hanging up. |
-
-#### Returns
-
-`Promise<void>`
-
-#### Example
-
-```js
-call.hangup();
-```
-
----
-
-### off
-
-<Markdown src="/snippets/realtime-sdk/method_off.mdx" />
-
----
-
-### on
-
-<Markdown src="/snippets/realtime-sdk/method_on.mdx" />
-
----
-
-### once
-
-<Markdown src="/snippets/realtime-sdk/method_once.mdx" />
-
----
-
----
-
-### pass
-
-- **pass**(`params`): `Promise<Call>` - See [Call][call-19] for more details.
-
-This will allow a client to decline incoming calls without ending the call and redirect the call to another [Voice client][voice-client-1]
-
-Will trigger on the [`call.received`][voice-client-3] event.
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-19] for more details.
-
-#### Example
-
-```js
-client.on("call.received", async (call) => {
-  await call.pass();
-
-  // Every method on the "call" object will fail after calling "pass".
-});
-```
-
-### play
-
-- **play**(`params`): `Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-Play one or multiple media in a Call and waits until the playing has ended.
-
-The play method is a generic method for all types of media, see [playAudio][voice-call-6], [playSilence][voice-call-7], [playTTS][voice-call-8] or [playRingtone][voice-call-9] for more specific usages.
-
-#### Parameters
-
-| Name     | Type                                   | Description       |
-|:---------|:---------------------------------------|:------------------|
-| `params` | [`VoicePlaylist`][voiceplaylist-4] | A media playlist. |
-
-#### Returns
-
-`Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-#### Example
-
-```js
-await call.play(
-  new Voice.Playlist({ volume: 1.0 }).add(
-    Voice.Playlist.TTS({
-      text: "Welcome to SignalWire! Please enter your 4 digits PIN",
-    })
-  )
-);
-```
-
----
-
-### playAudio
-
-- **playAudio**(`params`): `Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-Plays an audio file.
-
-#### Parameters
-
-| Name             | Type     | Description                                                              |
-|:-----------------|:---------|:-------------------------------------------------------------------------|
-| `params`         | `Object` | -                                                                        |
-| `params.url`     | `string` | HTTP(s) URL to an audio resource to play.                                |
-| `params.volume?` | `number` | Volume value between -40dB and +40dB where 0 is unchanged. Default is 0. |
-
-#### Returns
-
-`Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-#### Example
-
-```js
-const playback = await call.playAudio({
-  url: "https://cdn.signalwire.com/default-music/welcome.mp3",
-});
-await playback.ended();
-```
-
----
-
-### playRingtone
-
-- **playRingtone**(`params`): `Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-Plays a ringtone.
-
-#### Parameters
-
-| Name               | Type                                       | Description                                                              |
-|:-------------------|:-------------------------------------------|:-------------------------------------------------------------------------|
-| `params`           | `Object`                                   | -                                                                        |
-| `params.duration?` | `number`                                   | Duration of ringtone to play. Defaults to 1 ringtone iteration.          |
-| `params.name`      | [`RingtoneName`][types-3] | The name of the ringtone.                                                |
-| `params.volume?`   | `number`                                   | Volume value between -40dB and +40dB where 0 is unchanged. Default is 0. |
-
-#### Returns
-
-`Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-#### Example
-
-```js
-const playback = await call.playRingtone({ name: "it" });
-await playback.ended();
-```
-
----
-
-### playSilence
-
-- **playSilence**(`params`): `Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-Plays some silence.
-
-#### Parameters
-
-| Name              | Type     | Description                 |
-|:------------------|:---------|:----------------------------|
-| `params`          | `Object` | -                           |
-| `params.duration` | `number` | Seconds of silence to play. |
-
-#### Returns
-
-`Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-#### Example
-
-```js
-const playback = await call.playSilence({ duration: 3 });
-await playback.ended();
-```
-
----
-
-### playTTS
-
-- **playTTS**(`params`): `Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-Plays text-to-speech.
-
-#### Parameters
-
-| Name               | Type                   | Description                                                                                                                                                                                      |
-|:-------------------|:-----------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params`           | `Object`               | -                                                                                                                                                                                                |
-| `params.gender?`   | `"male"` \| `"female"` | Gender of the voice. Defaults to `female`.                                                                                                                                                       |
-| `params.language?` | `string`               | Language of the text in `ISO 639-1` (language name) + `ISO 3166` (country code). Defaults to `en-US`.<br /> Supported languages can be found [here][here-3]                |
-| `params.text`      | `string`               | Text to play. SSML may be entered as a string wrapped in `<speak>` tags. <br />See our [supported voices and languages][supported-voices-and-languages-1] documentation for usage and supported tags. |
-| `params.voice?`    | `string`               | Voice to use (takes precedence on `gender`).<br /> Supported voices can be found [here][here-3]                                                                            |
-| `params.volume?`   | `number`               | Volume value between -40dB and +40dB where 0 is unchanged. Default is 0.                                                                                                                         |
-
-#### Returns
-
-`Promise<CallPlayback>` - See [CallPlayback][callplayback-9] for more details.
-
-#### Examples
-
-```js
-const playback = await call.playTTS({ text: "Welcome to SignalWire!" });
-await playback.ended();
-```
-
-Using SSML:
-
-```js
-const playback = await call.playTTS({
-  text: `<speak>
-      Here are <say-as interpret-as="characters">SSML</say-as> samples.
-      I can pause <break time="3s"/>.
-      I can speak in cardinals. Your number is <say-as interpret-as="cardinal">10</say-as>.
-      Or I can speak in ordinals. You are <say-as interpret-as="ordinal">10</say-as> in line.
-      Or I can even speak in digits. The digits for ten are <say-as interpret-as="characters">10</say-as>.
-      I can also substitute phrases, like the <sub alias="World Wide Web Consortium">W3C</sub>.
-      Finally, I can speak a paragraph with two sentences.
-      <p>
This is sentence one.

This is sentence two.
</p>
-    </speak>
-    `,
-  voice: "polly.Joey",
-});
-await playback.ended();
-```
-
----
-
-### prompt
-
-- **prompt**(`params`): `Promise<CallPrompt>` - See [CallPrompt][callprompt-7] for more details.
-
-Generic method to prompt the user for input. Please see [promptAudio][voice-call], [promptRingtone][voice-call-1], [promptTTS][voice-call-2] for the more specific methods.
-
-#### Parameters
-
-| Name                     | Type                                                     | Description                                                                                                                        |
-|:-------------------------|:---------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------|
-| `params`                 | `Object`                                                 | -                                                                                                                                  |
-| `params.playlist`        | [`VoicePlaylist`][voiceplaylist-4]                   | A media playlist to play.                                                                                                          |
-| `params.digits?`         | [`CollectDigitsConfig`][types-1] | Configuration for collecting digits. You must either set this, or `speech`.                                                        |
-| `params.speech?`         | [`CollectSpeechConfig`][types-2] | Configuration for collecting speech. You must either set this, or `digits`. Pass an empty object to use the default configuration. |
-| `params.initialTimeout?` | `number`                                                 | Initial timeout in seconds. Default is 4 seconds.                                                                                  |
-
-#### Returns
-
-`Promise<CallPrompt>` - See [CallPrompt][callprompt-7] for more details.
-
-#### Examples
-
-Prompting for digits and waiting for a result:
-
-```js
-const prompt = await call.prompt({
-  playlist: new Voice.Playlist().add(
-    Voice.Playlist.TTS({ text: "Please enter your PIN" })
-  ),
-  digits: {
-    max: 5,
-    digitTimeout: 2,
-    terminators: "#*",
-  },
-});
-const { type, digits, terminator } = await prompt.ended();
-```
-
-Prompting for speech and waiting for a result:
-
-```js
-const prompt = await call.prompt({
-  // prettier-ignore
-  playlist: new Voice.Playlist().add(
-    Voice.Playlist.TTS({ text: "Please say your PIN" })
-  ),
-  speech: {
-    endSilenceTimeout: 1,
-    speechTimeout: 60,
-    language: "en-US",
-    hints: [],
-  },
-});
-
-const { type, speech } = await prompt.ended();
-```
-
-Prompting for speech and listening for results using the events:
-
-```js
-call.on("prompt.started", (p) => {
-  console.log("prompt.started", p.id);
-});
-call.on("prompt.updated", (p) => {
-  console.log("prompt.updated", p.id);
-});
-call.on("prompt.failed", (p) => {
-  console.log("prompt.failed", p.id, p.reason);
-});
-call.on("prompt.ended", (p) => {
-  console.log("prompt.ended", p.id, p.text);
-});
-
-const prompt = await call.prompt({
-  // prettier-ignore
-  playlist: new Voice.Playlist().add(
-    Voice.Playlist.TTS({ text: "Please say your PIN" })
-  ),
-  speech: {},
-});
-```
-
----
-
-### promptAudio
-
-- **promptAudio**(`params`): `Promise<CallPrompt>` - See [CallPrompt][callprompt-7] for more details.
-
-Play an audio while collecting user input from the call, such as `digits` or `speech`.
-
-#### Parameters
-
-| Name                     | Type                                                     | Description                                                                                                                        |
-|:-------------------------|:---------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------|
-| `params`                 | `Object`                                                 | -                                                                                                                                  |
-| `params.digits?`         | [`CollectDigitsConfig`][types-1] | Configuration for collecting digits. You must either set this, or <code>speech</code>.                                             |
-| `params.speech?`         | [`CollectSpeechConfig`][types-2] | Configuration for collecting speech. You must either set this, or `digits`. Pass an empty object to use the default configuration. |
-| `params.initialTimeout?` | `number`                                                 | Initial timeout in seconds. Default is 4 seconds.                                                                                  |
-| `params.url`             | `string`                                                 | HTTP(s) URL to an audio resource to play.                                                                                          |
-| `params.volume?`         | `number`                                                 | Volume value between -40dB and +40dB where 0 is unchanged. Default is 0.                                                           |
-
-#### Returns
-
-`Promise<CallPrompt>` - See [CallPrompt][callprompt-7] for more details.
-
-#### Examples
-
-Prompting for digits and waiting for a result:
-
-```js
-const prompt = await call.promptAudio({
-  url: "https://cdn.signalwire.com/default-music/welcome.mp3",
-  digits: {
-    max: 5,
-    digitTimeout: 2,
-    terminators: "#*",
-  },
-});
-const { type, digits, terminator } = await prompt.ended();
-```
-
-Prompting for speech and waiting for a result:
-
-```js
-const prompt = await call.promptAudio({
-  url: "https://cdn.signalwire.com/default-music/welcome.mp3",
-  speech: {
-    endSilenceTimeout: 1,
-    speechTimeout: 60,
-    language: "en-US",
-    hints: [],
-  },
-});
-const { type, text, terminator } = await prompt.ended();
-```
-
-Prompting for speech and listening for results using the events:
-
-```js
-call.on("prompt.started", (p) => {
-  console.log("prompt.started", p.id);
-});
-call.on("prompt.updated", (p) => {
-  console.log("prompt.updated", p.id);
-});
-call.on("prompt.failed", (p) => {
-  console.log("prompt.failed", p.id, p.reason);
-});
-call.on("prompt.ended", (p) => {
-  console.log(prompt.ended, p.id, p.text);
-});
-
-const prompt = await call.promptAudio({
-  url: "https://cdn.signalwire.com/default-music/welcome.mp3",
-  speech: {},
-});
-```
-
----
-
-### promptRingtone
-
-- **promptRingtone**(`params`): `Promise<CallPrompt>` - See [CallPrompt][callprompt-7] for more details.
-
-Play a ringtone while collecting user input from the call, such as `digits` or `speech`.
-
-#### Parameters
-
-| Name                     | Type                                                     | Description                                                                                                                                   |
-|:-------------------------|:---------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------|
-| `params`                 | `Object`                                                 | -                                                                                                                                             |
-| `params.name`            | [`RingtoneName`][types-3]               | The name of the ringtone.                                                                                                                     |
-| `params.digits?`         | [`CollectDigitsConfig`][types-1] | Configuration for collecting digits. You must either set this, or <code>speech</code>.                                                        |
-| `params.speech?`         | [`CollectSpeechConfig`][types-2] | Configuration for collecting speech. You must either set this, or <code>digits</code>. Pass an empty object to use the default configuration. |
-| `params.duration?`       | `number`                                                 | Duration of ringtone to play. Defaults to 1 ringtone iteration.                                                                               |
-| `params.initialTimeout?` | `number`                                                 | Initial timeout in seconds. Default is 4 seconds.                                                                                             |
-| `params.volume?`         | `number`                                                 | Volume value between -40dB and +40dB where 0 is unchanged. Default is 0.                                                                      |
-
-#### Returns
-
-`Promise<CallPrompt>` - See [CallPrompt][callprompt-7] for more details.
-
-#### Examples
-
-Prompting for digits and waiting for a result:
-
-```js
-const prompt = await call.promptRingtone({
-  name: "it",
-  duration: 10,
-  digits: {
-    max: 5,
-    digitTimeout: 2,
-    terminators: "#*",
-  },
-});
-const { type, digits, terminator } = await prompt.ended();
-```
-
-Prompting for speech and waiting for a result:
-
-```js
-const prompt = await call.promptRingtone({
-  name: "it",
-  duration: 10,
-  speech: {
-    endSilenceTimeout: 1,
-    speechTimeout: 60,
-    language: "en-US",
-    hints: [],
-  },
-});
-const { type, text, terminator } = await prompt.ended();
-```
-
-Prompting for speech and listening for results using the events:
-
-```js
-call.on("prompt.started", (p) => {
-  console.log("prompt.started", p.id);
-});
-call.on("prompt.updated", (p) => {
-  console.log("prompt.updated", p.id);
-});
-call.on("prompt.failed", (p) => {
-  console.log("prompt.failed", p.id, p.reason);
-});
-call.on("prompt.ended", (p) => {
-  console.log(prompt.ended, p.id, p.text);
-});
-
-const prompt = await call.promptRingtone({
-  name: "it",
-  duration: 10,
-  speech: {},
-});
-```
-
----
-
-### promptTTS
-
-- **promptTTS**(`params`): `Promise<CallPrompt>` - See [CallPrompt][callprompt-7] for more details.
-
-Play text-to-speech while collecting user input from the call, such as `digits` or `speech`.
-
-#### Parameters
-
-| Name                     | Type                                                     | Description                                                                                                                                                                                      |
-|:-------------------------|:---------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params`                 | `Object`                                                 | -                                                                                                                                                                                                |
-| `params.text`            | `string`                                                 | Text to play. SSML may be entered as a string wrapped in `<speak>` tags.<br /> See our [supported voices and languages][supported-voices-and-languages-1] documentation for usage and supported tags. |
-| `params.digits?`         | [`CollectDigitsConfig`][types-1] | Configuration for collecting digits. You must either set this, or `speech`.                                                                                                                      |
-| `params.speech?`         | [`CollectSpeechConfig`][types-2] | Configuration for collecting speech. You must either set this, or `digits`. Pass an empty object to use the default configuration.                                                               |
-| `params.gender?`         | `"male"` \| `"female"`                                   | Gender of the voice (`male` or `female`). Defaults to `female`.                                                                                                                                  |
-| `params.initialTimeout?` | `number`                                                 | Initial timeout in seconds. Default is 4 seconds.                                                                                                                                                |
-| `params.language?`       | `string`                                                 | Language of the text in `ISO 639-1` (language name) + `ISO 3166` (country code). Defaults to `en-US`.<br />Supported languages can be found [here][here-3]                 |
-| `params.volume?`         | `number`                                                 | Volume value between -40dB and +40dB where 0 is unchanged. Default is 0.                                                                                                                         |
-| `params.voice?`          | `string`                                                 | Voice to use (takes precedence on `gender`).<br />Supported voices can be found [here][here-3]                                                                             |
-
-#### Returns
-
-`Promise<CallPrompt>` - See [CallPrompt][callprompt-7] for more details.
-
-#### Examples
-
-Prompting for digits and waiting for a result:
-
-```js
-const prompt = await call.promptTTS({
-  text: "Please enter your PIN",
-  digits: {
-    max: 5,
-    digitTimeout: 2,
-    terminators: "#*",
-  },
-});
-const { type, digits, terminator } = await prompt.ended();
-```
-
-Prompting for speech and waiting for a result:
-
-```js
-const prompt = await call.promptTTS({
-  text: "Please enter your PIN",
-  speech: {
-    endSilenceTimeout: 1,
-    speechTimeout: 60,
-    language: "en-US",
-    hints: [],
-  },
-});
-const { type, text, terminator } = await prompt.ended();
-```
-
-Prompting for speech and listening for results using the events:
-
-```js
-call.on("prompt.started", (p) => {
-  console.log("prompt.started", p.id);
-});
-call.on("prompt.updated", (p) => {
-  console.log("prompt.updated", p.id);
-});
-call.on("prompt.failed", (p) => {
-  console.log("prompt.failed", p.id, p.reason);
-});
-call.on("prompt.ended", (p) => {
-  console.log(prompt.ended, p.id, p.text);
-});
-
-const prompt = await call.promptTTS({
-  text: "Please enter your PIN",
-  speech: {},
-});
-```
-
-Prompting for digits with SSML and waiting for a result:
-
-```js
-const prompt = await call.promptTTS({
-  text: `<speak>
-      Please enter your <say-as interpret-as="characters">UUID</say-as>.
-      It should be a <say-as interpret-as="cardinal">10</say-as> digit number.
-    </speak>`,
-  voice: "polly.Joey",
-  digits: {
-    max: 5,
-    digitTimeout: 2,
-    terminators: "#*",
-  },
-});
-const { type, speech, terminator } = await prompt.ended();
-```
-
----
-
-### record
-
-- **record**(`params`): `Promise<CallRecording>` - See [CallRecording][callrecording-3] for more details.
-
-Generic method to record a call. Please prefer using [recordAudio][link-7].
-
-#### Parameters
-
-| Name           | Type     | Description                                         |
-|:---------------|:---------|:----------------------------------------------------|
-| `params`       | `Object` | -                                                   |
-| `params.audio` | `Object` | See the parameters for [recordAudio][link-7]. |
-
-#### Returns
-
-`Promise<CallRecording>` - See [CallRecording][callrecording-3] for more details.
-
----
-
-### recordAudio
-
-- **recordAudio**(`params?`): `Promise<CallRecording>` - See [CallRecording][callrecording-3] for more details.
-
-Records the audio from the call.
-
-#### Parameters
-
-| Name                        | Type                                | Description                                                                                                                                             |
-|:----------------------------|:------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `params?`                   | `Object`                            | -                                                                                                                                                       |
-| `params.beep?`              | `boolean`                           | Whether to play a beep. Default is false.                                                                                                               |
-| `params.direction?`         | `"listen"` \| `"speak"` \| `"both"` | Direction to record. Can be `listen` (what the caller hears), `speak` (what the caller says), or `both`. Default is `speak`.                            |
-| `params.endSilenceTimeout?` | `number`                            | How long to wait (in seconds) until the caller has stopped speaking. Disable by passing `0`. Default is `1.0`.                                          |
-| `params.format?`            | `"mp3"` \| `"wav"`                  | Format of the recording. Default is `mp3`.                                                                                                              |
-| `params.initialTimeout?`    | `number`                            | How long to wait (in seconds) until something is heard in the recording. Disable by passing `0`. Default is `5.0`.                                      |
-| `params.inputSensitivity?`  | `number`                            | Controls how sensitive the voice activity detector is to background noise, where `0` is least sensitive and `100` is most sensitive. Default is `44.0`. |
-| `params.stereo?`            | `boolean`                           | Whether to record in stereo mode. Default is `false`.                                                                                                   |
-| `params.terminators?`       | `string`                            | DTMF digits that, when dialed, will end the recording. Default is `#\*`.                                                                                |
-
-#### Returns
-
-`Promise<CallRecording>` - See [CallRecording][callrecording-3] for more details.
-
-#### Example
-
-```js
-const recording = await call.recordAudio({ direction: "both" });
-await recording.stop();
-```
-
----
-
-### removeAllListeners
-
-<Markdown src="/snippets/realtime-sdk/method_removealllisteners.mdx" />
-
----
-
-### sendDigits
-
-- **sendDigits**(`digits`): `Promise<Call>` - See [Call][call-19] for more details.
-
-Play DTMF digits to the other party on the call.
-
-#### Parameters
-
-| Name     | Type     |
-|:---------|:---------|
-| `digits` | `string` |
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-19] for more details.
-
-#### Example
-
-```js
-await call.sendDigits("123");
-```
-
----
-
-### tap
-
-- **tap**(`params`): `Promise<CallTap>` - See [CallTap][calltap-3] for more details.
-
-Intercept call media and stream it to the specified WebSocket endpoint. Prefer using [tapAudio][voice-call-10] if you only need to tap audio.
-
-<Note>
-
-This is an experimental method. The destination must be a hosted WebSocket/RTP server, with an address that SignalWire can reach.
-
-A current limitation of this method is that the destination device does not receive any metadata regarding the origin of the stream.
-
-</Note>
-
-#### Parameters
-
-| Name            | Type                                 | Description                                                                       |
-|:----------------|:-------------------------------------|:----------------------------------------------------------------------------------|
-| `params`        | `Object`                             | -                                                                                 |
-| `params.device` | [`TapDevice`][types-4] | Destination device. Can be either WebSocket or RTP.                               |
-| `params.audio`  | `Object`                             | An object with the configuration for audio tapping. See "audio parameters" below. |
-
-**Audio parameters**
-
-| Name              | Type                                | Description                                                                                                 |
-|:------------------|:------------------------------------|:------------------------------------------------------------------------------------------------------------|
-| `audio`           | `Object`                            | -                                                                                                           |
-| `audio.direction` | `"listen"` \| `"speak"` \| `"both"` | Direction to tap. Can be `"listen"` (what the caller hears), `"speak"` (what the caller says), or `"both"`. |
-
-#### Returns
-
-`Promise<CallTap>` - See [CallTap][calltap-3] for more details.
-
-#### Example
-
-```js
-const tap = await call.tapAudio({
-  device: {
-    type: "ws",
-    uri: "wss://example.domain.com/endpoint",
-  },
-  audio: {
-    direction: "both",
-  },
-});
-
-await tap.stop();
-```
-
----
-
-### tapAudio
-
-- **tapAudio**(`params`): `Promise<CallTap>` - See [CallTap][calltap-3] for more details.
-
-Intercept call audio and stream it to the specified WebSocket endpoint.
-
-<Note>
-
-This is an experimental method. The destination must be a hosted WebSocket/RTP server, with an address that SignalWire can reach.
-
-A current limitation of this method is that the destination device does not receive any metadata regarding the origin of the stream.
-
-</Note>
-
-#### Parameters
-
-| Name               | Type                                 | Description                                                                                                 |
-|:-------------------|:-------------------------------------|:------------------------------------------------------------------------------------------------------------|
-| `params`           | `Object`                             | -                                                                                                           |
-| `params.device`    | [`TapDevice`][types-4] | Destination device. Can be either WebSocket or RTP.                                                         |
-| `params.direction` | `"listen"` \| `"speak"` \| `"both"`  | Direction to tap. Can be `"listen"` (what the caller hears), `"speak"` (what the caller says), or `"both"`. |
-
-#### Returns
-
-`Promise<CallTap>` - See [CallTap][calltap-3] for more details.
-
-#### Example
-
-```js
-const tap = await call.tapAudio({
-  direction: "both",
-  device: {
-    type: "ws",
-    uri: "wss://example.domain.com/endpoint",
-  },
-});
-
-await tap.stop();
-```
-
----
-
-### waitFor
-
-- **waitFor**(`params`): `Promise<boolean>`
-
-Returns a promise that is resolved only after the current call is in one of the specified states.
-
-#### Parameters
-
-| Name     | Type                                                   |
-|:---------|:-------------------------------------------------------|
-| `params` | `"ended"` \| `"ending"` \| (`"ended"` \| `"ending"`)[] |
-
-#### Returns
-
-`Promise<boolean>`
-
-true if the requested states have been reached, false if they won't be reached because the call ended.
-
-#### Example
-
-```js
-await call.waitFor("ended");
-```
-
----
-
-### ~~waitForDisconnected~~
-
-- **waitForDisconnected**(): `Promise<Call>` - See [Call][call-19] for more details.
-
-<Warning>
-
-This method is deprecated. See [disconnected][link-8] instead.
-
-</Warning>
-
-## Events
-
-### call.created
-
-- **call.created**(`call`)
-
-A call was created.
-
-#### Parameters
-
-| Name   | Type                           | Description                         |
-|:-------|:-------------------------------|:------------------------------------|
-| `call` | [`CallState`][callstate-6] | A object containing the call state. |
-
-### call.ringing
-
-- **call.ringing**(`call`)
-
-A call is ringing.
-
-#### Parameters
-
-| Name   | Type                           | Description                         |
-|:-------|:-------------------------------|:------------------------------------|
-| `call` | [`CallState`][callstate-6] | A object containing the call state. |
-
-### call.answered
-
-- **call.answered**(`call`)
-
-A call was answered.
-
-#### Parameters
-
-| Name   | Type                           | Description                         |
-|:-------|:-------------------------------|:------------------------------------|
-| `call` | [`CallState`][callstate-6] | A object containing the call state. |
-
-### call.ending
-
-- **call.ending**(`call`)
-
-A call is ending.
-
-#### Parameters
-
-| Name   | Type                           | Description                         |
-|:-------|:-------------------------------|:------------------------------------|
-| `call` | [`CallState`][callstate-6] | A object containing the call state. |
-
-### call.ended
-
-- **call.ended**(`call`)
-
-A call ended.
-
-#### Parameters
-
-| Name   | Type                           | Description                         |
-|:-------|:-------------------------------|:------------------------------------|
-| `call` | [`CallState`][callstate-6] | A object containing the call state. |
-
-### collect.ended
-
-- **collect.ended**(`collect`)
-
-A collect ended.
-
-#### Parameters
-
-| Name      | Type                               | Description       |
-|:----------|:-----------------------------------|:------------------|
-| `collect` | [`CallCollect`][callcollect-6] | A collect object. |
-
-### collect.failed
-
-- **collect.failed**(`collect`)
-
-A collect failed.
-
-#### Parameters
-
-| Name      | Type                               | Description       |
-|:----------|:-----------------------------------|:------------------|
-| `collect` | [`CallCollect`][callcollect-6] | A collect object. |
-
-### collect.startOfInput
-
-- **collect.startOfInput**(`collect`)
-
-User input began in a collect.
-
-#### Parameters
-
-| Name      | Type                               | Description       |
-|:----------|:-----------------------------------|:------------------|
-| `collect` | [`CallCollect`][callcollect-6] | A collect object. |
-
-### collect.started
-
-- **collect.started**(`collect`)
-
-A collect started.
-
-#### Parameters
-
-| Name      | Type                               | Description       |
-|:----------|:-----------------------------------|:------------------|
-| `collect` | [`CallCollect`][callcollect-6] | A collect object. |
-
-### collect.updated
-
-- **collect.updated**(`collect`)
-
-The state of a collect changed.
-
-#### Parameters
-
-| Name      | Type                               | Description       |
-|:----------|:-----------------------------------|:------------------|
-| `collect` | [`CallCollect`][callcollect-6] | A collect object. |
-
-### playback.ended
-
-- **playback.ended**(`playback`)
-
-A playback ended.
-
-#### Parameters
-
-| Name       | Type                                 | Description        |
-|:-----------|:-------------------------------------|:-------------------|
-| `playback` | [`CallPlayback`][callplayback-12] | A playback object. |
-
----
-
-### playback.started
-
-- **playback.started**(`playback`)
-
-A playback has started.
-
-#### Parameters
-
-| Name       | Type                                 | Description        |
-|:-----------|:-------------------------------------|:-------------------|
-| `playback` | [`CallPlayback`][callplayback-12] | A playback object. |
-
----
-
-### playback.updated
-
-- **playback.updated**(`playback`)
-
-The state of a playback changed.
-
-#### Parameters
-
-| Name       | Type                                 | Description        |
-|:-----------|:-------------------------------------|:-------------------|
-| `playback` | [`CallPlayback`][callplayback-12] | A playback object. |
-
----
-
-### prompt.ended
-
-- **prompt.ended**(`prompt`)
-
-A prompt has ended.
-
-#### Parameters
-
-| Name     | Type                             | Description      |
-|:---------|:---------------------------------|:-----------------|
-| `prompt` | [`CallPrompt`][callprompt-11] | A prompt object. |
-
----
-
-### prompt.failed
-
-- **prompt.failed**(`prompt`)
-
-A prompt has failed.
-
-#### Parameters
-
-| Name     | Type                             | Description      |
-|:---------|:---------------------------------|:-----------------|
-| `prompt` | [`CallPrompt`][callprompt-11] | A prompt object. |
-
----
-
-### prompt.started
-
-- **prompt.started**(`prompt`)
-
-A prompt started.
-
-#### Parameters
-
-| Name     | Type                             | Description      |
-|:---------|:---------------------------------|:-----------------|
-| `prompt` | [`CallPrompt`][callprompt-11] | A prompt object. |
-
----
-
-### prompt.updated
-
-- **prompt.updated**(`prompt`)
-
-The state of a prompt changed.
-
-#### Parameters
-
-| Name     | Type                             | Description      |
-|:---------|:---------------------------------|:-----------------|
-| `prompt` | [`CallPrompt`][callprompt-11] | A prompt object. |
-
----
-
-### recording.ended
-
-- **recording.ended**(`recording`)
-
-A recording ended.
-
-#### Parameters
-
-| Name        | Type                                   | Description         |
-|:------------|:---------------------------------------|:--------------------|
-| `recording` | [`CallRecording`][callrecording-7] | A recording object. |
-
----
-
-### recording.failed
-
-- **recording.failed**(`recording`)
-
-A recording failed.
-
-#### Parameters
-
-| Name        | Type                                   | Description         |
-|:------------|:---------------------------------------|:--------------------|
-| `recording` | [`CallRecording`][callrecording-7] | A recording object. |
-
----
-
-### recording.started
-
-- **recording.started**(`recording`)
-
-A recording started.
-
-#### Parameters
-
-| Name        | Type                                   | Description         |
-|:------------|:---------------------------------------|:--------------------|
-| `recording` | [`CallRecording`][callrecording-7] | A recording object. |
-
----
-
-### recording.updated
-
-- **recording.updated**(`recording`)
-
-The state of a recording changed.
-
-#### Parameters
-
-| Name        | Type                                   | Description         |
-|:------------|:---------------------------------------|:--------------------|
-| `recording` | [`CallRecording`][callrecording-7] | A recording object. |
-
----
-
-### tap.ended
-
-- **tap.ended**(`tap`)
-
-A tap ended.
-
-#### Parameters
-
-| Name  | Type                       | Description   |
-|:------|:---------------------------|:--------------|
-| `tap` | [`CallTap`][calltap-5] | A tap object. |
-
----
-
-### tap.started
-
-- **tap.started**(`tap`)
-
-A tap started.
-
-#### Parameters
-
-| Name  | Type                       | Description   |
-|:------|:---------------------------|:--------------|
-| `tap` | [`CallTap`][calltap-5] | A tap object. |
diff --git a/fern/products/realtime-sdk/pages/v3/tech-ref/voice/voice-client.mdx b/fern/products/realtime-sdk/pages/v3/tech-ref/voice/voice-client.mdx
deleted file mode 100644
index 8c85d8108..000000000
--- a/fern/products/realtime-sdk/pages/v3/tech-ref/voice/voice-client.mdx
+++ /dev/null
@@ -1,262 +0,0 @@
----
-id: 89d75ebc-bf42-4347-9424-cb35c809837e
-title: "Client"
-slug: reference/voice/client
-description: Voice Client reference for initiating and receiving phone calls. Includes methods for dialing, listening to events, and managing active calls.
-max-toc-depth: 3
----
-
-[call-5]: ./voice-call.mdx
-[call-6]: ./voice-call.mdx
-[link-1]: #dialphone
-[link-2]: #dialsip
-[link]: #events
-[types]: ./types.mdx#sipheader
-[voicedevicebuilder-1]: ./voice-devicebuilder.mdx
-[voicedevicebuilder]: ./voice-devicebuilder.mdx
-
-You can use instances of this class to initiate or receive calls. Please see [Events][link] for the full list of events you can subscribe to.
-
-#### Examples
-
-The following example answers any call in the "office" topic.
-
-```javascript
-import { Voice } from "@signalwire/realtime-api";
-
-const client = new Voice.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-  topics: ["office"],
-});
-
-client.on("call.received", async (call) => {
-  console.log("Got call", call.from, call.to);
-
-  try {
-    await call.answer();
-    console.log("Inbound call answered");
-  } catch (error) {
-    console.error("Error answering inbound call", error);
-  }
-});
-```
-
-The following example initiates a new call.
-
-```javascript
-const client = new Voice.Client({
-  project: "<project-id>",
-  token: "<api-token>",
-  topics: ["office"],
-});
-
-try {
-  const call = await client.dialPhone({
-    from: "+YYYYYYYYYY",
-    to: "+XXXXXXXXXX",
-    timeout: 30,
-  });
-} catch (e) {
-  console.log("Call not answered.");
-}
-```
-
-## Constructors
-
-### constructor
-
-- **new Client**(`opts`)
-
-#### Parameters
-
-| Name                       | Type       | Description                                                                          |
-|:---------------------------|:-----------|:-------------------------------------------------------------------------------------|
-| `opts`                     | `Object`   | -                                                                                    |
-| `opts.topics`              | `string[]` | SignalWire topics, e.g. ['home', 'office']. Previously known as `"context"`.         |
-| `opts.project`             | `string`   | SignalWire project id, e.g. `a10d8a9f-2166-4e82-56ff-118bc3a4840f`.                  |
-| `opts.token`               | `string`   | SignalWire project token, e.g. `PT9e5660c101cd140a1c93a0197640a369cf5f16975a0079c9`. |
-| `opts.debug?`              | `Object`   | -                                                                                    |
-| `opts.debug.logWsTraffic?` | `boolean`  | If `true`, logs all WebSocket traffic. Default is `false`.                           |
-
-## Methods
-
-### dial
-
-- **dial**(`dialer`): `Promise<Call>` - See [Call][call-5] for more details.
-
-Makes an outbound Call and waits until it has been answered or hung up. This is an advanced method that lets you call multiple devices in parallel or series: for simpler use cases, see [dialPhone][link-1] and [dialSip][link-2].
-
-With this method you can specify a configuration of devices to call in series and/or in parallel: as soon as one device answers the call, the returned promise is resolved. You specify a configuration through a [VoiceDeviceBuilder][voicedevicebuilder] object.
-
-#### Parameters
-
-| Name     | Type                                             | Description                                |
-| :------- | :----------------------------------------------- | :----------------------------------------- |
-| `dialer` | [`VoiceDeviceBuilder`][voicedevicebuilder-1] | The Dialer specifying the devices to call. |
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-5] for more details.
-
-A call object.
-
-#### Example
-
-Calls a phone number. If the number doesn't answer within 30 seconds, calls two different SIP endpoints in parallel.
-
-```js
-const devices = new Voice.DeviceBuilder()
-  .add(Voice.DeviceBuilder.Phone({ from: "+XXXXXX", to: "+YYYYYY", timeout: 30 }))
-  .add([
-    Voice.DeviceBuilder.Sip({ from: "sip:aaa@bbb.cc", to: "sip:xxx@yyy.zz" }),
-    Voice.DeviceBuilder.Sip({ from: "sip:aaa@bbb.cc", to: "sip:ppp@qqq.rr" }),
-  ]);
-
-try {
-  const call = await client.dial(devices);
-  console.log("Call answered");
-} catch (e) {
-  console.log("Call not answered");
-}
-```
-
----
-
-### dialPhone
-
-- **dialPhone**(`params`): `Promise<Call>` - See [Call][call-5] for more details.
-
-Makes an outbound call to a PSTN number.
-
-#### Parameters
-
-| Name                        | Type     | Description                                                                                                                                                                                                                                             |
-| :-------------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `params`                    | `Object` | -                                                                                                                                                                                                                                                       |
-| `params.from?`              | `string` | The party the call is coming from. Must be a SignalWire number or SIP endpoint that you own.                                                                                                                                                            |
-| `params.maxPricePerMinute?` | `number` | The maximum price in USD acceptable for the call to be created. If the rate for the call is greater than this value, the call will not be created. If not set, all calls will be created. Price can have a maximum of four decimal places, i.e. 0.0075. |
-| `params.timeout?`           | `number` | The time, in seconds, the call will ring before it is considered unanswered.                                                                                                                                                                            |
-| `params.to`                 | `string` | The party you are attempting to call.                                                                                                                                                                                                                   |
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-5] for more details.
-
-A call object.
-
-#### Example
-
-```js
-try {
-  const call = await client.dialPhone({
-    from: "+YYYYYYYYYY",
-    to: "+XXXXXXXXXX",
-    timeout: 30,
-  });
-} catch (e) {
-  console.log("Call not answered.");
-}
-```
-
----
-
-### dialSip
-
-- **dialSip**(`params`): `Promise<Call>` - See [Call][call-5] for more details.
-
-Makes an outbound call to a SIP endpoint.
-
-#### Parameters
-
-| Name                        | Type                                   | Description                                                                                                                                                                                                                                             |
-| :-------------------------- | :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `params`                    | `Object`                               | -                                                                                                                                                                                                                                                       |
-| `params.codecs?`            | `SipCodec[]`                           | Optional array of desired codecs in order of preference. Supported values are PCMU, PCMA, OPUS, G729, G722, VP8, H264. Default is parent leg codec(s).                                                                                                  |
-| `params.from`               | `string`                               | The party the call is coming from. Must be a SignalWire number or SIP endpoint that you own.                                                                                                                                                            |
-| `params.headers?`           | [`SipHeader`][types][] | Array of [`SipHeader`][types] objects. Must be X- headers only, see example below.                                                                                                                                                      |
-| `params.maxPricePerMinute?` | `number`                               | The maximum price in USD acceptable for the call to be created. If the rate for the call is greater than this value, the call will not be created. If not set, all calls will be created. Price can have a maximum of four decimal places, i.e. 0.0075. |
-| `params.timeout?`           | `number`                               | The time, in seconds, the call will ring before it is considered unanswered.                                                                                                                                                                            |
-| `params.to`                 | `string`                               | The party you are attempting to call.                                                                                                                                                                                                                   |
-| `params.webrtcMedia?`       | `boolean`                              | If true, WebRTC media is negotiated. Default is parent leg setting.                                                                                                                                                                                     |
-| `params.sessionTimeout?`    | `number`                               | Non-negative value, in seconds, to use for the SIP `Session-Expires` header. If 0 or unset, SignalWire will pick the default (typically 600).                                                                                                           |
-
-#### Returns
-
-`Promise<Call>` - See [Call][call-5] for more details.
-
-A call object.
-
-#### Example
-
-```js
-try {
-  const call = await client.dialSip({
-    from: "sip:xxx@yyy.zz",
-    to: "sip:ppp@qqq.rr",
-    timeout: 30,
-    headers: [
-      { name: "X-SomeKeyA", value: "SomeValueA" },
-      { name: "X-SomeKeyB", value: "SomeValueB" },
-    ],
-  });
-} catch (e) {
-  console.log("Call not answered.");
-}
-```
-
----
-
-### disconnect
-
-- **disconnect**(): `void`
-
-Disconnects this client. The client will stop receiving events and you will need to create a new instance if you want to use it again.
-
-#### Returns
-
-`void`
-
-#### Example
-
-```js
-client.disconnect();
-```
-
----
-
-### off
-
-<Markdown src="/snippets/realtime-sdk/method_off.mdx" />
-
----
-
-### on
-
-<Markdown src="/snippets/realtime-sdk/method_on.mdx" />
-
----
-
-### once
-
-<Markdown src="/snippets/realtime-sdk/method_once.mdx" />
-
----
-
-### removeAllListeners
-
-<Markdown src="/snippets/realtime-sdk/method_removealllisteners.mdx" />
-
-## Events
-
-### call.received
-
-- **call.received**(`call`)
-
-A call has been received. You can use the provided Call object to answer.
-
-#### Parameters
-
-| Name   | Type                       |
-| :----- | :------------------------- |
-| `call` | [`Call`][call-6] |
diff --git a/fern/products/realtime-sdk/versions/latest.yml b/fern/products/realtime-sdk/versions/latest.yml
index 57af389f7..df4875561 100644
--- a/fern/products/realtime-sdk/versions/latest.yml
+++ b/fern/products/realtime-sdk/versions/latest.yml
@@ -12,104 +12,33 @@ navigation:
       - folder: ../pages/latest/tech-ref/core
         title: Core
         title-source: frontmatter
-      - section: Voice
-        contents:
-          - page: Overview
-            path: ../pages/latest/tech-ref/voice/index.mdx
-          - folder: ../pages/latest/tech-ref/voice/client
-            title: Client
-            title-source: frontmatter
-          - folder: ../pages/latest/tech-ref/voice/call
-            title: Call
-            title-source: frontmatter
-          - page: Call Collect
-            path: ../pages/latest/tech-ref/voice/callcollect.mdx
-          - page: Call Detect
-            path: ../pages/latest/tech-ref/voice/calldetect.mdx
-          - page: Call Playback
-            path: ../pages/latest/tech-ref/voice/callplayback.mdx
-          - page: Call Prompt
-            path: ../pages/latest/tech-ref/voice/callprompt.mdx
-          - page: Call Recording
-            path: ../pages/latest/tech-ref/voice/callrecording.mdx
-          - page: Call State
-            path: ../pages/latest/tech-ref/voice/callstate.mdx
-          - page: Call Tap
-            path: ../pages/latest/tech-ref/voice/calltap.mdx
-          - page: Types
-            path: ../pages/latest/tech-ref/voice/types.mdx
-          - page: Device Builder
-            path: ../pages/latest/tech-ref/voice/voice-devicebuilder.mdx
-          - page: Playlist
-            path: ../pages/latest/tech-ref/voice/voice-playlist.mdx
-      - section: Video
-        contents:
-          - page: Overview
-            path: ../pages/latest/tech-ref/video/index.mdx
-          - folder: ../pages/latest/tech-ref/video/client
-            title: Client
-            title-source: frontmatter
-          - folder: ../pages/latest/tech-ref/video/roomsession
-            title: RoomSession
-            title-source: frontmatter
-          - page: RoomSessionStream
-            path: ../pages/latest/tech-ref/video/video-roomsessionstream.mdx
-          - page: RoomSessionFullState
-            path: ../pages/latest/tech-ref/video/video-roomsessionfullstate.mdx
-          - page: RoomSessionMember
-            path: ../pages/latest/tech-ref/video/video-roomsessionmember.mdx
-          - page: RoomSessionPlayback
-            path: ../pages/latest/tech-ref/video/video-roomsessionplayback.mdx
-          - page: RoomSessionRecording
-            path: ../pages/latest/tech-ref/video/video-roomsessionrecording.mdx
-      - section: Messaging
-        contents:
-          - page: Overview
-            path: ../pages/latest/tech-ref/messaging/index.mdx
-          - folder: ../pages/latest/tech-ref/messaging/client
-            title: Client
-            title-source: frontmatter
-          - page: Message Contract
-            path: ../pages/latest/tech-ref/messaging/messaging-messagecontract.mdx
-          - page: Messaging Send Result
-            path: ../pages/latest/tech-ref/messaging/messaging-messagingsendresult.mdx
-      - section: PubSub
-        contents:
-          - page: Overview
-            path: ../pages/latest/tech-ref/pubsub/index.mdx
-          - folder: ../pages/latest/tech-ref/pubsub/client
-            title: Client
-            title-source: frontmatter
-          - page: PubSub Message
-            path: ../pages/latest/tech-ref/pubsub/pubsub-pubsubmessage.mdx
-      - section: Chat
-        contents:
-          - page: Overview
-            path: ../pages/latest/tech-ref/chat/index.mdx
-          - folder: ../pages/latest/tech-ref/chat/client
-            title: Client
-            title-source: frontmatter
-          - page: Chat Member
-            path: ../pages/latest/tech-ref/chat/chat-chatmember.mdx
-          - page: Chat Message
-            path: ../pages/latest/tech-ref/chat/chat-chatmessage.mdx
-      - section: Task
-        contents:
-          - page: Overview
-            path: ../pages/latest/tech-ref/task/index.mdx
-          - folder: ../pages/latest/tech-ref/task/client
-            title: Client
-            title-source: frontmatter
+      - folder: ../pages/latest/tech-ref/voice
+        title: Voice
+        title-source: frontmatter
+      - folder: ../pages/latest/tech-ref/video
+        title: Video
+        title-source: frontmatter
+      - folder: ../pages/latest/tech-ref/messaging
+        title: Messaging
+        title-source: frontmatter
+      - folder: ../pages/latest/tech-ref/pubsub
+        title: PubSub
+        title-source: frontmatter
+      - folder: ../pages/latest/tech-ref/chat
+        title: Chat
+        title-source: frontmatter
+      - folder: ../pages/latest/tech-ref/task
+        title: Task
+        title-source: frontmatter
 
   - tab: guides
     layout:
-      - section: Core
-        contents:
-          - page: Overview
-            path: ../pages/latest/guides/index.mdx
+      - folder: ../pages/latest/guides/core
+        title: Core
+        title-source: frontmatter
       - folder: ../pages/latest/guides/voice
-        title: Voice Guides
+        title: Voice
         title-source: frontmatter
       - folder: ../pages/latest/guides/messaging
-        title: Messaging Guides
+        title: Messaging
         title-source: frontmatter
diff --git a/fern/products/realtime-sdk/versions/v2.yml b/fern/products/realtime-sdk/versions/v2.yml
index 473538927..0bf078f42 100644
--- a/fern/products/realtime-sdk/versions/v2.yml
+++ b/fern/products/realtime-sdk/versions/v2.yml
@@ -2,9 +2,6 @@ tabs:
   reference:
     display-name: Reference
     icon: fa-solid fa-code
-  guides:
-    display-name: Guides
-    icon: fa-solid fa-book
 
 navigation:
   - tab: reference
@@ -26,6 +23,8 @@ navigation:
                 path: ../pages/v2/language/nodejs/event.mdx
               - page: Examples
                 path: ../pages/v2/language/nodejs/examples.mdx
+              - page: Migration Guide (v2 to v3)
+                path: ../pages/v2/guides/v2-vs-v3.mdx
           - folder: ../pages/v2/language/nodejs/calling
             title: Calling
             title-source: frontmatter
@@ -52,6 +51,8 @@ navigation:
                 path: ../pages/v2/language/python/event.mdx
               - page: Examples
                 path: ../pages/v2/language/python/examples.mdx
+              - page: Migration Guide (v2 to v3)
+                path: ../pages/v2/guides/v2-vs-v3.mdx
           - folder: ../pages/v2/language/python/calling
             title: Calling
             title-source: frontmatter
@@ -76,6 +77,8 @@ navigation:
                 path: ../pages/v2/language/ruby/relay-client.mdx
               - page: Event
                 path: ../pages/v2/language/ruby/event.mdx
+              - page: Migration Guide (v2 to v3)
+                path: ../pages/v2/guides/v2-vs-v3.mdx
           - folder: ../pages/v2/language/ruby/calling
             title: Calling
             title-source: frontmatter
@@ -102,6 +105,8 @@ navigation:
                 path: ../pages/v2/language/php/event.mdx
               - page: Examples
                 path: ../pages/v2/language/php/examples.mdx
+              - page: Migration Guide (v2 to v3)
+                path: ../pages/v2/guides/v2-vs-v3.mdx
           - folder: ../pages/v2/language/php/calling
             title: Calling
             title-source: frontmatter
@@ -126,6 +131,8 @@ navigation:
                 path: ../pages/v2/language/golang/relay-client.mdx
               - page: Event
                 path: ../pages/v2/language/golang/event.mdx
+              - page: Migration Guide (v2 to v3)
+                path: ../pages/v2/guides/v2-vs-v3.mdx
           - folder: ../pages/v2/language/golang/calling
             title: Calling
             title-source: frontmatter
@@ -152,6 +159,8 @@ navigation:
                 path: ../pages/v2/language/dotnet/event.mdx
               - page: Examples
                 path: ../pages/v2/language/dotnet/examples.mdx
+              - page: Migration Guide (v2 to v3)
+                path: ../pages/v2/guides/v2-vs-v3.mdx
           - folder: ../pages/v2/language/dotnet/calling
             title: Calling
             title-source: frontmatter
@@ -161,10 +170,3 @@ navigation:
           - folder: ../pages/v2/language/dotnet/task
             title: Task
             title-source: frontmatter
-
-  - tab: guides
-    layout:
-      - page: Migration Guide (v2 to v3)
-        path: ../pages/v2/guides/v2-vs-v3.mdx
-      - page: Stop Robocalls
-        path: ../pages/v2/guides/voice/stop-robocalls-with-signalwires-communication-api.mdx
diff --git a/fern/products/realtime-sdk/versions/v3.yml b/fern/products/realtime-sdk/versions/v3.yml
index 365d66af0..9c9b45f10 100644
--- a/fern/products/realtime-sdk/versions/v3.yml
+++ b/fern/products/realtime-sdk/versions/v3.yml
@@ -2,120 +2,31 @@ tabs:
   reference:
     display-name: Reference
     icon: fa-solid fa-code
-  guides:
-    display-name: Guides
-    icon: fa-solid fa-book
 
 navigation:
-- tab: reference
-  layout:
-  - section: Core
-    contents:
-    - page: Overview
-      path: ../pages/v3/index.mdx
-  - section: Voice
-    contents:
-    - page: Overview
-      path: ../pages/v3/tech-ref/voice/index.mdx
-    - folder: ../pages/v3/tech-ref/voice/client
-      title: Client
-      title-source: frontmatter
-    - folder: ../pages/v3/tech-ref/voice/call
-      title: Call
-      title-source: frontmatter
-    - page: Device Builder
-      path: ../pages/v3/tech-ref/voice/voice-devicebuilder.mdx
-    - page: Playlist
-      path: ../pages/v3/tech-ref/voice/voice-playlist.mdx
-    - page: Call Collect
-      path: ../pages/v3/tech-ref/voice/callcollect.mdx
-    - page: Call Detect
-      path: ../pages/v3/tech-ref/voice/calldetect.mdx
-    - page: Call Playback
-      path: ../pages/v3/tech-ref/voice/callplayback.mdx
-    - page: Call Prompt
-      path: ../pages/v3/tech-ref/voice/callprompt.mdx
-    - page: Call Recording
-      path: ../pages/v3/tech-ref/voice/callrecording.mdx
-    - page: Call State
-      path: ../pages/v3/tech-ref/voice/callstate.mdx
-    - page: Call Tap
-      path: ../pages/v3/tech-ref/voice/calltap.mdx
-    - page: Types
-      path: ../pages/v3/tech-ref/voice/types.mdx
-  - section: Video
-    contents:
-    - page: Overview
-      path: ../pages/v3/tech-ref/video/index.mdx
-    - folder: ../pages/v3/tech-ref/video/client
-      title: Client
-      title-source: frontmatter
-    - folder: ../pages/v3/tech-ref/video/roomsession
-      title: RoomSession
-      title-source: frontmatter
-    - page: RoomSessionStream
-      path: ../pages/v3/tech-ref/video/video-roomsessionstream.mdx
-    - page: RoomSessionFullState
-      path: ../pages/v3/tech-ref/video/video-roomsessionfullstate.mdx
-    - page: RoomSessionMember
-      path: ../pages/v3/tech-ref/video/video-roomsessionmember.mdx
-    - page: RoomSessionPlayback
-      path: ../pages/v3/tech-ref/video/video-roomsessionplayback.mdx
-    - page: RoomSessionRecording
-      path: ../pages/v3/tech-ref/video/video-roomsessionrecording.mdx
-  - section: Messaging
-    contents:
-    - page: Overview
-      path: ../pages/v3/tech-ref/messaging/index.mdx
-    - folder: ../pages/v3/tech-ref/messaging/client
-      title: Client
-      title-source: frontmatter
-    - page: Message Contract
-      path: ../pages/v3/tech-ref/messaging/messaging-messagecontract.mdx
-    - page: Messaging Send Result
-      path: ../pages/v3/tech-ref/messaging/messaging-messagingsendresult.mdx
-  - section: PubSub
-    contents:
-    - page: Overview
-      path: ../pages/v3/tech-ref/pubsub/index.mdx
-    - folder: ../pages/v3/tech-ref/pubsub/client
-      title: Client
-      title-source: frontmatter
-    - page: PubSub Message
-      path: ../pages/v3/tech-ref/pubsub/pubsub-pubsubmessage.mdx
-  - section: Chat
-    contents:
-    - page: Overview
-      path: ../pages/v3/tech-ref/chat/index.mdx
-    - folder: ../pages/v3/tech-ref/chat/client
-      title: Client
-      title-source: frontmatter
-    - page: Chat Member
-      path: ../pages/v3/tech-ref/chat/chat-chatmember.mdx
-    - page: Chat Message
-      path: ../pages/v3/tech-ref/chat/chat-chatmessage.mdx
-  - section: Task
-    contents:
-    - page: Overview
-      path: ../pages/v3/tech-ref/task/index.mdx
-    - folder: ../pages/v3/tech-ref/task/client
-      title: Client
-      title-source: frontmatter
-  - folder: ../pages/v3/tech-ref/realtime-client
-    title: Realtime Client
-    title-source: frontmatter
-
-- tab: guides
-  layout:
-  - section: Core
-    contents:
-    - page: Overview
-      path: ../pages/v3/guides/index.mdx
-    - page: Migration to v4
-      path: ../pages/v3/guides/realtime-relay-v4-vs-v3.mdx
-  - folder: ../pages/v3/guides/voice
-    title: Voice Guides
-    title-source: frontmatter
-  - folder: ../pages/v3/guides/messaging
-    title: Messaging Guides
-    title-source: frontmatter
+  - tab: reference
+    layout:
+      - folder: ../pages/v3/tech-ref/core
+        title: Core
+        title-source: frontmatter
+      - folder: ../pages/v3/tech-ref/voice
+        title: Voice
+        title-source: frontmatter
+      - folder: ../pages/v3/tech-ref/video
+        title: Video
+        title-source: frontmatter
+      - folder: ../pages/v3/tech-ref/messaging
+        title: Messaging
+        title-source: frontmatter
+      - folder: ../pages/v3/tech-ref/pubsub
+        title: PubSub
+        title-source: frontmatter
+      - folder: ../pages/v3/tech-ref/chat
+        title: Chat
+        title-source: frontmatter
+      - folder: ../pages/v3/tech-ref/task
+        title: Task
+        title-source: frontmatter
+      - folder: ../pages/v3/tech-ref/realtime-client
+        title: Realtime Client
+        title-source: frontmatter


Reviews:
user: login: hey-august
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2026-02-23T19:17:30Z
user: login: hey-august
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2026-02-24T00:00:47Z

Review comments:

PR comments:
user: login: github-actions[bot]
created_at: 2026-02-23T17:42:03Z
body: <!-- preview-docs-bot -->
## ❌ Link Check Failed

**Preview:** https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com

## ❌ 2930 Broken Link(s)

| Broken URL | Status | Found On |
|------------|--------|----------|
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session/methods/add-microphone | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session-device |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session/methods/add-camera | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session-device |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session/methods/add-device | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session-device |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session-device |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/ |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v3/reference/chat/client/methods/disconnect |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/params/hold_music | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/functions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/prompt/contexts | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/functions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/functions/fillers | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/functions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/functions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/ai_swaig.data_map/data_map.output.mdx#actions | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/functions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/rest/signalwire-rest/endpoints/calling/call-commands | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/functions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/prompt/contexts/steps | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/functions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/guides/what-is-a-sid | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/guides/common-webhook-errors |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/guides/common-webhook-errors |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/prompt-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/prompt-volume-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/detect-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/record-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/dial-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/play-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/connect-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/send-digits-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/play-pause-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/hangup-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/tap-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/fax-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/answer-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/play-resume-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/stop-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results/play-volume-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/python/calling/results |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session-full-state |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/video-roomsession.mdx#sethidevideomuted | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session-full-state |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/video-roomsession.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session-full-state |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/video-roomsessionmember.md | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session-full-state |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v3/reference/video/client/methods/remove-all-listeners |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/ai/swaig/functions/parameters |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/video/logs/list-logs |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/video/logs/list-logs |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/message-media/delete-message-media |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/sip-endpoints/create-sip-endpoint |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/sip-endpoints/create-sip-endpoint |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/queues/retrieve |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/index | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/queues/retrieve |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/number-groups/retrieve-number-group |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/number-groups/retrieve-number-group |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/rest/signalwire-rest/endpoints/video/create-room-token | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session-screenshare/methods/audio-mute |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session-screenshare/methods/audio-mute |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/tokens/update-token |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/tokens/update-token |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/phone-numbers/update-phone-number |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/phone-numbers/update-phone-number |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/compatibility/incoming-phone-numbers/retrieve-incoming-phone-number |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/compatibility/incoming-phone-numbers/retrieve-incoming-phone-number |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/results/stop-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/actions/detect |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/actions/detect |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/results/detect-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/actions/detect |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/pubsub/client/methods/listen |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/integrations/freeswitch/installing-freeswitch-or-freeswitch-advantage |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/signing-up-for-a-space | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/integrations/freeswitch/installing-freeswitch-or-freeswitch-advantage |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/voice/logs/get-voice-log |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/voice/logs/get-voice-log |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/go/calling/actions/play-media |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/language/golang/calling/call | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/go/calling/actions/play-media |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/domain-applications/list-domain-applications |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/available-phone-numbers/search-local |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/index | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/available-phone-numbers/search-local |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/multi-factor-authentication/request-mfa-call |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/multi-factor-authentication/request-mfa-call |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/call-record-audio-direction |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/swml-webhook/update-swml-webhook |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/fax |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/guides/what-is-a-sid | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/fax |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/signalwire-client/client/methods/offline |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/nodejs |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/consumer | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/nodejs |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/relay-client | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/nodejs |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/task | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/nodejs |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/tools/swsh | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/tools |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/tools/c2c | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/tools |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/tools |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/rest/signalwire-rest/overview/permissions | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/promote |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/promote |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/video-roomsession.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/promote |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/subscribers-tokens/create-subscriber-invite-token |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/guides/signalwire-status-callbacks | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/basics/security/webhook-security |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/basics/security/webhook-security |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/agents-sdk/examples/by-complexity |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/addresses/delete-address |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/addresses/delete-address |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/basics/segment-ids |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/available-phone-numbers/list-available-phone-number-resources |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/task/client/methods/listen |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/call-fabric/addresses |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/recording-transcriptions/retrieve-transcription |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/recording-transcriptions/retrieve-transcription |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/call-media |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/compatibility/queue-members/retrieve-queue-member |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/swml-scripts/delete-swml-script |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/realtime-client/index.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/pubsub/client |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/pubsub/methods/listen.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/pubsub/client |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/pubsub/events.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/pubsub/client |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/pubsub/client |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/php/messaging/message |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/subscribers-sip-endpoints/update-subscriber-sip-endpoint |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/php/results/send-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/php/messaging |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/php/messaging |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/language/golang/calling#dial | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/go/calling/results/dial |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/language/golang/calling/call#dial | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/go/calling/results/dial |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/go/calling/results/dial |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/v2/reference/core/call |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/recording-transcriptions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/set-input-volume |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/video-roomsession.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/set-input-volume |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/chat/chat-chatmember.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/chat/chat-message |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/chat/chat-message |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/calls/update |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/index | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/calls/update |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/video/conference-tokens/list-conference-tokens |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/video/conference-tokens/list-conference-tokens |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/voice |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/messaging | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/voice |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/video/room-sessions/list-room-sessions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/video/room-sessions/list-room-sessions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/video/conference | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/index | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/calls/list |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/calls/list |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/set-positions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/video-roomsession.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/set-positions |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/call-collect |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/call-device-phone-params |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/php/calling/results/stop |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/pubsub/client/methods/publish |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session-playback |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/video-roomsession.mdx#play | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session-playback |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/video-roomsession.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session-playback |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/video-roomsessionplayback.md | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session-playback |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call-tap |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/voice-call.mdx#tapaudio | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call-tap |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/voice-call.mdx#tap | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call-tap |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/chat/client/methods/get-member-state |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/messaging/message-contract | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/messaging/client/events |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/messaging/client/events |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/call-flow-builder/stop_call_recording/index.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/call-flow-builder/reference/start-call-recording |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/call-flow-builder/reference/start-call-recording |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/conferences/update |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/index | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/conferences/update |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v3/reference/video/room-session/methods/off |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/sip-gateway/list-sip-gateways |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/fax/reject |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session/methods/updatecamera |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/video/rooms/list-rooms |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/video/rooms/list-rooms |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/index | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/fax-media/delete |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/fax-media/delete |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/recordings/retrieve-recording |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/messaging/client/methods/listen |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/voice/conference |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/dial | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/voice/conference |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/voice/index.mdx#request-parameters | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/voice/conference |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/guides/what-is-a-sid | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/cxml/voice/conference |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/sdks/methods/applications |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v3/reference/video/client/methods/off |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/cxml-webhook/list-cxml-webhook-addresses |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/dotnet/calling/call-media-audio-params |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/get-meta |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/video-roomsession.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/get-meta |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/messaging/sms/messaging-mime-types |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/agents-sdk/api/swml-service |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/agents-sdk/skills/adding-skills |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/message/logs/list-message-logs |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/message/logs/list-message-logs |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/messages/delete-message |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/conference-participants/list-all-participants |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/campaign-registry-beta/list-orders |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/campaign-registry-beta/list-orders |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/call-flows/deploy-call-flow-version |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/recordings/get-recording |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/recordings/get-recording |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/language/nodejs/calling#dial | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/nodejs/calling/results/dial |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/language/nodejs/calling/call | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/nodejs/calling/results/dial |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/nodejs/calling/results/dial |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/recordings/create-recording |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/recordings/create-recording |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/swml/methods/enter_queue |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/queues/create-queue |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/space/queues/create-queue |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/language/golang/messaging#send | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/go/messaging/send-result |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/go/messaging/send-result |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/ai/get-started/prompt-engineering/best-practices | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/ai/get-started/prompt-engineering |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/ai/get-started/prompt-engineering/where-to-apply#context-steps | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/ai/get-started/prompt-engineering |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/ai/get-started/prompt-engineering/where-to-apply#swaig | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/ai/get-started/prompt-engineering |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/ai/get-started/prompt-engineering |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/ai/get-started/prompt-engineering/where-to-apply | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/ai/get-started/prompt-engineering |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/call-fabric/resources/ai-agents | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/ai/get-started/prompt-engineering |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/ai/get-started/prompt-engineering/advanced-techniques | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/ai/get-started/prompt-engineering |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/ai/get-started/prompt-engineering/where-to-apply#post-prompt | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/ai/get-started/prompt-engineering |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/ai/get-started/prompt-engineering/where-to-apply#conscience | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/ai/get-started/prompt-engineering |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/messages/update-message |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/realtime-client/index.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/client |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/methods/listen.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/client |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/client |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/events.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/client |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/methods/getroomsessions.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/client |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/webrtc/functions/get-devices |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/disconnected |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/compatibility-api/rest/queues/update-queue |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/play |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/callplayback.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/play |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/callplayback.mdx#onstarted | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/play |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/voice-playlist.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/play |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/callplayback.mdx#events | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/voice/call/methods/play |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/agents-sdk/building-agents/voice-language |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/subscribers/create-subscriber |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/php/calling/actions/send-digits |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/php/calling/results/send-digits-result | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/php/calling/actions/send-digits |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/conference-rooms/list-conference-rooms |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/fabric/sip-endpoints/list-sip-endpoints |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/browser-sdk/reference/video/room-session-device/methods/set-microphone-volume |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/v2/reference/ruby/calling/results/answer |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/messaging/messaging-sendresult | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/messaging |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/messaging/client | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/messaging |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/messaging |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/messaging/message-contract | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/messaging |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/get-layouts |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/video-roomsession.mdx | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/get-layouts |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/video-roomsession.mdx#setlayout | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/realtime-sdk/reference/video/room-session/methods/get-layouts |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/agents-sdk/exposing-agents |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/agents-sdk/core-concepts/security |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/dashboard/getting-started/your-signalwire-api-space#api-token-scopes | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/voice/logs/list-voice-log-events |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/assets/images/... | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/apis/rest/voice/logs/list-voice-log-events |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/messaging/getting-started/campaign-registry/campaign-service-providers | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/messaging/get-started/campaign-registry |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/messaging/getting-started/campaign-registry/pricing | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/messaging/get-started/campaign-registry |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/messaging/get-started/campaign-registry#registration-best-practices | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/messaging/get-started/campaign-registry |
| https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/messaging/getting-started/sms-best-practices-how-to-ensure-message-delivery | 404 | https://signalwire-preview-0b7d5204-3e36-4ec9-be16-5a3a2b2d32f8.docs.buildwithfern.com/platform/messaging/get-started/campaign-registry |


**⚠️ Report truncated** - Showing 237 of 2930 broken links. Download the full report from the workflow artifacts.

> **Note:** The full report is available as an artifact in the [workflow run](https://github.com/signalwire/signalwire-fern-config/actions/runs/22333342736).

---
[View workflow run](https://github.com/signalwire/signalwire-fern-config/actions/runs/22333342736)
author_association: CONTRIBUTOR