> Fetch clean Markdown by appending `.md` to any page URL under https://signalwire.com/docs or requesting it with the HTTP header `Accept: text/markdown`. The root index at https://signalwire.com/docs/llms.txt lists the available documentation indexes. # joinConference > Join an ad-hoc audio conference. [leave-conference]: /docs/server-sdks/reference/typescript/relay/call/leave-conference [calling-conference]: /docs/server-sdks/reference/typescript/relay/call#events [call-events]: /docs/server-sdks/reference/typescript/relay/call#events Join an ad-hoc audio conference. The conference is created automatically if it does not already exist. Multiple calls can join the same conference by name. > **Info** > > Use [`leaveConference()`][leave-conference] to remove the call from the conference. > **Info** > > This method emits [`calling.conference`][calling-conference] events. See [Call Events][call-events] for payload details. ## **Parameters** **`name`** `string` — required Conference name. All calls joining the same name are in the same conference. --- **`muted`** `boolean | undefined` Join the conference muted. --- **`beep`** `string | undefined` Play a beep when joining or leaving. * `"true"` -- beep on both enter and exit * `"false"` -- no beep * `"onEnter"` -- beep only when a participant joins * `"onExit"` -- beep only when a participant leaves --- **`startOnEnter`** `boolean | undefined` Start the conference when this participant enters. If `false`, the conference waits until a participant with `startOnEnter: true` joins. --- **`endOnExit`** `boolean | undefined` End the conference when this participant leaves. --- **`maxParticipants`** `number | undefined` Maximum number of participants in the conference. --- **`record`** `string | undefined` Recording mode: * `"record-from-start"` -- begin recording when the conference starts * `"do-not-record"` -- do not record the conference --- **`waitUrl`** `string | undefined` URL of audio to play while waiting for the conference to start. --- **`region`** `string | undefined` Region for the conference media server. --- **`trim`** `string | undefined` Whether to trim silence from the conference recording. --- **`coach`** `string | undefined` Call ID of a participant who can hear but not be heard (coaching mode). --- **`statusCallback`** `string | undefined` URL to receive conference status webhooks. --- **`statusCallbackEvent`** `string | undefined` Events that trigger status callbacks. --- **`statusCallbackEventType`** `string | undefined` Content type for status callback requests. --- **`statusCallbackMethod`** `string | undefined` HTTP method for the status callback (`"GET"` or `"POST"`). --- **`recordingStatusCallback`** `string | undefined` URL to receive recording status webhooks. --- **`recordingStatusCallbackEvent`** `string | undefined` Events that trigger recording status callbacks. --- **`recordingStatusCallbackEventType`** `string | undefined` Content type for recording status callback requests. --- **`recordingStatusCallbackMethod`** `string | undefined` HTTP method for the recording status callback (`"GET"` or `"POST"`). --- **`stream`** `Record | undefined` Attach a bidirectional WebSocket stream to the conference audio, enabling real-time audio processing, transcription, or AI agents that listen to the conference. Uses the same stream schema as the `stream` device type in `connect`. --- **`stream.url`** `string` — required Secure WebSocket URL (`wss://`) to stream the conference audio to. Plain `ws://` is not supported. --- **`stream.name`** `string | undefined` A friendly name to identify the stream at the WebSocket endpoint. --- **`stream.codec`** `string | undefined` Audio codec for the streamed audio (e.g., `"PCMU"`, `"PCMA"`, `"G722"`, `"L16"`). --- **`stream.status_url`** `string | undefined` HTTP or HTTPS URL to receive stream status webhooks. --- **`stream.status_url_method`** `string | undefined` — default: POST HTTP method for the status webhook (`"GET"` or `"POST"`). --- **`stream.realtime`** `boolean | undefined` When `true`, enables bidirectional audio so your endpoint can stream audio back into the conference (not just receive it). --- **`stream.authorization_bearer_token`** `string | undefined` Bearer token sent in the `Authorization` header when the WebSocket connection is opened, so your endpoint can authenticate the request. --- **`stream.custom_parameters`** `Record | undefined` Custom key-value pairs delivered to your WebSocket endpoint when the stream connects. Use them to pass context such as a session or customer ID. --- ## **Returns** `Promise>` -- Server response confirming the join. ## **Example** ```typescript {14} import { RelayClient } from '@signalwire/sdk'; const client = new RelayClient({ project: process.env.SIGNALWIRE_PROJECT_ID!, token: process.env.SIGNALWIRE_API_TOKEN!, contexts: ['default'] }); client.onCall(async (call) => { await call.answer(); await call.play([{ type: 'tts', text: 'Joining the team conference.' }]); // Join a conference and attach a bidirectional WebSocket stream await call.joinConference('team-standup', { beep: 'onEnter', startOnEnter: true, stream: { url: 'wss://example.com/conference-audio', codec: 'PCMU', realtime: true, status_url: 'https://example.com/stream-status', }, }); // The call is now in the conference until it leaves or the call ends }); await client.run(); ``` > Join an ad-hoc audio conference.