[{"data":1,"prerenderedAt":173},["ShallowReactive",2],{"doc:guides\u002Fcalls":3},{"title":4,"description":5,"url":6,"markdownPath":7,"file":8,"section":9,"sectionTitle":10,"html":11,"toc":12,"navigation":32,"previous":171,"next":172},"Calls and Live","Start audio and video calls, Live sessions and screen sharing in L4 channels and Direct Messages, and connect Cloudflare RealtimeKit as the Owner.","\u002Fdocs\u002Fguides\u002Fcalls","\u002Fdocs\u002Fguides\u002Fcalls.md","docs\u002Fguides\u002Fcalls.md","guides","Guides","\u003Cp>Every channel and Direct Message has one Live room for audio, camera and screen sharing. In a one-to-one Direct Message it rings the other person as a \u003Cstrong>Call\u003C\u002Fstrong>; everywhere else it is \u003Cstrong>Live\u003C\u002Fstrong>, a room anyone in the conversation can join. Media runs on Cloudflare RealtimeKit in the Server&#39;s own Cloudflare account. Nothing is recorded.\u003C\u002Fp>\n\u003Ch2 id=\"start-or-join\">\u003Ca class=\"heading-anchor\" href=\"#start-or-join\">Start or join\u003C\u002Fa>\u003C\u002Fh2>\n\u003Col>\n\u003Cli>Open the channel or Direct Message.\u003C\u002Fli>\n\u003Cli>Select the phone button (\u003Cstrong>Call\u003C\u002Fstrong>) in a one-to-one Direct Message, or the waveform button (\u003Cstrong>Start live\u003C\u002Fstrong>) in a channel or group.\u003C\u002Fli>\n\u003Cli>Check your \u003Cstrong>Microphone\u003C\u002Fstrong>, \u003Cstrong>Camera\u003C\u002Fstrong> and \u003Cstrong>Speaker\u003C\u002Fstrong> in the preview, then start.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>If a room is already running, the button says \u003Cstrong>Join call\u003C\u002Fstrong> or \u003Cstrong>Join live\u003C\u002Fstrong>, and a bar in the conversation offers to join.\u003C\u002Fp>\n\u003Cp>\u003Cfigure class=\"doc-shot doc-shot-missing\">\u003Cdiv class=\"doc-shot-frame\" role=\"img\" aria-label=\"A channel header with the Start live button and the Live preview dialog showing the Microphone, Camera and Speaker choices\">\u003Cspan class=\"doc-shot-label\">Screenshot coming soon\u003C\u002Fspan>\u003Cspan class=\"doc-shot-alt\">A channel header with the Start live button and the Live preview dialog showing the Microphone, Camera and Speaker choices\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cfigcaption>Start a Live session\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003C\u002Fp>\n\u003Cp>Starting a room needs \u003Cstrong>Start live sessions\u003C\u002Fstrong> in your Role; the built-in Member Role has it. Anyone who can open the conversation can join. You cannot start a room in an archived channel or a Direct Message you can no longer write to.\u003C\u002Fp>\n\u003Ch2 id=\"during-a-call\">\u003Ca class=\"heading-anchor\" href=\"#during-a-call\">During a call\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Mute or unmute, turn the camera on or off and share your screen from the controls.\u003C\u002Fli>\n\u003Cli>Minimize the room to keep chatting; the Live bar stays visible.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Leave\u003C\u002Fstrong> a Live session, or \u003Cstrong>Hang up\u003C\u002Fstrong> a call.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>If the connection drops, L4 reconnects and keeps your microphone and camera settings.\u003C\u002Fp>\n\u003Cp>The person who started a Live session, and in channels Members with \u003Cstrong>Manage channels\u003C\u002Fstrong>, can \u003Cstrong>Mute for everyone\u003C\u002Fstrong>, \u003Cstrong>Remove from live session\u003C\u002Fstrong> and \u003Cstrong>End for everyone\u003C\u002Fstrong>. In a one-to-one call both people have host controls.\u003C\u002Fp>\n\u003Ch2 id=\"incoming-calls\">\u003Ca class=\"heading-anchor\" href=\"#incoming-calls\">Incoming calls\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>When someone calls you in a one-to-one Direct Message, L4 rings and shows \u003Cstrong>Answer\u003C\u002Fstrong>, \u003Cstrong>Decline\u003C\u002Fstrong> and \u003Cstrong>Ignore\u003C\u002Fstrong>. If you are already in another room, \u003Cstrong>Leave and answer\u003C\u002Fstrong> switches over. An unanswered call stops ringing after 45 seconds.\u003C\u002Fp>\n\u003Cp>Calls and newly started Live sessions also send push notifications; see \u003Ca href=\"\u002Fdocs\u002Fguides\u002Fnotifications\">Notifications\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"your-audio-settings\">\u003Ca class=\"heading-anchor\" href=\"#your-audio-settings\">Your audio settings\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>In \u003Cstrong>User Settings → Voice &amp; Video\u003C\u002Fstrong> you choose the \u003Cstrong>Input Device\u003C\u002Fstrong> and \u003Cstrong>Output Device\u003C\u002Fstrong>, and turn \u003Cstrong>Ring for incoming calls\u003C\u002Fstrong> on or off. Mute and deafen are also on your account panel.\u003C\u002Fp>\n\u003Ch2 id=\"connect-live-owner\">\u003Ca class=\"heading-anchor\" href=\"#connect-live-owner\">Connect Live (Owner)\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Calls need Cloudflare RealtimeKit. The Owner connects it in \u003Cstrong>Server settings → Live\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>With kept Cloudflare access:\u003C\u002Fstrong> if the Server keeps Cloudflare access (see \u003Ca href=\"\u002Fdocs\u002Fcloudflare\u002Faccess\">Cloudflare access\u003C\u002Fa>), select \u003Cstrong>Connect using this Server&#39;s Cloudflare access\u003C\u002Fstrong>. No separate token is needed.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>With an API token:\u003C\u002Fstrong> select \u003Cstrong>Create token\u003C\u002Fstrong>, create a Cloudflare API token with the \u003Cstrong>Realtime Admin\u003C\u002Fstrong> permission for the account the Server runs in, paste it and select \u003Cstrong>Connect\u003C\u002Fstrong>. If the token reaches several accounts, choose one.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>L4 then creates its own RealtimeKit app with separate host and participant presets. The token is stored encrypted. Use \u003Cstrong>Test connection\u003C\u002Fstrong> to check it, \u003Cstrong>Replace token\u003C\u002Fstrong> to change it and \u003Cstrong>Disconnect\u003C\u002Fstrong> to turn Live off.\u003C\u002Fp>\n\u003Cp>\u003Cfigure class=\"doc-shot doc-shot-missing\">\u003Cdiv class=\"doc-shot-frame\" role=\"img\" aria-label=\"Server settings → Live with the Connect using this Server's Cloudflare access button and the API token steps\">\u003Cspan class=\"doc-shot-label\">Screenshot coming soon\u003C\u002Fspan>\u003Cspan class=\"doc-shot-alt\">Server settings → Live with the Connect using this Server's Cloudflare access button and the API token steps\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cfigcaption>Connect Live\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003C\u002Fp>\n\u003Cp>Messages you may see:\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Message\u003C\u002Fth>\n\u003Cth>Meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Cstrong>Calls are unavailable on this runtime\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>The Server cannot reach Cloudflare RealtimeKit, so calls stay off. Text chat is unaffected.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Calls use your Cloudflare API token\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>The operator configured Cloudflare credentials for the deployment; the first call creates the RealtimeKit app.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Managed by the deployment\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>RealtimeKit credentials come from the deployment&#39;s environment and override anything saved here.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>The saved token can no longer be read\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>The Server&#39;s \u003Ccode>AUTH_SECRET\u003C\u002Fcode> is missing or changed. Restore it, or paste a token to reconnect.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Everyone joins with host controls\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>Live was connected before hosts and participants had separate permissions. Select \u003Cstrong>Reconnect\u003C\u002Fstrong>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Cloudflare RealtimeKit usage is billed to your Cloudflare account. See \u003Ca href=\"\u002Fdocs\u002Fcloudflare\u002Fcosts-and-limits\">Costs and limits\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"related\">\u003Ca class=\"heading-anchor\" href=\"#related\">Related\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"\u002Fdocs\u002Fguides\u002Fchat\">Chat\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fdocs\u002Fguides\u002Fnotifications\">Notifications\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n",[13,17,20,23,26,29],{"id":14,"text":15,"depth":16},"start-or-join","Start or join",2,{"id":18,"text":19,"depth":16},"during-a-call","During a call",{"id":21,"text":22,"depth":16},"incoming-calls","Incoming calls",{"id":24,"text":25,"depth":16},"your-audio-settings","Your audio settings",{"id":27,"text":28,"depth":16},"connect-live-owner","Connect Live (Owner)",{"id":30,"text":31,"depth":16},"related","Related",[33,58,86,102,121,143,161],{"id":34,"title":35,"pages":36},"get-started","Get started",[37,40,43,46,49,52,55],{"title":38,"url":39},"What is L4","\u002Fdocs\u002Fget-started\u002Fwhat-is-l4",{"title":41,"url":42},"Choose how to run your Server","\u002Fdocs\u002Fget-started\u002Fchoose-how-to-run",{"title":44,"url":45},"Create a Server on Cloudflare","\u002Fdocs\u002Fget-started\u002Fcreate-on-cloudflare",{"title":47,"url":48},"Install on a VPS","\u002Fdocs\u002Fget-started\u002Finstall-on-a-vps",{"title":50,"url":51},"Connect to a Server","\u002Fdocs\u002Fget-started\u002Fconnect-a-server",{"title":53,"url":54},"Invite your team","\u002Fdocs\u002Fget-started\u002Finvite-your-team",{"title":56,"url":57},"Create your first Agent","\u002Fdocs\u002Fget-started\u002Ffirst-agent",{"id":59,"title":60,"pages":61},"cloudflare","Cloudflare",[62,65,68,71,74,77,80,83],{"title":63,"url":64},"L4 on Cloudflare","\u002Fdocs\u002Fcloudflare\u002Foverview",{"title":66,"url":67},"Cloudflare access","\u002Fdocs\u002Fcloudflare\u002Faccess",{"title":69,"url":70},"Costs and limits","\u002Fdocs\u002Fcloudflare\u002Fcosts-and-limits",{"title":72,"url":73},"Custom domain","\u002Fdocs\u002Fcloudflare\u002Fcustom-domain",{"title":75,"url":76},"Mail on Cloudflare","\u002Fdocs\u002Fcloudflare\u002Fmail",{"title":78,"url":79},"Update a Cloudflare Server","\u002Fdocs\u002Fcloudflare\u002Fupdates",{"title":81,"url":82},"Backups on Cloudflare","\u002Fdocs\u002Fcloudflare\u002Fbackups",{"title":84,"url":85},"Remove a Cloudflare Server","\u002Fdocs\u002Fcloudflare\u002Fremove-a-server",{"id":87,"title":88,"pages":89},"self-host","Self-host",[90,93,96,99],{"title":91,"url":92},"Run a Server on a VPS","\u002Fdocs\u002Fself-host\u002Fvps",{"title":94,"url":95},"Run a Server with Docker Compose","\u002Fdocs\u002Fself-host\u002Fdocker",{"title":97,"url":98},"Run a Server on Coolify","\u002Fdocs\u002Fself-host\u002Fcoolify",{"title":100,"url":101},"Compute Nodes","\u002Fdocs\u002Fself-host\u002Fcompute-nodes",{"id":103,"title":104,"pages":105},"concepts","Concepts",[106,109,112,115,118],{"title":107,"url":108},"Servers and the Shell","\u002Fdocs\u002Fconcepts\u002Fserver-and-shell",{"title":110,"url":111},"Accounts, Members and Roles","\u002Fdocs\u002Fconcepts\u002Faccounts-members-roles",{"title":113,"url":114},"Agents, Tasks and Runs","\u002Fdocs\u002Fconcepts\u002Fagents-tasks-runs",{"title":116,"url":117},"Files and backups","\u002Fdocs\u002Fconcepts\u002Ffiles-and-backups",{"title":119,"url":120},"Releases and updates","\u002Fdocs\u002Fconcepts\u002Freleases-and-updates",{"id":122,"title":123,"pages":124},"agents","Agents and MCP",[125,128,131,134,137,140],{"title":126,"url":127},"Agents overview","\u002Fdocs\u002Fagents\u002Foverview",{"title":129,"url":130},"Models and Providers","\u002Fdocs\u002Fagents\u002Fmodels-and-providers",{"title":132,"url":133},"Connect an MCP client","\u002Fdocs\u002Fagents\u002Fmcp",{"title":135,"url":136},"External agents","\u002Fdocs\u002Fagents\u002Fexternal-agents",{"title":138,"url":139},"Repositories and code work","\u002Fdocs\u002Fagents\u002Frepositories",{"title":141,"url":142},"Schedules","\u002Fdocs\u002Fagents\u002Fschedules",{"id":9,"title":10,"pages":144},[145,148,151,154,155,158],{"title":146,"url":147},"Chat","\u002Fdocs\u002Fguides\u002Fchat",{"title":149,"url":150},"Projects and Tasks","\u002Fdocs\u002Fguides\u002Fprojects-and-tasks",{"title":152,"url":153},"Mail","\u002Fdocs\u002Fguides\u002Fmail",{"title":4,"url":6},{"title":156,"url":157},"Notifications","\u002Fdocs\u002Fguides\u002Fnotifications",{"title":159,"url":160},"Telegram","\u002Fdocs\u002Fguides\u002Ftelegram",{"id":162,"title":163,"pages":164},"reference","Reference",[165,168],{"title":166,"url":167},"Glossary","\u002Fdocs\u002Freference\u002Fglossary",{"title":169,"url":170},"Troubleshooting","\u002Fdocs\u002Freference\u002Ftroubleshooting",{"title":152,"url":153},{"title":156,"url":157},1793335826331]