# SignalWire Documentation > SignalWire Documentation - [SignalWire Documentation](https://developer.signalwire.com/index.md) ## ai - [AI](https://developer.signalwire.com/ai.md): Programmable, integrated, realtime voice AI - [Create your first phone AI Agent](https://developer.signalwire.com/ai/get-started.md): Deploy a serverless AI Agent and call it over the PSTN in under 5 minutes - for free - [AI platform capabilities](https://developer.signalwire.com/ai/get-started/platform-capabilities.md): Learn about the capabilities of SignalWire's AI platform, including natural language processing, voice technology, business applications, advanced features, multi-channel intelligence, real-time analytics, and security. - [Prompt engineering](https://developer.signalwire.com/ai/get-started/prompt-engineering.md): Learn the fundamentals of prompt engineering and how it can help you create responsive and reliable AI agents for your SignalWire applications. - [Best practices](https://developer.signalwire.com/ai/get-started/prompt-engineering/best-practices.md): Master the core techniques and guidelines for crafting effective prompts for SignalWire AI Agents. - [Where to apply prompt engineering](https://developer.signalwire.com/ai/get-started/prompt-engineering/where-to-apply.md): Learn about the different areas where prompt engineering can be applied in SignalWire AI Agents for optimal results. - [AI Guides](https://developer.signalwire.com/ai/guides.md): Get started with AI using our Quickstart guide. - [Prompt object model (POM)](https://developer.signalwire.com/ai/pom.md): A lightweight Python library for structured prompt management with LLMs - [POM technical reference](https://developer.signalwire.com/ai/pom/technical-reference.md): Learn more about the Prompt Object Model ## swml - [SWML](https://developer.signalwire.com/swml.md): Get started with SWML (SignalWire Markup Language), a markup and scripting language for quickly writing powerful Relay applications in YAML or JSON documents. - [Overview](https://developer.signalwire.com/swml/guides.md): Guides for using SWML. - [SWML AI guides](https://developer.signalwire.com/swml/guides/ai.md): Guides for using AI with SWML. - [AI Agent with audio playing in the background](https://developer.signalwire.com/swml/guides/ai/background_audio.md): Learn how to create an AI agent with background audio. - [Best Practices for Creating a SignalWire AI Agent](https://developer.signalwire.com/swml/guides/ai/best-practices.md): This guide offers a detailed overview of best practices to make sure your SignalWire Agent operates effectively. - [Using context_switch](https://developer.signalwire.com/swml/guides/ai/context_switch.md): Learn how to use `context_switch` to shift the focus of the conversation. - [Executing SWML from a SWAIG function](https://developer.signalwire.com/swml/guides/ai/executing_swml.md): Learn how to execute SWML from a SWAIG function. - [Creating a Santa AI with SWML: Engaging in the Spirit of Christmas](https://developer.signalwire.com/swml/guides/ai/holiday_special_santa_ai.md): Prerequisites - [Use set_meta_data](https://developer.signalwire.com/swml/guides/ai/set_meta_data.md): Learn how to use `set_meta_data` to store metadata to reference later. - [SWAIG](https://developer.signalwire.com/swml/guides/ai/swaig.md): The SignalWire AI Gateway connects your AI Agents to functionality on your backend. - [SWAIG.Function Guides](https://developer.signalwire.com/swml/guides/ai/swaig/functions.md): Guides for using SWAIG.functions with SignalWire. - [In-Depth Guide to data_map](https://developer.signalwire.com/swml/guides/ai/swaig/functions/data_map.md): Learn how to use `data_map` in SWML SWAIG functions to process, transform, and utilize incoming data effectively. - [Using toggle_functions](https://developer.signalwire.com/swml/guides/ai/toggle_functions.md): Learn how to use `toggle_functions` to toggle functions on and off. - [Creating a Voicemail Bot](https://developer.signalwire.com/swml/guides/ai/voicemail_bot_example.md): Learn how to create a voicemail bot using SWML. - [Call Whisper with SWML](https://developer.signalwire.com/swml/guides/call-whisper.md): A guide that shows you how to perform a Call Whisper using SWML. - [Creating an IVR with SWML](https://developer.signalwire.com/swml/guides/creating_ivr.md): Learn how to create an IVR with SWML. - [Methods](https://developer.signalwire.com/swml/guides/methods.md): Guides for using methods with SWML. - [How are the methods goto, execute and transfer different?](https://developer.signalwire.com/swml/guides/methods/goto_execute_transfer_disambiguation.md): Learn how to use the goto, execute, and transfer methods in SWML. - [Request](https://developer.signalwire.com/swml/guides/methods/request.md): Learn how to use the request method in SWML to send HTTP requests to a web server. - [Handling SWML From Code](https://developer.signalwire.com/swml/guides/remote_server.md): Learn how to handle incomming calls from a remote server using SWML. - [Methods overview](https://developer.signalwire.com/swml/methods.md): Overview of SWML methods. - [ai](https://developer.signalwire.com/swml/methods/ai.md): Create an AI agent to interact with users. - [ai.hints](https://developer.signalwire.com/swml/methods/ai/hints.md): Hints help the AI agent understand certain words or phrases better. Words that can commonly be mispronounced can be added to the hints to help the AI speak more accurately. - [ai.languages](https://developer.signalwire.com/swml/methods/ai/languages.md): Configure the spoken language of your AI Agent, as well as the TTS engine, voice, and fillers. - [ai.params](https://developer.signalwire.com/swml/methods/ai/params.md): Parameters for AI that can customize the AI agent's behavior. - [params.conscience](https://developer.signalwire.com/swml/methods/ai/params/conscience.md): A prompt for AI that reinforces the AI agent's behavior and guardrails throughout the conversation. - [params.hold_music](https://developer.signalwire.com/swml/methods/ai/params/hold_music.md): A URL for the hold music to play, accepting WAV, Mp3, and FreeSWITCH tone_stream. - [params.interrupt_prompt](https://developer.signalwire.com/swml/methods/ai/params/interrupt_prompt.md): A prompt for AI that can be passed for when the AI agent is interrupted by the user. - [ai.post_prompt](https://developer.signalwire.com/swml/methods/ai/post_prompt.md): The final set of instructions and configuration settings to send to the agent. - [ai.post_prompt_url](https://developer.signalwire.com/swml/methods/ai/post_prompt_url.md): The URL that the user defines to which to send status callbacks and reports. - [ai.prompt](https://developer.signalwire.com/swml/methods/ai/prompt.md): Establish the set of rules and instructions for the AI agent through a prompt. - [prompt.contexts](https://developer.signalwire.com/swml/methods/ai/prompt/contexts.md): An object that defines the context steps for the AI. The contexts are used to define the flow of the conversation. - [contexts.steps](https://developer.signalwire.com/swml/methods/ai/prompt/contexts/steps.md): An array of objects that define the steps in the context. - [prompt.pom](https://developer.signalwire.com/swml/methods/ai/prompt/pom.md): The prompt object model (POM) is a structured data format for organizing, and rendering prompt instructions for AI agents. - [ai.pronounce](https://developer.signalwire.com/swml/methods/ai/pronounce.md): Use this object to clarify AI's pronunciation of certain words or expressions. - [ai.SWAIG](https://developer.signalwire.com/swml/methods/ai/swaig.md): The SignalWire AI Gateway Interface. Allows you to create user-defined functions that can be executed during the dialogue. - [SWAIG.defaults](https://developer.signalwire.com/swml/methods/ai/swaig/defaults.md): The default settings for all SWAIG functions. - [defaults.web_hook_url](https://developer.signalwire.com/swml/methods/ai/swaig/defaults/web_hook_url.md): The default URL that the user defines to which to send status callbacks and reports. - [SWAIG.functions](https://developer.signalwire.com/swml/methods/ai/swaig/functions.md): Functions that can be executed during the interaction with the AI. - [functions.data_map](https://developer.signalwire.com/swml/methods/ai/swaig/functions/data_map.md): Defines how a SWAIG function should process and respond to the user's input data. - [data_map.expressions](https://developer.signalwire.com/swml/methods/ai/swaig/functions/data_map/expressions.md): An array of objects that define plain string or regex patterns to match against the user's input. - [data_map.output](https://developer.signalwire.com/swml/methods/ai/swaig/functions/data_map/output.md): The output object for the SWAIG function. - [data_map.webhooks](https://developer.signalwire.com/swml/methods/ai/swaig/functions/data_map/webhooks.md): An array of objects that define external API calls. - [webhooks.foreach](https://developer.signalwire.com/swml/methods/ai/swaig/functions/data_map/webhooks/foreach.md): Iterates over an array of objects and processes an output based on each element in the array. - [functions.fillers](https://developer.signalwire.com/swml/methods/ai/swaig/functions/fillers.md): The fillers object for the SWAIG function. - [functions.parameters](https://developer.signalwire.com/swml/methods/ai/swaig/functions/parameters.md): The parameters object for the SWAIG function. - [functions.web_hook_url](https://developer.signalwire.com/swml/methods/ai/swaig/functions/web_hook_url.md): The URL that the user defines to which to send status callbacks and reports. - [SWAIG Includes](https://developer.signalwire.com/swml/methods/ai/swaig/includes.md): Remote function signatures to include in SWAIG functions. - [internal_fillers](https://developer.signalwire.com/swml/methods/ai/swaig/internal_fillers.md): Fillers that help break silence between responses and are played asynchronously during the function call. - [SWAIG.native_functions](https://developer.signalwire.com/swml/methods/ai/swaig/native_functions.md): The list of prebuilt functions that the AI agent is able to call. - [answer](https://developer.signalwire.com/swml/methods/answer.md): Answer incoming call and set an optional maximum duration. - [cond](https://developer.signalwire.com/swml/methods/cond.md): Execute a sequence of instructions depending on the value of a JavaScript condition. - [connect](https://developer.signalwire.com/swml/methods/connect.md): Dial a SIP URI or phone number. - [connect.headers](https://developer.signalwire.com/swml/methods/connect/headers.md): Custom SIP headers to add to INVITE. Has no effect on calls to phone numbers. - [denoise](https://developer.signalwire.com/swml/methods/denoise.md): Start noise reduction. - [detect_machine](https://developer.signalwire.com/swml/methods/detect_machine.md): Detect whether the other end of the call is a machine (fax, voicemail, etc.) or a human, using AMD and fax detection. - [execute](https://developer.signalwire.com/swml/methods/execute.md): Execute a specified section or URL as a subroutine, and upon completion, return to the current document. - [goto](https://developer.signalwire.com/swml/methods/goto.md): Jumps to a defined label in the current SWML section. - [hangup](https://developer.signalwire.com/swml/methods/hangup.md): Ends the call. - [join_conference](https://developer.signalwire.com/swml/methods/join_conference.md): Join an ad-hoc audio conference with RELAY and CXML calls. - [join_room](https://developer.signalwire.com/swml/methods/join_room.md): Join a Relay Room Session. - [label](https://developer.signalwire.com/swml/methods/label.md): Mark any point of the SWML section with a label. - [live_transcribe](https://developer.signalwire.com/swml/methods/live_transcribe.md): Transcribe a voice interaction in real-time. - [live_transcribe.action](https://developer.signalwire.com/swml/methods/live_transcribe/action.md): The action to be performed during a live transcription session. - [action.start](https://developer.signalwire.com/swml/methods/live_transcribe/action/start.md): Start a live transcription session. - [action.stop](https://developer.signalwire.com/swml/methods/live_transcribe/action/stop.md): Stop a live transcription session. - [action.summarize](https://developer.signalwire.com/swml/methods/live_transcribe/action/summarize.md): Summarize the live transcription. - [live_translate](https://developer.signalwire.com/swml/methods/live_translate.md): Translate a voice interaction in real-time. - [live_translate.action](https://developer.signalwire.com/swml/methods/live_translate/action.md): The action to be performed during a live translation session. - [action.inject](https://developer.signalwire.com/swml/methods/live_translate/action/inject.md): Inject a message into the conversation. - [action.start](https://developer.signalwire.com/swml/methods/live_translate/action/start.md): Start a live translation session. - [action.stop](https://developer.signalwire.com/swml/methods/live_translate/action/stop.md): Stop a live translation session. - [action.summarize](https://developer.signalwire.com/swml/methods/live_translate/action/summarize.md): Summarize the live translation. - [pay](https://developer.signalwire.com/swml/methods/pay.md): Enable secure payment processing during voice calls. - [pay.parameters](https://developer.signalwire.com/swml/methods/pay/parameters.md): Pass custom parameters to your payment processor. - [pay.payment_connector_url](https://developer.signalwire.com/swml/methods/pay/payment_connector_url.md): The payment_connector_url is the URL to make payment requests to upon completion of all required payment details. - [Prompts Object](https://developer.signalwire.com/swml/methods/pay/prompts.md): Customize the audio prompts played during different stages of the payment process. - [prompts.actions](https://developer.signalwire.com/swml/methods/pay/prompts/actions.md): Customize the audio prompts played during different stages of the payment process. - [play](https://developer.signalwire.com/swml/methods/play.md): Play file(s), ringtones, speech or silence. - [prompt](https://developer.signalwire.com/swml/methods/prompt.md): Play a prompt and wait for input. - [receive_fax](https://developer.signalwire.com/swml/methods/receive_fax.md): Receive a fax being delivered to this call. - [record](https://developer.signalwire.com/swml/methods/record.md): Record the call audio in the foreground pausing further SWML execution until recording ends. - [record_call](https://developer.signalwire.com/swml/methods/record_call.md): Record call in the background. - [request](https://developer.signalwire.com/swml/methods/request.md): Send a HTTP request to a remote URL. - [return](https://developer.signalwire.com/swml/methods/return.md): Return from a `execute` method or exit script. - [send_digits](https://developer.signalwire.com/swml/methods/send_digits.md): Send digit presses as DTMF tones. - [send_fax](https://developer.signalwire.com/swml/methods/send_fax.md): Send a fax. - [send_sms](https://developer.signalwire.com/swml/methods/send_sms.md): Send an outbound message to a PSTN phone number. - [set](https://developer.signalwire.com/swml/methods/set.md): Set script variables to the specified values. - [sip_refer](https://developer.signalwire.com/swml/methods/sip_refer.md): Send a SIP REFER to a SIP call. - [sleep](https://developer.signalwire.com/swml/methods/sleep.md): Set the amount of time for the current application to sleep for in milliseconds before continuing to the next action. - [stop_denoise](https://developer.signalwire.com/swml/methods/stop_denoise.md): Stop noise reduction. - [stop_record_call](https://developer.signalwire.com/swml/methods/stop_record_call.md): Stop an active background recording. - [stop_tap](https://developer.signalwire.com/swml/methods/stop_tap.md): Stop an active tap stream. - [switch](https://developer.signalwire.com/swml/methods/switch.md): Execute different instructions based on a variable's value. - [tap](https://developer.signalwire.com/swml/methods/tap.md): Start background call tap. Media is streamed over Websocket or RTP to customer controlled URI. - [transfer](https://developer.signalwire.com/swml/methods/transfer.md): Transfer the execution of the script to a different `SWML section`, `URL`, or `Relay application`. - [unset](https://developer.signalwire.com/swml/methods/unset.md): Unset specified variables. - [user_event](https://developer.signalwire.com/swml/methods/user_event.md): Send custom events to the connected client on the call. ## call-flow-builder - [Call Flow Builder](https://developer.signalwire.com/call-flow-builder.md): Learn about the Call Flow Builder, a visual tool for creating and managing call flows. - [AI Agent](https://developer.signalwire.com/call-flow-builder/ai-agent.md): Call Flow Builder node to connect to an AI Agent - [Answer Call](https://developer.signalwire.com/call-flow-builder/answer-call.md): Call Flow Builder node to answer an incoming call. - [Conditions](https://developer.signalwire.com/call-flow-builder/conditions.md): Call Flow Builder node to add conditions to your call flow. - [Execute SWML](https://developer.signalwire.com/call-flow-builder/execute-swml.md): Call Flow Builder node to execute a remote SWML document and return to the current document. - [Forward to Phone](https://developer.signalwire.com/call-flow-builder/forward-to-phone.md): Call Flow Builder node to forward the call to a phone number. - [Gather Input](https://developer.signalwire.com/call-flow-builder/gather-input.md): Call Flow Builder node to gather input from the caller. - [Handle Call](https://developer.signalwire.com/call-flow-builder/handle-call.md): Call Flow Builder node to handle an incoming call. - [Hang Up Call](https://developer.signalwire.com/call-flow-builder/hangup-call.md): Call Flow Builder node to hang up a call. - [Nodes](https://developer.signalwire.com/call-flow-builder/nodes.md): Call Flow Builder - [Play Audio or TTS](https://developer.signalwire.com/call-flow-builder/play-audio-or-tts.md): Call Flow Builder node to play audio or TTS to the caller. - [Request](https://developer.signalwire.com/call-flow-builder/request.md): Call Flow Builder node to make an HTTP request - [Send SMS](https://developer.signalwire.com/call-flow-builder/send_sms.md): Call Flow Builder node to send an SMS - [Set Variables](https://developer.signalwire.com/call-flow-builder/set-variables.md): Call Flow Builder node to set variables in the call flow. - [Start Call Recording](https://developer.signalwire.com/call-flow-builder/start-call-recording.md): Call Flow Builder node to start recording a call. - [Stop Call Recording](https://developer.signalwire.com/call-flow-builder/stop-call-recording.md): Call Flow Builder node to stop recording a call. - [Unset Variables](https://developer.signalwire.com/call-flow-builder/unset-variables.md): Call Flow Builder node to unset variables in the call flow. - [Variables](https://developer.signalwire.com/call-flow-builder/variables.md): Call Flow Builder - [Voicemail Recording](https://developer.signalwire.com/call-flow-builder/voicemail-recording.md): Call Flow Builder node to record voicemail messages. ## cantina - [User Guide for SignalWire Work/Events](https://developer.signalwire.com/cantina/user-guide.md): A comprehensive user guide for the SignalWire Work and Events products. - [Administrator Guide for SignalWire Work/Events](https://developer.signalwire.com/cantina/user-guide-for-admin-rights.md): Getting started with an Administrator account ## chat - [Chat](https://developer.signalwire.com/chat.md): Programmable, integrated, low-latency Chat APIs and SDKs - [Chat FAQs](https://developer.signalwire.com/chat/faq.md): Chat can be used to send and receive any JSON-serializable object. - [Getting Started](https://developer.signalwire.com/chat/getting-started.md): Learn how to get started with the SignalWire Chat API. - [First steps with Chat](https://developer.signalwire.com/chat/getting-started/chat-first-steps.md): Quickly implement a full-fledged chat into your web application. - [Simple Chat Demo](https://developer.signalwire.com/chat/getting-started/get-started-with-a-simple-chat-demo.md): In this guide we will explore a simple chat application built using the SignalWire SDK. - [Guides](https://developer.signalwire.com/chat/guides.md): Learn how to use the SignalWire Chat API. - [Building Chat Apps with React](https://developer.signalwire.com/chat/guides/build-a-react-chat-application.md): Learn how to build a chat application with React. - [Using Chat to Send SMS and Make Calls](https://developer.signalwire.com/chat/guides/using-chat-to-send-sms-and-make-calls.md): Learn how to use the SignalWire Chat API to send SMS and make calls. ## compatibility-api - [Introduction to the Compatibility API](https://developer.signalwire.com/compatibility-api.md): Learn about SignalWire's Compatibility API, including its API Reference, the cXML Specification, and available Client SDKs. - [Methods](https://developer.signalwire.com/compatibility-api/api-reference/rest-client-sdks/methods.md): A combined technical reference for methods of the Compatibility API REST Client SDKs, including Node.js, Python, Ruby, and C#. - [Available Phone Numbers](https://developer.signalwire.com/compatibility-api/client-sdks/api/available-phone-numbers.md): The ability to search for local, toll-free, and mobile phone numbers to purchase. - [Find All Toll-Free Numbers](https://developer.signalwire.com/compatibility-api/client-sdks/api/available-phone-numbers/find-toll-free.md): Use this endpoint for the AvailablePhoneNumbers method to find available toll-free numbers in the United States. - [List of AvailablePhoneNumber Resources](https://developer.signalwire.com/compatibility-api/client-sdks/api/available-phone-numbers/list-resources.md): Use this endpoint for the AvailablePhoneNumbers method to return a list of URIs to phone number resources available to the account. - [Search for Local AvailablePhoneNumbers](https://developer.signalwire.com/compatibility-api/client-sdks/api/available-phone-numbers/search-local.md): Use this endpoint for the AvailablePhoneNumbers method to search for available phone numbers that match your criteria. - [Applications](https://developer.signalwire.com/compatibility-api/client-sdks/applications.md): An application contains a set of URLs and other data that tells SignalWire how to behave when calls and messages are received. - [Create an Application](https://developer.signalwire.com/compatibility-api/client-sdks/applications/create.md): Use this endpoint for the Applications method to create a new application within your account. - [Delete an Application](https://developer.signalwire.com/compatibility-api/client-sdks/applications/delete.md): Use this endpoint for the Applications method to delete an Application. - [Retrieve an Application](https://developer.signalwire.com/compatibility-api/client-sdks/applications/retrieve.md): Use this endpoint for the Applications method to retrieve Applications associated with your account in a list. - [Update an Application](https://developer.signalwire.com/compatibility-api/client-sdks/applications/update.md): Use this endpoint for the Applications method to modify the properties of an application. - [Accounts](https://developer.signalwire.com/compatibility-api/client-sdks/methods/accounts.md): Accounts allow you to list and update your SignalWire Projects. - [List All Accounts](https://developer.signalwire.com/compatibility-api/client-sdks/methods/accounts/list.md): Use this endpoint for the Accounts method to list all accounts. - [Retrieve an Account](https://developer.signalwire.com/compatibility-api/client-sdks/methods/accounts/retrieve.md): Use this endpoint for the Accounts method to retrieve a single account. - [Update an Account](https://developer.signalwire.com/compatibility-api/client-sdks/methods/accounts/update.md): Use this endpoint for the Accounts method to modify the properties of an account. - [Calls](https://developer.signalwire.com/compatibility-api/client-sdks/methods/calls.md): A call is a connection between SignalWire and another phone. - [Create a Call](https://developer.signalwire.com/compatibility-api/client-sdks/methods/calls/create.md): Use this endpoint for the Calls method to create a new call. - [Delete a Call](https://developer.signalwire.com/compatibility-api/client-sdks/methods/calls/delete.md): Use this endpoint for the Calls method to delete a call. - [List All Calls](https://developer.signalwire.com/compatibility-api/client-sdks/methods/calls/list.md): Use this endpoint for the Calls method to list all of the calls that are associated with your account. - [Retrieve a Call](https://developer.signalwire.com/compatibility-api/client-sdks/methods/calls/retrieve.md): Use this endpoint for the Calls method to retrieve a single call. - [Update a Call](https://developer.signalwire.com/compatibility-api/client-sdks/methods/calls/update.md): Use this endpoint for the Calls method to modify an active call. - [Conference Participants](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conference-participants.md): Conference participants refer to the participants that are actively connected to a conference call. - [Add a Participant](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conference-participants/add.md): In order to add a participant to a conference call, from the cXML REST API, create an - [Delete a Participant](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conference-participants/delete.md): Use this endpoint for the Conference Participants method to delete a participant, removing them from the conference call. - [List All Active Participants](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conference-participants/list.md): Use this endpoint for the Conference Participants method to read all of the active participants that are associated with this conference call. - [Retrieve a Participant](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conference-participants/retrieve.md): Use this endpoint for the Conference Participants method to retrieve a single participant. - [Update a Participant](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conference-participants/update.md): Use this endpoint for the Conference Participants method to modify the properties of participant in an active conference call. - [Conferences](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conferences.md): The Conference resource permits you to search, modify, and manage conferences in your SignalWire account. - [List All Conferences](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conferences/list.md): Use this endpoint for the Conference method to read all of the conferences that are associated with your SignalWire account. - [Retrieve a Conference](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conferences/retrieve.md): Use this endpoint for the Conference method to retrieve a single conference. - [Update a Conference](https://developer.signalwire.com/compatibility-api/client-sdks/methods/conferences/update.md): Use this endpoint for the Conference method to modify the properties of a conference. - [cXML Applications](https://developer.signalwire.com/compatibility-api/client-sdks/methods/cxml-applications.md): cXML Applications are our serverless hosted service that allows you to easily serve static documents without setting up any infrastructure. - [Create a cXML Application](https://developer.signalwire.com/compatibility-api/client-sdks/methods/cxml-applications/create.md): Create a new cXML Application by making a POST request to the cXML Application resource. - [Delete a cXML Application](https://developer.signalwire.com/compatibility-api/client-sdks/methods/cxml-applications/delete.md): Use this endpoint for the cXML Applications method to remove a cXML Application from your Project. - [List all cXML Applications](https://developer.signalwire.com/compatibility-api/client-sdks/methods/cxml-applications/list.md): Returns a list of your Addresses. - [Retrieve a cXML Application](https://developer.signalwire.com/compatibility-api/client-sdks/methods/cxml-applications/retrieve.md): Retrieves the details of a cXML Application that has been previously created. - [Update a cXML Application](https://developer.signalwire.com/compatibility-api/client-sdks/methods/cxml-applications/update.md): To update a cXML Application, make a POST request to the cXML Application resource. - [Fax Media](https://developer.signalwire.com/compatibility-api/client-sdks/methods/fax-media.md): The Fax Media resource provides detailed information about the media files attached to fax instances. - [Delete a Fax Media](https://developer.signalwire.com/compatibility-api/client-sdks/methods/fax-media/delete.md): Use this endpoint for the Fax Media method to delete a fax media instance. - [List All Media of a Fax](https://developer.signalwire.com/compatibility-api/client-sdks/methods/fax-media/list-all.md): Use this endpoint for the Fax Media method to return a paged list - [Retrieve a Fax Media Instance](https://developer.signalwire.com/compatibility-api/client-sdks/methods/fax-media/retrieve.md): Use this endpoint for the Fax Media method to retrieve a single fax media. - [Faxes](https://developer.signalwire.com/compatibility-api/client-sdks/methods/faxes.md): A Fax is a fax that has been sent to or received by a SignalWire phone number. - [Delete a Fax](https://developer.signalwire.com/compatibility-api/client-sdks/methods/faxes/delete.md): Use this endpoint for the Fax method to delete a fax. - [List All Faxes](https://developer.signalwire.com/compatibility-api/client-sdks/methods/faxes/list.md): Use this endpoint for the Fax method to list all faxes on your SignalWire account. - [Retrieve a Fax](https://developer.signalwire.com/compatibility-api/client-sdks/methods/faxes/retrieve.md): Use this endpoint for the Fax method to retrieve a single fax by its SID. - [Send a Fax](https://developer.signalwire.com/compatibility-api/client-sdks/methods/faxes/send.md): Use this endpoint for the Fax method to send a Fax. - [Update a Fax](https://developer.signalwire.com/compatibility-api/client-sdks/methods/faxes/update.md): Use this endpoint for the Fax method to update the Status of a Fax. - [Incoming Phone Numbers](https://developer.signalwire.com/compatibility-api/client-sdks/methods/incoming-phone-numbers.md): IncomingPhoneNumbers represent an account's phone numbers that were purchased through SignalWire. - [Create an IncomingPhoneNumber](https://developer.signalwire.com/compatibility-api/client-sdks/methods/incoming-phone-numbers/create.md): Use this endpoint for the IncomingPhoneNumber method to create an IncomingPhoneNumber. - [Delete an IncomingPhoneNumber](https://developer.signalwire.com/compatibility-api/client-sdks/methods/incoming-phone-numbers/delete.md): Use this endpoint for the IncomingPhoneNumber method to delete an IncomingPhoneNumber. - [List All IncomingPhoneNumbers](https://developer.signalwire.com/compatibility-api/client-sdks/methods/incoming-phone-numbers/list.md): Use this endpoint for the IncomingPhoneNumber method to read all of the IncomingPhoneNumbers that are associated with your SignalWire account. - [Retrieve an IncomingPhoneNumber](https://developer.signalwire.com/compatibility-api/client-sdks/methods/incoming-phone-numbers/retrieve.md): Use this endpoint for the IncomingPhoneNumber method to retrieve a single IncomingPhoneNumber. - [Update an IncomingPhoneNumber](https://developer.signalwire.com/compatibility-api/client-sdks/methods/incoming-phone-numbers/update.md): Use this endpoint for the IncomingPhoneNumber method to modify the properties of an incoming phone number. - [Media](https://developer.signalwire.com/compatibility-api/client-sdks/methods/media.md): The Media object represents a single attachment or media file that is associated with a Message. - [Delete a media object](https://developer.signalwire.com/compatibility-api/client-sdks/methods/media/delete.md): Use this endpoint for the Media method to delete a media instance from your Project so it no longer appears in the Dashboard or on the API. - [List all media](https://developer.signalwire.com/compatibility-api/client-sdks/methods/media/list.md): Use this endpoint for the Media method to return a paged list - [Retrieve a media object](https://developer.signalwire.com/compatibility-api/client-sdks/methods/media/retrieve.md): Use this endpoint for the Media method to retrieve a single media record. - [Messages](https://developer.signalwire.com/compatibility-api/client-sdks/methods/messaging.md): A Message is an inbound or outbound message sent or received by your SignalWire project. - [Create a message](https://developer.signalwire.com/compatibility-api/client-sdks/methods/messaging/create.md): Use this endpoint for the Media method to send an outbound message from one of your SignalWire phone numbers. - [Delete a message](https://developer.signalwire.com/compatibility-api/client-sdks/methods/messaging/delete.md): Use this endpoint for the Media method to delete a message from your Project so it no longer appears in the Dashboard or on the API. - [List all messages](https://developer.signalwire.com/compatibility-api/client-sdks/methods/messaging/list.md): Use this endpoint for the Media method to return a paged list - [Retrieve a message](https://developer.signalwire.com/compatibility-api/client-sdks/methods/messaging/retrieve.md): Use this endpoint for the Media method to retrieve a single message. - [Update a message](https://developer.signalwire.com/compatibility-api/client-sdks/methods/messaging/update.md): Use this endpoint for the Media method to update a message body after it has been sent. - [Queue Members](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queue-members.md): Queue members are the callers who are currently waiting in a call queue. - [List All Queue Members](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queue-members/list.md): Use this endpoint for the Queue Members method to read all of the queue members that are waiting in a particular queue. - [Retrieve a Queue Member](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queue-members/retrieve.md): Use this endpoint for the Queue Members method to retrieve a single queue member. - [Update a Queue Member](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queue-members/update.md): Use this endpoint for the Queue Members method to modify the properties of a queue member that is actively waiting in a call queue. - [Queues](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queues.md): Queue permits you to search and maintain individual call queues. - [Create a Queue](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queues/create.md): Use this endpoint for the Queues method to create a new call queue. - [Delete a Queue](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queues/delete.md): Use this endpoint for the Queues method to delete a single call queue. - [List All Queues](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queues/list.md): Use this endpoint for the Queues method to read all of the queues that are associated with your account. - [Retrieve a Queue](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queues/retrieve.md): Use this endpoint for the Queues method to retrieve a single call queue. - [Retrieve Members Waiting in a Queue](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queues/retrieve-members-waiting-in-queue.md): Use this endpoint for the Queues method to read the list of members that are currently waiting in a call queue. - [Update a Queue](https://developer.signalwire.com/compatibility-api/client-sdks/methods/queues/update.md): Use this endpoint for the Queues method to modify the properties of a single call queue. - [Recording Transcriptions](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recording-transcriptions.md): Recording transcriptions are the transcribed texts that were generated from voice call recordings. - [Delete a Recording Transcription](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recording-transcriptions/delete.md): Use this endpoint for the Recording Transcriptions method to delete a recording transcription from your account. - [List All Transcriptions](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recording-transcriptions/list.md): Use this endpoint for the Recording Transcriptions method to read all of the recording transcriptions that are associated with your account. - [Retrieve a Transcription](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recording-transcriptions/retrieve.md): Use this endpoint for the Recording Transcriptions method to retrieve a single recording transcription. - [Recordings](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recordings.md): A Recording represents a recording of a voice or conference call. - [Create a Recording](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recordings/create.md): Use this endpoint for the Recordings method to initiate a Recording for a Call. - [Delete a Recording](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recordings/delete.md): Use this endpoint for the Recordings method to delete a recording. - [List All Recordings of an Account](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recordings/list.md): Use this endpoint for the Recordings method to fetch all the recordings that are associated with your SignalWire account. - [Retrieve a Recording](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recordings/retrieve.md): Use this endpoint for the Recordings method to retrieve a single recording media or its metadata. - [Update a Recording](https://developer.signalwire.com/compatibility-api/client-sdks/methods/recordings/update.md): Use this endpoint for the Recordings method to pause, resume or stop a Recording. - [The cXML Specification](https://developer.signalwire.com/compatibility-api/cxml.md): Learn about the specification defining cXML, the SignalWire language used to define phone number messaging and calling behavior. - [Fax XML](https://developer.signalwire.com/compatibility-api/cxml/fax.md): Fax cXML is a set of actions defined in an XML document you can use to tell SignalWire what to do when you receive an incoming fax. - [](https://developer.signalwire.com/compatibility-api/cxml/fax/receive.md): The `` verb tells SignalWire to receive an incoming fax, which results in the creation of a new Fax instance resource. - [](https://developer.signalwire.com/compatibility-api/cxml/fax/reject.md): The ` verb tells SignalWire to reject an incoming fax, which results in a status of canceled`. - [Messaging XML](https://developer.signalwire.com/compatibility-api/cxml/messaging.md): SignalWire cXML is a set of actions defined in an XML document that you can use to tell SignalWire what to do when you receive an incoming SMS or MMS message. - [](https://developer.signalwire.com/compatibility-api/cxml/messaging/message.md): The ` verb sends an SMS or MMS message to a phone number. To send a message in combination with Voice XML verbs, use the ` Voice verb. - [](https://developer.signalwire.com/compatibility-api/cxml/messaging/redirect.md): The ` verb transfers control from the current document to another. It is effectively an exit statement from the current document, as there is no way to return to any instructions listed after the ` verb. - [Voice XML](https://developer.signalwire.com/compatibility-api/cxml/voice.md): SignalWire cXML is a set of actions defined in an XML document you can use to tell SignalWire what to do when you receive an incoming call or instructions for outbound calls. - [ noun](https://developer.signalwire.com/compatibility-api/cxml/voice/conference-noun.md): ` verb's ` noun allows the connection to a named conference room. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/connect.md): The `` verb connects an existing call to another resource. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/denoise.md): The `` verb enables or disables noise reduction for call audio inbound to SignalWire. It - [](https://developer.signalwire.com/compatibility-api/cxml/voice/dial.md): The ` verb connects an existing call to another phone number. ` will end this new call if: the called number does not answer, the number does not exist, or SignalWire receives a busy signal. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/echo.md): The `` verb will echo audio back to the call. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/enqueue.md): The ` verb places a call in a specified call queue. If the specified queue does not exist, a new queue will be created and the call will be placed into that new queue. Calls can be dequeued through the verb or removed from the queue through the ` verb. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/gather.md): The `` verb transcribes speech or collects digits during a call. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/hangup.md): The ` verb ends a call. While ed calls are never answered, calls that use the ` verb for disconnection are still answered, becoming subject to billing. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/leave.md): The ` verb transfers a call out of the queue containing that call. It then returns the flow of execution to verb following the ` that placed this call into the queue. - [ noun](https://developer.signalwire.com/compatibility-api/cxml/voice/number-noun.md): ` verb's noun specifies what phone number to dial. You can use up to 10 s within a ` to simultaneously call several people. The first person to answer the call will be connected to the caller and the rest of the called numbers will be hung up. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/pause.md): The `` verb waits silently for a distinctive number of seconds. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/pay.md): Overview - [](https://developer.signalwire.com/compatibility-api/cxml/voice/pay/parameter.md): The ` noun within the ` verb enables you to: - [](https://developer.signalwire.com/compatibility-api/cxml/voice/pay/prompt.md): The ` noun allows you to customize the default prompts used by `. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/play.md): The `` verb plays an audio file, which SignalWire fetches from the URL you configured, back to the caller. - [ noun](https://developer.signalwire.com/compatibility-api/cxml/voice/queue-noun.md): ` verb's ` noun specifies what queue to dial. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/record.md): The `` verb creates an audio file with the caller's voice and returns the URL to you. Text transcriptions of these recorded calls can also be produced. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/redirect.md): An example that redirects the next XML instruction to another call: - [](https://developer.signalwire.com/compatibility-api/cxml/voice/refer.md): The ` verb transfers a SIP call in SignalWire to a transfer target using the SIP REFER method. This verb returns upon completion of transfer, on failure of transfer, on hangup, or on time out while waiting for NOTIFY. SignalWire will not hang up after ` until all verbs have been processed. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/reject.md): The ` verb rejects a call to your SignalWire number. It is effectively an exit statement from the current document, as there is no way to return to any instructions listed after the ` verb. - [ noun](https://developer.signalwire.com/compatibility-api/cxml/voice/room-noun.md): ` verb's ` noun allows the connection to a video room. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/say.md): The `` verb reads the supplied text back to the caller. It is useful for text that is difficult to pre-record. The gender and language in which the text will be read is customizable. - [ noun](https://developer.signalwire.com/compatibility-api/cxml/voice/sip-noun.md): ` verb's ` noun permits the set up of VoIP sessions using SIP (Session Initiation Protocol). You can send a call to any SIP endpoint. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/sms.md): The `` verb sends an SMS message to a phone number during a phone call. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/stream.md): The `` instruction makes it possible to send raw audio streams from a running phone call over WebSockets in near real time, to a specified URL. The audio frames themselves are base64 encoded, embedded in a json string, together with other information like sequence number and timestamp. The feature can be used with Speech-To-Text systems and others. - [](https://developer.signalwire.com/compatibility-api/cxml/voice/verto-noun.md): The `` noun is used to create a Verto connection. This is a SignalWire specific noun - [ noun](https://developer.signalwire.com/compatibility-api/cxml/voice/virtualagent-noun.md): ` verb's ` noun permits connecting the - [Overview](https://developer.signalwire.com/compatibility-api/guides.md): A collection of guides that help you get the most out of the SignalWire Compatibility API. - [General Guides](https://developer.signalwire.com/compatibility-api/guides/general.md): A collection of general guides for working with SignalWire's Compatibility API. - [Call & Text By Proxy (Masked Numbers) - Python](https://developer.signalwire.com/compatibility-api/guides/general/calltext-by-proxy.md): Overview - [Creating and Using cXML scripts](https://developer.signalwire.com/compatibility-api/guides/general/creating-and-using-cxml-scripts.md): What Are cXML scripts? - [Phone Numbers](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers.md): A collection of guides for working with phone numbers while using SignalWire's Compatibility API. - [Purchasing Numbers in Bulk](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/how-to-purchase-numbers-in-bulk.md): Enjoy this user-friendly approach to adding API search parameters through queries in your console. Whether you want to buy local or purchase toll-free, this guide can help find all the numbers that suit your needs and seamlessly add them to your project. - [Update Webhooks in Bulk](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/how-to-update-webhooks-in-bulk.md): Use Python or Node.js to Update Webhooks on Bulk Amount of Numbers - [Listing Numbers to a CSV](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/list-numbers-to-csv.md): List all of the numbers in your SignalWire Project and export them to CSV - [Releasing Numbers](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/release-numbers.md): This code snippet will filter all numbers by a certain area code or sequence and then return all the numbers that match. Once you review the numbers that it prints out, you can uncomment the delete line and run it again to release the numbers all at once. - [Releasing Numbers from a CSV](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/release-project-numbers-based-off-csv.md): The Python script example below will delete numbers from your SignalWire Space based on a CSV file of the intended numbers to be deleted. - [Removing Landlines From Your Recipient List and Gathering Additional Information](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/remove-all-landlines-from-your-recipient-list.md): Stop sending messages to landlines! This snippet will use a Phone Number Lookup including carrier details for all numbers in your recipient list, and removes any numbers that are not sms-enabled. - [Mustache Template Parameters in cXML applications](https://developer.signalwire.com/compatibility-api/guides/general/utilizing-mustache-templates.md): An introduction to saving parameters as mustache variables through XML webhooks. - [Messaging Guides](https://developer.signalwire.com/compatibility-api/guides/messaging.md): This section contains guides for the SignalWire Messaging API using the Compatibility API. - [General Messaging Guides](https://developer.signalwire.com/compatibility-api/guides/messaging/general.md): This section contains general guides for the SignalWire Messaging API using the Compatibility API. - [Handling Incoming Messages from Code](https://developer.signalwire.com/compatibility-api/guides/messaging/general/handling-incoming-messages-from-code.md): In Receiving your first SMS we - [Listing Messages Filtered by Multiple From Numbers](https://developer.signalwire.com/compatibility-api/guides/messaging/general/how-to-list-messages-filtered-by-multiple-from-numbers.md): Overview - [Listing Messages with a Specific Error Code to CSV](https://developer.signalwire.com/compatibility-api/guides/messaging/general/how-to-list-messages-with-a-specific-error-code-to-csv.md): Overview - [Finding All Undelivered Messages](https://developer.signalwire.com/compatibility-api/guides/messaging/general/how-to-pull-undelivered-messages.md): Overview - [Redacting Messages for HIPAA Compliance](https://developer.signalwire.com/compatibility-api/guides/messaging/general/how-to-redact-messages-for-hippa-compliancy.md): This guide will show you two ways to approach redacting sensitive information from your outbound messages using the SignalWire API and Python or Node.js. - [Sending SMS from Google Sheets](https://developer.signalwire.com/compatibility-api/guides/messaging/general/how-to-send-sms-from-google-sheets.md): Do you store your customer’s information in an Excel or Google Sheets spreadsheet? - [Listing Price Summaries](https://developer.signalwire.com/compatibility-api/guides/messaging/general/how-to-use-list-messages-api-to-get-pricing-for-a-date-range.md): Overview - [Listing Messages to CSV](https://developer.signalwire.com/compatibility-api/guides/messaging/general/list-messages-to-csv-all-languages.md): Overview - [SMS Status Callbacks for Delivery Tracking](https://developer.signalwire.com/compatibility-api/guides/messaging/general/sms-status-callbacks.md): Overview - [Python Messaging Guides](https://developer.signalwire.com/compatibility-api/guides/messaging/python.md): This section contains guides for the SignalWire Messaging API using Python. - [Reply Statistics](https://developer.signalwire.com/compatibility-api/guides/messaging/python/how-to-get-reply-statistics-with-python.md): This guide will use the SignalWire Python SDK to get a list of owned DIDs, and compare inbound and outbound messages to provide statistics on reply rate. - [Sending Bulk SMS from CSV](https://developer.signalwire.com/compatibility-api/guides/messaging/python/how-to-send-bulk-sms-from-customer-csv-with-python.md): Overview - [Overview](https://developer.signalwire.com/compatibility-api/guides/messaging/python/send-sms-from-the-browser-with-python-flask-and-html.md): This guide will use Flask to create a simple web application that can send sms through the browser. - [Text Subscription](https://developer.signalwire.com/compatibility-api/guides/messaging/python/text-subscription.md): This guide will show you how to create a phrase-based subscription service using SignalWire and Python. The application will demonstrate how you can easily create and maintain multiple campaigns as well as their associated subscribers. The list administrator can broadcast to specific campaigns and is notified of new subscribers and removal requests via email. If you reply with stop or unsubscribe, the number will be placed on a black list. - [Forwarding Texts to Email](https://developer.signalwire.com/compatibility-api/guides/messaging/python/text-to-email.md): This guide will show you how you can handle incoming text messages and forward them to an email address. - [Status Callbacks Overview](https://developer.signalwire.com/compatibility-api/guides/signalwire-status-callbacks.md): SignalWire allows for a variety of different types of callbacks that allow you to keep an eye on your traffic and perform actions based on incoming events. - [Voice Guides](https://developer.signalwire.com/compatibility-api/guides/voice.md): A collection of voice guides that help you get the most out of the SignalWire Compatibility API. - [General Guides](https://developer.signalwire.com/compatibility-api/guides/voice/general.md): A collection of general voice guides that help you get the most out of the SignalWire Compatibility API. - [Gathering User Input from Code](https://developer.signalwire.com/compatibility-api/guides/voice/general/gathering-user-input-from-code.md): In Gathering User Input - [Handling Calls from Code](https://developer.signalwire.com/compatibility-api/guides/voice/general/handling-calls-from-code.md): In Making and Receiving Phone Calls - [Dealing with Robocallers & Inbound Spam](https://developer.signalwire.com/compatibility-api/guides/voice/general/how-to-deal-with-robocallers-inbound-spam.md): Spam is ever prevalent in this new era of messaging and calling, and that, unfortunately, does not exclude SignalWire's phone numbers. However, there are still some solutions if you find that you are receiving voice spam! - [Queues](https://developer.signalwire.com/compatibility-api/guides/voice/general/queues.md): If you've ever called any company's support or sales line, you have probably - [Call Whisper](https://developer.signalwire.com/compatibility-api/guides/voice/general/setting-up-call-whispering-in-cxml.md): A call whisper allows the callee (receiver of the call) to receive an audio message before the call is connected and allows the callee to accept or reject the incoming call. The audio message can contain information such as the source or purpose of the call. - [Cancelling a Stream with the Update a Call API](https://developer.signalwire.com/compatibility-api/guides/voice/general/stopping-streams-with-rest-api.md): This guide will show you how to cancel a stream using the SignalWire Rest API. - [Node.js Guides](https://developer.signalwire.com/compatibility-api/guides/voice/nodejs.md): A collection of guides utilizing the Node.js Compatibility API SDK. - [Answering Machine Detection](https://developer.signalwire.com/compatibility-api/guides/voice/nodejs/answering-machine-detection.md): Answering Machine Detection (AMD) is an integral feature in any phone system. It is used to screen outbound calls to determine whether a human or machine (such as an IVR or voicemail system) answers the call. If a human answers, the call can be connected to a human agent. If a machine is detected, your system may want to end the call or leave a voicemail message. - [IVR with Voicemails Forwarded to Email - Node.js](https://developer.signalwire.com/compatibility-api/guides/voice/nodejs/ivr-with-voicemail-to-email.md): Overview - [Send an Outbound Survey - Node.js](https://developer.signalwire.com/compatibility-api/guides/voice/nodejs/outbound-survey.md): A telephone survey can be used to obtain useful information from users or customers, like a medical questionnaire for example. With SignalWire's NodeJS SDK, an application can be created to send an outbound call survey to English or Spanish speakers. - [SIP Voicemail - Node.js](https://developer.signalwire.com/compatibility-api/guides/voice/nodejs/sip-voicemail.md): Set up Voicemail for your SIP endpoint. - [Python Guides](https://developer.signalwire.com/compatibility-api/guides/voice/python.md): A collection of guides utilizing the Python Compatibility API SDK. - [Screen Calls Based on a Block List - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/call-screening-block-list.md): This guide implements a call screening system based on the concept of a blocklist containing offending numbers. When a call comes in, the From number will be cross-checked with the block list to see if it is one of the blocked numbers. If so, the call will hang up. If the number is not in the block list, the call flow moves on to the next segment. - [Dial by Voice - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/dial-by-voice.md): This application will prompt the caller for a phone number via speech input and connect to the phone number recognized using ASR providing an additional level of accessibility to your users. - [Dynamic IVR using JSON Menus - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/dynamic-ivr-using-json-menus.md): This code will show you how you can use a JSON-defined menu in order to easily create an IVR Phone System with Python & Flask. We will be using the SignalWire Team as an example, but you can easily change the verbiage to fit your company's needs instead. Once you have modified this script to fit your company and point to the correct agents/departments, you only need to expose the script to the public and attach it as a webhook for handling inbound calls to one of your SignalWire DIDs. - [Execute Code during Business Hours Only - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/execute-code-in-business-hours-only.md): Using time intervals to perform a specific action depending on business hours. - [Full Featured Call Center - JSON Menus & Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/full-contact-center.md): This guide demonstrates how to use SignalWire APIs to create a completely functional call center where the features are controlled by the JSON configuration file config.json making it exceedingly easy to enable/disable features in minutes! The dynamic setup of the JSON menus adds a greater level of customizability to your IVR and makes modifying the structure on the fly a breeze. - [Getting Detailed Price Summaries about Calls](https://developer.signalwire.com/compatibility-api/guides/voice/python/getting-detailed-price-summaries-about-calls.md): Overview - [Recording Phone Calls](https://developer.signalwire.com/compatibility-api/guides/voice/python/how-to-record-phone-calls.md): "This call may be recorded for quality assurance and training purposes". We've all heard it a million times! Call recording is one of the most common use cases in call centers, customer service lines, and even in your average small business. This guide will show how you can record both inbound and outbound calls with ease in a variety of different ways to suit your needs! - [Voice Conferences](https://developer.signalwire.com/compatibility-api/guides/voice/python/how-to-use-conferences.md): Another very common use case with our voice APIs is creating/dialing conferences! This guide will show how you can dial into simple conferences using XML bins or create a more complex conferencing application using our SignalWire SDKs. - [Summarizing Voice Usage](https://developer.signalwire.com/compatibility-api/guides/voice/python/how-to-use-the-list-calls-api-to-get-statistics-python.md): In this snippet, we will show you how to use SignalWire's List Calls API to gain valuable insight into your usage of voice on SignalWire's platform. After running this script, you gain both itemized and bird's eye views on all of the details of your voice usage, including: - [Listing Calls to CSV](https://developer.signalwire.com/compatibility-api/guides/voice/python/list-calls-to-csv-all-languages.md): These snippets show how you can use SignalWire's API to filter the calls in your project by a number of parameters and then insert the call data into a CSV for your own record keeping. - [MultiChannel Banking Helper - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/python-multichannel-banking-helper.md): This application will allow customers to check balance as well as obtain the due date for credit card payments via both voice and SMS. - [Survey with Google Sheets Reporting - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/python-survey-with-google-sheets.md): This code will show you how you can use the very simple google sheets API instead of a database to store the results of a phone survey designed in Python. In this demo, we will show how it could be used to create a COVID19 health survey that will gather and append the call SID, from number, to number, and the answers to each question to our google sheet. Before we review and explain the code needed for this task, we first need to set up our Google Sheet as well as the Google Cloud Platform. Don't worry, it's easier than you think! - [Request Callback in a Queue - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/request-callback-in-a-queue.md): In a past blog, we talked about the importance of having a concise phone menu so that customers don't have to wait through your IVR in order to resolve an issue. But what happens if a lot of customers call at once, making long hold and wait times that may make your customers aggravated as they stay on the line for extended periods of time? Have your customers keep their sanity while avoiding long hold times by offering a callback option. Using the SignalWire Python SDK, customers can call and request a call back by pressing a digit, or they can text message the number and request a call back when the next agent is available. - [Sentiment Analysis - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/sentiment-analysis.md): This guide will show you how to easily identify the sentiment and emotion of a call. This is good for POST analysis or with some simple modification, it can be used in real-time to route the caller actively. - [SIP Voicemail](https://developer.signalwire.com/compatibility-api/guides/voice/python/sip-voicemail.md): Having voicemail available is an important part of any phone system, and calls to SIP endpoints - [Two Factor Authentication for Voice - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/two-factor-authentication.md): By adding 2FA to your application, you can provide your users effective protection against many security threats that target user passwords and accounts. It will generate a One-Time Password to their phone number via voice call. Application developers can enable two-factor authentication for their users with ease and without making any changes to the already existing application logic or database structure! This guide uses the Python SignalWire SDK to show an example of how that can be done! - [Updating Conference Recordings in SignalWire](https://developer.signalwire.com/compatibility-api/guides/voice/python/updating-conference-recordings.md): Overview - [Capture Audio with Websockets and Call Streams](https://developer.signalwire.com/compatibility-api/guides/voice/python/utilizing-websockets-and-call-streams.md): This guide will use `` and websockets to receive base64 audio, which can be written to an audio file for storage, playback, or further manipulation such as transcription services. This guide will focus on taking inbound and outbound audio tracks from a call and saving them to a Wave file. - [Exporting Voice API Statistics to a PDF](https://developer.signalwire.com/compatibility-api/guides/voice/python/voice-api-statistics-to-pdf.md): Overview - [Status Callbacks](https://developer.signalwire.com/compatibility-api/guides/voice/python/voice-status-callbacks.md): You can learn more about voice status callbacks, all of the possible parameters you can use, and how to set them up in our status callback mega guide! - [Forwarding Voicemail Transcriptions to Email - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/voicemail-transcription.md): This guide will show how you can easily take a voicemail message from incoming callers, transcribe the recording, and email the transcription. We will use the SignalWire Python SDK to record a voicemail and transcribe it along with the MailGun API to send an email. - [Ruby Guides](https://developer.signalwire.com/compatibility-api/guides/voice/ruby.md): A collection of guides utilizing the Ruby Compatibility API SDK. - [Answering Machine Detection - Ruby](https://developer.signalwire.com/compatibility-api/guides/voice/ruby/answering-machine-detection.md): This guide utilizes the Answering Machine Detection feature to determine whether a human or voicemail machine has answered the call. This allows your program to determine whether to dial a number to connect someone to the human or leave a message for the voicemail box. - [Multi Factor Authentication for Voice - Ruby](https://developer.signalwire.com/compatibility-api/guides/voice/ruby/multi-factor-authentication.md): Multi-factor authentication (MFA) is used to authenticate users of an application through the use of a secret token that is sent to them over SMS text or a voice call. It is commonly used for logging in to secure systems, but it is also gaining popularity as an one-time password (OTP) mechanism to authorize transactions or to sign documents and contracts. - [Appointment Reminders Calls with Sinatra - Ruby](https://developer.signalwire.com/compatibility-api/guides/voice/ruby/ruby-reminder-calls.md): This application demonstrates how easy it is to place a call, accepting both DTMF and text input, and using SignalWire's advanced TTS capabilities to speak dates and times in the correct way. If the user changes their appointment to one of the slots we offer, we will also send them a reminder SMS. - [Libraries and SDKs](https://developer.signalwire.com/compatibility-api/sdks.md): SignalWire has clients in a number of different languages that make using the SignalWire Compatibility API possible with your existing application. They are also built to make migrating from other service providers to SignalWire quick and easy. ## fax - [Fax](https://developer.signalwire.com/fax.md): Programmable Fax in the cloud - [Getting Started with Fax](https://developer.signalwire.com/fax/get-started.md): Learn how to get started with Fax. - [Common Fax Errors](https://developer.signalwire.com/fax/getting-started/common-fax-errors.md): Our guide to understanding and troubleshooting the most common fax error messages. - [Forwarding Inbound Faxes to Email](https://developer.signalwire.com/fax/getting-started/fax-to-email.md): This short and simple guide will show how you can use the SignalWire Python SDK and the MailGun API in order to forward your incoming SignalWire faxes to email. You can easily bridge this older technology by allowing faxes to be delivered to your inbox with only a few lines of code. - [Retrying Failed Faxes](https://developer.signalwire.com/fax/getting-started/fax-with-retries.md): Example application that sends Faxes, and retries if it fails - [Filtering Faxes by Number, Status, and Date](https://developer.signalwire.com/fax/getting-started/filter-faxes-by-number-status-and-date.md): Find out any problems sending/receiving faxes, and get the necessary information our Support will need to assist you! - [Sending and Receiving Fax](https://developer.signalwire.com/fax/getting-started/first-steps-with-fax.md): It's easy to start sending and receiving Fax using SignalWire's APIs! You will need at least one number to send and receive faxes, so if you don't have one already, please follow the instructions below. - [Listing Faxes to CSV](https://developer.signalwire.com/fax/getting-started/list-faxes-to-csv-in-all-languages.md): These snippets show how you can use SignalWire's Compatibility API to filter the faxes in your project by a number of parameters and then insert the fax data into a CSV for your own record keeping. - [Callback for Inbound Fax](https://developer.signalwire.com/fax/getting-started/securing-callback-for-inbound-fax-with-cxml.md): Learn how to secure your callback for a inbound fax ## guides - [SignalWire Guide Showcase](https://developer.signalwire.com/guides.md) ## home - [Voice](https://developer.signalwire.com/home/calling/voice/getting-started.md): Get started - [Voice Guides](https://developer.signalwire.com/home/calling/voice/guides.md): General Guides - [Messaging Guides](https://developer.signalwire.com/home/messaging/sms/guides.md) - [Administration](https://developer.signalwire.com/home/platform/dashboard/administration.md): The SignalWire Dashboard - [Versioning](https://developer.signalwire.com/home/tools/call-flow-builder/version.md): Call Flow Builder ## messaging - [Messaging](https://developer.signalwire.com/messaging.md): Integrate powerful, programmable, high-throughput SMS and MMS with SignalWire APIs, SDKs, and no-code application builders - [Messaging FAQs](https://developer.signalwire.com/messaging/faq.md): 1. Create a Brand. - [Getting Started with Messaging](https://developer.signalwire.com/messaging/get-started.md): Learn how to get started with the SignalWire Messaging API. - [The Campaign Registry](https://developer.signalwire.com/messaging/get-started/campaign-registry.md): Learn all about the Campaign Registry and how it affects you. - [Campaign Service Providers (CSPs)](https://developer.signalwire.com/messaging/getting-started/campaign-registry/campaign-service-providers.md): Learn more about how to register your 10 DLC Messaging traffic by working with The Campaign Registry directly. - [Frequently Asked Questions](https://developer.signalwire.com/messaging/getting-started/campaign-registry/faq.md): The Campaign Registry - [Pricing](https://developer.signalwire.com/messaging/getting-started/campaign-registry/pricing.md): The Campaign Registry - [Registration](https://developer.signalwire.com/messaging/getting-started/campaign-registry/registration.md): The Campaign Registry - [Troubleshooting Messaging Issues](https://developer.signalwire.com/messaging/getting-started/how-to-troubleshoot-common-messaging-issues.md): Messaging is an ever-changing ecosystem, and resolving issues can be tricky. - [Introduction](https://developer.signalwire.com/messaging/getting-started/platform-free-trial.md): Test SignalWire's messaging APIs before registering with The Campaign Registry. - [Receiving your first SMS](https://developer.signalwire.com/messaging/getting-started/receiving-your-first-sms.md): Learn how to receive your first SMS. - [Sending Your First SMS](https://developer.signalwire.com/messaging/getting-started/sending-your-first-sms.md): Let's get you started by sending your first SMS. In this guide we are going to - [SMS Best Practices for Improved Delivery Rates](https://developer.signalwire.com/messaging/getting-started/sms-best-practices-how-to-ensure-message-delivery.md): The best way to ensure that your messages reach their intended audience is to follow these rules. - [The Campaign Registry Guides](https://developer.signalwire.com/messaging/guides/campaign-registry.md): This section contains guides for interacting with the Campaign Registry API. - [General Messaging Guides](https://developer.signalwire.com/messaging/guides/general.md): This section contains general guides for the SignalWire Messaging API. - [Private URL Shortener](https://developer.signalwire.com/messaging/guides/general/how-to-build-a-private-url-shortener.md): Code example of a private URL shortener in python - [Finding Unregistered Numbers in a Project](https://developer.signalwire.com/messaging/guides/general/how-to-find-unregistered-numbers-on-your-project.md): A script to compare all the numbers in your project with a CSV of registered numbers. - [Messaging Character Limits](https://developer.signalwire.com/messaging/guides/general/messaging-character-limits.md): An overview of how message segments are measured and priced. - [Messaging MIME Types](https://developer.signalwire.com/messaging/guides/general/messaging-mime-types.md): To send MMS, you must include a media attachment. The content-type header must have an accepted content type, or SignalWire will have to reject the request. - [Toll-free verification](https://developer.signalwire.com/messaging/guides/general/toll-free-number-overview.md): Overview of Toll-Free number verification process. ## platform - [Platform](https://developer.signalwire.com/platform.md): The SignalWire platform. - [Platform Basics](https://developer.signalwire.com/platform/basics.md): Platform Basics Overview - [General Knowledge](https://developer.signalwire.com/platform/basics/general.md): Platform basics - [Rate limits](https://developer.signalwire.com/platform/basics/general/signalwire-rate-limits.md): Platform basics - [STIR/ SHAKEN - All you need to know](https://developer.signalwire.com/platform/basics/general/stir-shaken-all-you-need-to-know.md): Since its inception, spammers, spoofers, and supervillains have attacked the telephony industry. STIR/SHAKEN is a protocol that aims to solve this problem through caller verification. Read along to find out what STIR/SHAKEN is and SignalWire's part in this all. - [STUN vs. TURN vs. ICE](https://developer.signalwire.com/platform/basics/general/stun-vs-turn-vs-ice.md): Platform basics - [SIP (Session Initiation Protocol)](https://developer.signalwire.com/platform/basics/general/what-is-sip.md): Platform basics - [WebRTC](https://developer.signalwire.com/platform/basics/general/what-is-webrtc.md): A deep dive into Real-Time Communication - [Guides](https://developer.signalwire.com/platform/basics/guides.md): Overview - [Getting Started Without Code](https://developer.signalwire.com/platform/basics/guides/getting-started-without-code.md): Learn how to get started with SignalWire without writing any code. - [Sending API Requests through Postman](https://developer.signalwire.com/platform/basics/guides/how-to-test-api-requests-on-postman.md): Overview - [Technical Troubleshooting](https://developer.signalwire.com/platform/basics/guides/technical-troubleshooting.md): Overview - [Common Webhook Errors](https://developer.signalwire.com/platform/basics/guides/technical-troubleshooting/common-webhook-errors.md): Below are some examples of common errors that you might encounter when using webhooks. If you are unable to resolve your issue, you can always reach out to our Support Team and provide them with a resource SID so that they can locate the call/message record and offer assistance. - [Creating a Publicly Exposed Webhook with Pyngrok](https://developer.signalwire.com/platform/basics/guides/technical-troubleshooting/creating-a-publically-exposed-webhook.md): Through ngrok and Flask, we will learn how to turn our backend application into a webhook that can be executed by our SignalWire phone number once a given action is triggered. - [Locally Test Webhooks with Ngrok](https://developer.signalwire.com/platform/basics/guides/technical-troubleshooting/how-to-test-webhooks-with-ngrok.md): SignalWire offers cXML applications as a way to host very simple code without the use of a server. However, what if you want to use more complex code or integrate with other applications/databases? In that case, you would need to write a script using the SignalWire SDK, host it on a server, and use that as the webhook for handling calls or messages. - [WebRTC with SIP Over WebSockets](https://developer.signalwire.com/platform/basics/guides/webrtc-with-sip-over-websockets.md): SignalWire supports industry-standard WebRTC SIP over WebSockets! This means that you can use off-the-shelf JavaScript libraries with SIP to connect to SignalWire services. - [Security and Compliance](https://developer.signalwire.com/platform/basics/security-and-compliance.md): Security and Compliance - [What is Considered Fraud?](https://developer.signalwire.com/platform/basics/security-and-compliance/fraud.md): Defining fraud in a SignalWire context and what to expect if your account is flagged for fraudulent activity. - [HIPAA/PCI Compliance on SignalWire](https://developer.signalwire.com/platform/basics/security-and-compliance/hipaapci-compliance.md): Overview - [Webhook Security](https://developer.signalwire.com/platform/basics/security-and-compliance/webhook-security.md): When building an application with SignalWire services, you are very likely to use webhooks to exchange information with SignalWire. A webhook is an HTTP(S) request sent to your web application when a key event has occurred, such as an inbound call, inbound message, or a status change. This allows SignalWire to query your web application in order for instructions on what to do next. For example, you might use a webhook to handle an inbound call by reading the instructions in your webhook to play an IVR, route the customer to the right department, and connect them with an agent. You could also use a webhook as a status callback where each status change of a call or message is sent to your web application which might store some instructions for handling emergent errors. - [What is Call Fabric?](https://developer.signalwire.com/platform/call-fabric.md): Learn about Call Fabric, SignalWire's innovative solution designed to unify various communication technologies under one umbrella. - [Addresses](https://developer.signalwire.com/platform/call-fabric/addresses.md) - [Resources](https://developer.signalwire.com/platform/call-fabric/resources.md): Learn about Resources on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [AI Agents](https://developer.signalwire.com/platform/call-fabric/resources/ai-agents.md): Learn about the Subscriber Resource on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [cXML Scripts](https://developer.signalwire.com/platform/call-fabric/resources/cxml-scripts.md): Learn about the Subscriber Resource on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [Dialogflow Agent](https://developer.signalwire.com/platform/call-fabric/resources/dialogflow-agents.md): Learn about the Subscriber Resource on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [FreeSWITCH Connectors](https://developer.signalwire.com/platform/call-fabric/resources/freeswitch-connectors.md): Learn about the Subscriber Resource on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [Relay Applications](https://developer.signalwire.com/platform/call-fabric/resources/relay-applications.md): Learn about the Subscriber Resource on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [SIP Gateways](https://developer.signalwire.com/platform/call-fabric/resources/sip-gateways.md): Learn about the SIP Gateway Resource on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [Subscribers](https://developer.signalwire.com/platform/call-fabric/resources/subscribers.md): Learn about the Subscriber Resource on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [SWML Scripts](https://developer.signalwire.com/platform/call-fabric/resources/swml-scripts.md): Learn about the SWML Script Resource on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [Video Rooms](https://developer.signalwire.com/platform/call-fabric/resources/video-rooms.md): Learn about the Subscriber Resource on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. - [Subscribers overview](https://developer.signalwire.com/platform/call-fabric/subscribers.md): Comprehensive overview of SignalWire Call Fabric Subscribers - the building blocks of Programmable Unified Communications for user management and onboarding. - [Dashboard](https://developer.signalwire.com/platform/dashboard.md): The SignalWire Dashboard. - [Navigate the Dashboard](https://developer.signalwire.com/platform/dashboard/get-started/explore.md): Explore your SignalWire Space. - [Phone Numbers](https://developer.signalwire.com/platform/dashboard/get-started/phone-numbers.md): Manage your SignalWire phone numbers - [Create an account](https://developer.signalwire.com/platform/dashboard/getting-started/signing-up-for-a-space.md): Open a new Space, or user account, on the SignalWire platform. - [API credentials](https://developer.signalwire.com/platform/dashboard/getting-started/your-signalwire-api-space.md): Learn how to access your SignalWire API Space. - [Change settings](https://developer.signalwire.com/platform/dashboard/guides/changing-settings-in-your-signalwire-space.md): Change a SignalWire Space URL or SignalWire Space name - [Close an account](https://developer.signalwire.com/platform/dashboard/guides/closing-a-signalwire-account.md): This guide presents the steps needed for how a customer can close their account by contacting us through a ticket. - [Multi-factor authentication](https://developer.signalwire.com/platform/dashboard/guides/enabling-2famulti-factor-authentication.md): The Multi-Factor Authentication setting can be enabled via your SignalWire Space Dashboard at the User level. - [Export logs from your SignalWire Space](https://developer.signalwire.com/platform/dashboard/guides/export-logs-from-your-signalwire-space.md): SignalWire provides a way to download logs in CSV format from your SignalWire Space. This is useful for when you are troubleshooting an issue, - [International support](https://developer.signalwire.com/platform/dashboard/guides/how-to-enable-international-outbound-dialing-sms.md): Step by step guide for how to enable International Outbound Dialing & SMS on a SignalWire Space - [Increase Space limits](https://developer.signalwire.com/platform/dashboard/guides/how-to-request-an-increase-to-your-signalwire-space-limits.md): Use this process to request an increase to a Space's Daily Top-up, Projects per Space, numbers per Project, Verified IDs per Project, Call backlog, or Message backlog - [Common issues](https://developer.signalwire.com/platform/dashboard/guides/how-to-set-auto-top-up-by-credit-card.md): This guide will show the steps to set up auto top up and how to resolve common credit card rejection errors. - [Create a subproject](https://developer.signalwire.com/platform/dashboard/guides/subprojects.md): A guide to creating subprojects in SignalWire Space. - [Suspended Spaces](https://developer.signalwire.com/platform/dashboard/guides/suspended-signalwire-cloud-space.md): Why a SignalWire Space is suspended and process for reactivating. - [Trial mode](https://developer.signalwire.com/platform/dashboard/guides/trial-mode.md): Every SignalWire account, when it is first created, is in trial mode. That means there are some limitations, to protect our services from potential abuse, and our new users from causing extensive issues. - [User management](https://developer.signalwire.com/platform/dashboard/guides/user-management.md): Adding new users for access to your SignalWire Space is quick and easy through your SignalWire Space dashboard. - [What is an SID?](https://developer.signalwire.com/platform/dashboard/guides/what-is-a-sid.md): Learn about a SignalWire ID below! - [Integrations](https://developer.signalwire.com/platform/integrations.md): Integrations - [Carriers Integrations](https://developer.signalwire.com/platform/integrations/carriers.md): This section contains guides for using carriers integrations with SignalWire. - [ThinQ](https://developer.signalwire.com/platform/integrations/carriers/thinq.md): SignalWire allows you to easily integrate with your existing providers via SIP as a Bring Your Own Carrier (BYOC). - [CRM Integrations](https://developer.signalwire.com/platform/integrations/crm.md): This section contains guides for using CRM integrations with SignalWire. - [Zoho CRM Click-to-Call](https://developer.signalwire.com/platform/integrations/crm/zoho-crm-click-to-call.md): Overview - [Dialogflow Integration](https://developer.signalwire.com/platform/integrations/dialogflow.md): This section contains guides for using Dialogflow with SignalWire. - [Integrating with Dialogflow Agents](https://developer.signalwire.com/platform/integrations/dialogflow/dialogflow-agents.md): A step by step tutorial on how to use Dialogflow to build out an interactive IVR that is backed by Google's Conversational AI - [Caller ID & Sending SMS via Dialogflow](https://developer.signalwire.com/platform/integrations/dialogflow/dialogflow-using-nodejs-to-get-caller-id-send-sms.md): How to use nodeJS to get the caller ID information using the DialogFlow fulfillment libraries and how to send SMS using nodeJS - [FreeSWITCH Guides](https://developer.signalwire.com/platform/integrations/freeswitch.md): Learn how to use FreeSWITCH with SignalWire. - [Adding AI Capabilities to FreeSWITCH](https://developer.signalwire.com/platform/integrations/freeswitch/add-ai-to-freeswitch.md): Learn how to add an AI agent to your FreeSWITCH instance to handle your calls. - [Choosing a FreeSWITCH Repository](https://developer.signalwire.com/platform/integrations/freeswitch/choosing-a-freeswitch-repository.md): Learn which FreeSWITCH repository is right for you between the Public and Advantage repositories. - [Backtracing From a Core Dump](https://developer.signalwire.com/platform/integrations/freeswitch/freeswitch-crash-getting-a-backtrace-from-a-core-dump.md): The first command you need is to install some needed tools for gdb to do the backtracing, curl to upload the backtrace log, and debug symbols for FreeSWITCH. You may need to install other debug symbols if you have any custom libraries in use. - [FreeSWITCH Memory Address and Memory Pool Sanitizer](https://developer.signalwire.com/platform/integrations/freeswitch/freeswitch-memory-address-and-memory-pool-sanitizer.md): Customers who are subscribed to FreeSWITCH Advantage may request access to an alternate repository that contains special FreeSWITCH packages with memory address and pool sanitation built-in. These special packages may help flush out otherwise difficult-to-find memory corruption issues, more commonly discovered while using advanced ESL techniques. Contact your sales manager for access inquiries. You will not be able to access this repository without proper permission. - [Clean and Reconfigure with mod_signalwire](https://developer.signalwire.com/platform/integrations/freeswitch/how-to-mod_signalwire-in-freeswitch-clean-and-reconfigure.md): When using FreeSWITCH modsignalwire, these commands can be used to unload modsignalwire, discard current Connector configs, and obtain a new Token. - [Installing FreeSWITCH or FreeSWITCH Advantage](https://developer.signalwire.com/platform/integrations/freeswitch/installing-freeswitch-or-freeswitch-advantage.md): Learn how to install FreeSWITCH or FreeSWITCH Advantage on your system. - [Sending an SMS from FreeSWITCH XML Dialplan](https://developer.signalwire.com/platform/integrations/freeswitch/sending-an-sms-from-freeswitch-xml-dialplan-through-signalwire-cloud.md): In order to send an SMS from a FreeSWITCH dialplan extension, we need to do a few things: - [Messaging Service Integrations](https://developer.signalwire.com/platform/integrations/messaging-services.md): This section contains guides for using messaging service integrations with SignalWire. - [Textable App](https://developer.signalwire.com/platform/integrations/messaging-services/textable.md): A step by step tutorial on how to link Textable and your SignalWire Space - [TextIt](https://developer.signalwire.com/platform/integrations/messaging-services/textit.md): A quick and easy step-by-step guide to link SignalWire to the chatbot platform TextIt! - [PBX Systems Integrations](https://developer.signalwire.com/platform/integrations/pbx-systems.md): These guides are designed to help you integrate SignalWire with your favorite PBX systems. - [FusionPBX](https://developer.signalwire.com/platform/integrations/pbx-systems/connect-fusionpbx-with-signalwire.md): FusionPBX is a FreeSWITCH-based multi-tenant PBX that provides a robust set of features for business phone systems. Using SignalWire services with FusionPBX allows you to leverage our high call quality and low rates. - [chan_sip FreePBX](https://developer.signalwire.com/platform/integrations/pbx-systems/set-up-chan_sip-freepbx-with-signalwire.md): Taking advantage of SignalWire’s extremely disruptive pricing for DIDs and minutes with FreePBX on chan_sip is super easy! - [FreePBX](https://developer.signalwire.com/platform/integrations/pbx-systems/set-up-freepbx-with-signalwire.md): Using FreePBX and taking advantage of SignalWire’s disruptive pricing on DIDs and voice minutes is almost too easy. - [Serverless Functions](https://developer.signalwire.com/platform/integrations/serverless-functions.md): This section contains guides for using serverless functions with SignalWire. - [Google Cloud Functions](https://developer.signalwire.com/platform/integrations/serverless-functions/google-cloud-functions.md): This quick guide aims to provide a way to deploy a [SignalWire](https://signalwire.com) XML application to [Google Cloud Functions](https://cloud.google.com/functions). - [Microsoft Azure Functions](https://developer.signalwire.com/platform/integrations/serverless-functions/microsoft-azure-functions.md): This guide explains how to leverage the SignalWire Compatibility API and the Node.Js SDK in Azure Function Apps. - [Softphone Integrations](https://developer.signalwire.com/platform/integrations/softphones.md): These guides are designed to help you integrate SignalWire with your favorite softphone. - [3CX Softphone](https://developer.signalwire.com/platform/integrations/softphones/connect-signalwire-with-3cx.md): Using SignalWire and 3CX for SIP - [Linphone](https://developer.signalwire.com/platform/integrations/softphones/connect-signalwire-with-linphone.md): Using SignalWire and Linphone Softphone for SIP - [MicroSIP Softphone](https://developer.signalwire.com/platform/integrations/softphones/microsip-softphone.md): Overview - [Bria SoftPhone](https://developer.signalwire.com/platform/integrations/softphones/set-up-bria-softphone-with-signalwire.md): Bria Mobile is a popular softphone app that works very well with SignalWire! Here are the steps to get started with connecting to Bria Mobile. - [Zoiper Softphone](https://developer.signalwire.com/platform/integrations/softphones/set-up-zoiper-softphone-with-signalwire.md): Zoiper is a popular desktop softphone app used to make/receive calls! Follow this guide to set up Zoiper with SignalWire. - [Workflow Tools Integrations](https://developer.signalwire.com/platform/integrations/workflow-tools.md): These guides are designed to help you integrate SignalWire with your favorite workflow tools. - [Integromat](https://developer.signalwire.com/platform/integrations/workflow-tools/how-to-integrate-signalwire-into-integromat.md): What is Integromat? - [Zapier Integration Guides](https://developer.signalwire.com/platform/integrations/workflow-tools/zapier.md): This section contains guides for using Zapier with SignalWire. - [Creating a Zapier Zap](https://developer.signalwire.com/platform/integrations/workflow-tools/zapier/creating-a-zapier-zap.md): This article explains the step-by-step instructions on how to use Zapier to create a Zap that functions the same in SignalWire as a cXML application. - [Zapier Webhooks](https://developer.signalwire.com/platform/integrations/workflow-tools/zapier/how-to-use-zapier-webhooks.md): Why do you need it? - [Numbers Overview](https://developer.signalwire.com/platform/phone-numbers.md): Phone Numbers - [Getting Started with Phone Numbers](https://developer.signalwire.com/platform/phone-numbers/getting-started.md): This section contains guides for getting started with phone numbers on the SignalWire platform. - [Buying a Phone Number](https://developer.signalwire.com/platform/phone-numbers/getting-started/buying-a-phone-number.md): No matter what you want to do, you're going to need a phone number to use! This guide will get you set up with your first SignalWire phone number. - [E911](https://developer.signalwire.com/platform/phone-numbers/getting-started/e911.md): What is E911? - [Porting Into SignalWire](https://developer.signalwire.com/platform/phone-numbers/getting-started/porting-into-signalwire.md): After becoming more familiar with our services, you may decide to port over your existing phone numbers to SignalWire. - [What is E164?](https://developer.signalwire.com/platform/phone-numbers/getting-started/what-is-e164.md): An introduction to what E164 format is. - [Phone Numbers Guides](https://developer.signalwire.com/platform/phone-numbers/guides.md): Phone Numbers Guides - [Verified Caller ID](https://developer.signalwire.com/platform/phone-numbers/guides/caller-id.md): Verified Caller ID vs. SignalWire Phone Number - [Webhooks Overview](https://developer.signalwire.com/platform/phone-numbers/guides/how-to-configure-your-webhook.md): An introduction to using webhooks to receive information and events about calls and messages. - [Number Groups](https://developer.signalwire.com/platform/phone-numbers/guides/number-groups.md): Number Groups let you pool phone numbers that can act as one entity. - [Porting Out of SignalWire](https://developer.signalwire.com/platform/phone-numbers/guides/porting-out-of-signalwire.md): Information about porting a phone number out of SignalWire. - [Releasing Numbers](https://developer.signalwire.com/platform/phone-numbers/guides/releasing-dids.md): Information about releasing numbers on your SignalWire Dashboard. - [Transferring Numbers](https://developer.signalwire.com/platform/phone-numbers/guides/transferring-dids.md): Transferring Phone Numbers to a Different Project in Your SignalWire Space ## sdks - [SDKs Technical Reference](https://developer.signalwire.com/sdks.md): SignalWire offers a range of SDKs to help you build applications using the SignalWire platform. - [Understanding Alpha and Beta Releases](https://developer.signalwire.com/sdks/overview/sdk-releases.md): What are Alpha and Beta Releases? - [What is RELAY?](https://developer.signalwire.com/sdks/overview/what-is-relay.md): RELAY is the next generation of interactive communication APIs available at SignalWire. It is a new, real-time web service protocol that provides for persistent, asynchronous connections to the SignalWire network. ### agents-sdk Quickly and precisely filter all SignalWire Guides using the Product, SDK, and Language tags below. Switch the toggle to **AND** to narrow down the resources that match all of your selected criteria for focused results. Set it to **OR** to expand your search and explore resources that meet any combination of your chosen tags. #### Filters 132 guides \[ ]ANDOR Clear Filters #### Product * [ ] AI [Overview](https://developer.signalwire.com/swml/methods/ai.md) * [ ] Voice [Overview](https://developer.signalwire.com/voice.md) * [ ] Messaging [Overview](https://developer.signalwire.com/messaging.md) * [ ] Chat [Overview](https://developer.signalwire.com/chat.md) * [ ] Video [Overview](https://developer.signalwire.com/video.md) * [ ] Fax [Overview](https://developer.signalwire.com/fax.md) * [ ] Numbers [Overview](https://developer.signalwire.com/platform/phone-numbers.md) * [ ] SignalWire Space [Overview](https://developer.signalwire.com/platform/dashboard.md) * [ ] FreeSWITCH [Overview](https://developer.signalwire.com/platform/integrations/freeswitch.md) #### SDKs * [ ] SWML [Reference](https://developer.signalwire.com/swml.md) * [ ] Relay Realtime SDK [Reference](https://developer.signalwire.com/sdks/realtime-sdk/.md) * [ ] Relay Browser SDK [Reference](https://developer.signalwire.com/sdks/browser-sdk/.md) * [ ] Compatibility-API [Reference](https://developer.signalwire.com/compatibility-api.md) #### Languages * [ ] JavaScript * [ ] Node.js * [ ] C#/.Net * [ ] PHP * [ ] Ruby * [ ] Python Search for a guide by name... ## Our Favorites * #### [Best Practices for Creating a SignalWire AI Agent](https://developer.signalwire.com/swml/guides/ai/best-practices.md) This guide offers a detailed overview of best practices to make sure your SignalWire Agent operates effectively. * getting started * favorite * swml * ai * voice * #### [Adding AI Capabilities to FreeSWITCH](https://developer.signalwire.com/platform/integrations/freeswitch/add-ai-to-freeswitch.md) Learn how to add an AI agent to your FreeSWITCH instance to handle your calls. * freeswitch * favorite * ai * voice * #### [Call whisper](https://developer.signalwire.com/swml/guides/call-whisper.md) A guide that shows you how to perform a Call Whisper using SWML. * favorite * swml * voice * #### [Create an IVR with SWML](https://developer.signalwire.com/swml/guides/creating_ivr.md) Learn how to create an IVR with SWML. * favorite * swml * voice * #### [Executing SWML from a SWAIG function](https://developer.signalwire.com/swml/guides/ai/executing_swml.md) Learn how to execute SWML from a SWAIG function. * favorite * swml * ai * voice * #### [Use \`set\_meta\_data\`](https://developer.signalwire.com/swml/guides/ai/set_meta_data.md) Learn how to use \`set\_meta\_data\` to store metadata to reference later. * favorite * swml * ai * voice * #### [Using context\_switch](https://developer.signalwire.com/swml/guides/ai/context_switch.md) Learn how to use \`context\_switch\` to shift the focus of the conversation. * favorite * swml * ai * voice *** ## AI[​](#ai "Direct link to ai")
### SWML[​](#ai-swml "Direct link to ai-swml")
* #### [Best Practices for Creating a SignalWire AI Agent](https://developer.signalwire.com/swml/guides/ai/best-practices.md) This guide offers a detailed overview of best practices to make sure your SignalWire Agent operates effectively. * getting started * favorite * swml * ai * voice * #### [Executing SWML from a SWAIG function](https://developer.signalwire.com/swml/guides/ai/executing_swml.md) Learn how to execute SWML from a SWAIG function. * favorite * swml * ai * voice * #### [Use \`set\_meta\_data\`](https://developer.signalwire.com/swml/guides/ai/set_meta_data.md) Learn how to use \`set\_meta\_data\` to store metadata to reference later. * favorite * swml * ai * voice * #### [Using context\_switch](https://developer.signalwire.com/swml/guides/ai/context_switch.md) Learn how to use \`context\_switch\` to shift the focus of the conversation. * favorite * swml * ai * voice * #### [Creating a Voicemail Bot](https://developer.signalwire.com/swml/guides/ai/voicemail_bot_example.md) Learn how to create a voicemail bot using SWML. * swml * ai * voice * #### [Holiday Special - Creating a Santa AI with SWML](https://developer.signalwire.com/swml/guides/ai/holiday_special_santa_ai.md) The Santa AI we'll build together communicates with users over the phone in spoken natural language, powered by OpenAI and Eleven Labs' Text-To-Speech engine, to determine what they want for Christmas. Santa then uses the Real-Time Amazon Data API to search for the top three gifts based on their wishes. Once the user chooses their favorite gift, the Santa AI sends an SMS to the user with a link to the chosen gift. * swml * ai * voice * #### [Understanding \`data\_map\` in SWML SWAIG Functions](https://developer.signalwire.com/swml/guides/ai/swaig/functions/data_map.md) Learn how to use \`data\_map\` in SWML SWAIG functions to process, transform, and utilize incoming data effectively. * swml * ai * voice * #### [Using toggle\_functions](https://developer.signalwire.com/swml/guides/ai/toggle_functions.md) Learn how to use \`toggle\_functions\` to toggle functions on and off. * swml * ai * voice *** ## Voice[​](#voice "Direct link to voice")
* #### [Set up a SIP Endpoint](https://developer.signalwire.com/voice/sip/get-started.md) Create a SIP endpoint, register it to a SignalWire phone number for handling incoming calls, or dial it with SignalWire. * voice * getting started * #### [SIP Domain Applications](https://developer.signalwire.com/voice/getting-started/sip/sip-domain-applications.md) This application will generate a one-time password sent to the recipient's phone number via SMS. Application developers can enable two-factor authentication for their users with ease and without making any changes to the existing application logic or database structure! * voice * video * getting started * #### [SIP trunking](https://developer.signalwire.com/voice/getting-started/sip/sip-trunking.md) import UiAccordion from '/docs/main/common/dashboard/ui-accordion.mdx'; import ResourceAdmonition from '/docs/main/common/dashboard/resource-admonition.mdx' * voice * getting started * video * freeswitch * #### [Bring your own carrier](https://developer.signalwire.com/voice/getting-started/sip/sip-byoc-bring-your-own-carrier.md) Bring Your Own Carrier (BYOC) allows SignalWire users to retain their own carriers for connectivity instead of the vendors that we partner with. This allows you to use any carrier you want while still utilizing the \*\*powerful programmatic control\*\* for SIP from SignalWire! * voice * freeswitch * #### [WebRTC](https://developer.signalwire.com/platform/basics/general/what-is-webrtc.md) A deep dive into Real-Time Communication * voice * video * #### [WebRTC with SIP Over WebSockets](https://developer.signalwire.com/platform/basics/guides/webrtc-with-sip-over-websockets.md) SignalWire supports industry-standard WebRTC SIP over WebSockets! This means that you can use off-the-shelf JavaScript libraries with SIP to connect to SignalWire services. * voice * video ### SWML[​](#voice-swml "Direct link to voice-swml")
* #### [Call whisper](https://developer.signalwire.com/swml/guides/call-whisper.md) A guide that shows you how to perform a Call Whisper using SWML. * favorite * swml * voice * #### [Create an IVR with SWML](https://developer.signalwire.com/swml/guides/creating_ivr.md) Learn how to create an IVR with SWML. * favorite * swml * voice * #### [Handle incoming calls from code](https://developer.signalwire.com/swml/guides/remote_server.md) Learn how to handle incomming calls from a remote server using SWML. * swml * node.js * voice ### Relay Realtime SDK[​](#voice-relay-realtime-sdk "Direct link to voice-relay-realtime-sdk")
* #### [Making and Receiving Phone Calls](https://developer.signalwire.com/sdks/realtime-sdk/guides/voice/first-steps-with-voice.md) Learn how to get started with voice with the SignalWire Realtime SDK. * node.js * relay realtime sdk * voice * #### [Setting Up Voicemail](https://developer.signalwire.com/sdks/realtime-sdk/guides/voice/setting-up-voicemail.md) Learn how to record voicemails from your callers when you are unable to take the call. * relay realtime sdk * node.js * voice * #### [Weather Phone IVR](https://developer.signalwire.com/sdks/realtime-sdk/guides/voice/weather-phone.md) Learn how to build a weather phone IVR application with the SignalWire Realtime SDK. * relay realtime sdk * node.js * voice ### Compatibility-API[​](#voice-compatibility-api "Direct link to voice-compatibility-api")
* #### [Answering Machine Detection](https://developer.signalwire.com/compatibility-api/guides/voice/nodejs/answering-machine-detection.md) You can access the AMD feature with the Compatibility API which is designed to make migrating from other providers easy while giving you access to our next generation APIs and endpoints. Using the create a call endpoint, you can use the Machine Detection parameter to enable AMD or, by using the value, you can even listen for the end of a machine message. * node.js * compatibility-api * voice * #### [Answering Machine Detection - Ruby](https://developer.signalwire.com/compatibility-api/guides/voice/ruby/answering-machine-detection.md) This guide utilizes the Answering Machine Detection feature to determine whether a human or voicemail machine has answered the call. This allows your program to determine whether to dial a number to connect someone to the human or leave a message for the voicemail box. * ruby * compatibility-api * voice * #### [Appointment Reminders Calls with Sinatra - Ruby](https://developer.signalwire.com/compatibility-api/guides/voice/ruby/ruby-reminder-calls.md) This application demonstrates how easy it is to place a call, accepting both DTMF and text input, and using SignalWire's advanced TTS capabilities to speak dates and times in the correct way. If the user changes their appointment to one of the slots we offer, we will also send them a reminder SMS. * ruby * compatibility-api * voice * #### [Call Whisper](https://developer.signalwire.com/compatibility-api/guides/voice/general/setting-up-call-whispering-in-cxml.md) A call whisper allows the callee (receiver of the call) to receive an audio message before the call is connected and allows the callee to accept or reject the incoming call. The audio message can contain information such as the source or purpose of the call. * voice * compatibility-api * #### [Cancelling a Stream with the Update a Call API](https://developer.signalwire.com/compatibility-api/guides/voice/general/stopping-streams-with-rest-api.md) This guide will show you how to cancel a stream using the SignalWire Rest API. * python * compatibility-api * voice * #### [Capture Audio with Websockets and Call Streams](https://developer.signalwire.com/compatibility-api/guides/voice/python/utilizing-websockets-and-call-streams.md) This guide will use \`\` and websockets to receive base64 audio, which can be written to an audio file for storage, playback, or further manipulation such as transcription services. This guide will focus on taking inbound and outbound audio tracks from a call and saving them to a Wave file. * python * compatibility-api * voice * #### [Dial by Voice - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/dial-by-voice.md) This application will prompt the caller for a phone number via speech input and connect to the phone number recognized using ASR providing an additional level of accessibility to your users. * python * compatibility-api * voice * #### [Dynamic IVR using JSON Menus - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/dynamic-ivr-using-json-menus.md) This code will show you how you can use a JSON-defined menu in order to easily create an IVR Phone System with Python & Flask. We will be using the SignalWire Team as an example, but you can easily change the verbiage to fit your company's needs instead. Once you have modified this script to fit your company and point to the correct agents/departments, you only need to expose the script to the public and attach it as a webhook for handling inbound calls to one of your SignalWire DIDs. * python * compatibility-api * voice * #### [Execute Code during Business Hours Only - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/execute-code-in-business-hours-only.md) Using time intervals to perform a specific action depending on business hours. * python * compatibility-api * voice * #### [Exporting Voice API Statistics to a PDF](https://developer.signalwire.com/compatibility-api/guides/voice/python/voice-api-statistics-to-pdf.md) Have you ever wanted to gather Voice API usage data, but struggled to visualize your data while sorting through your call logs? Let's dive into a few statistical methods to help analyze the activity within your SignalWire Voice Space. * python * voice * compatibility-api * #### [Forwarding Voicemail Transcriptions to Email - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/voicemail-transcription.md) This guide will show how you can easily take a voicemail message from incoming callers, transcribe the recording, and email the transcription. We will use the SignalWire Python SDK to record a voicemail and transcribe it along with the MailGun API to send an email. * python * compatibility-api * voice * #### [Full Featured Call Center - JSON Menus & Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/full-contact-center.md) This guide demonstrates how to use SignalWire APIs to create a completely functional call center where the features are controlled by the JSON configuration file making it exceedingly easy to enable/disable features in minutes! The dynamic setup of the JSON menus adds a greater level of customizability to your IVR and makes modifying the structure on the fly a breeze. * python * compatibility-api * voice * #### [Gathering User Input from Code](https://developer.signalwire.com/compatibility-api/guides/voice/general/gathering-user-input-from-code.md) In Gathering User Input we showed how to set up an cXML application to collect input from users. The approach we showed had a limitation: we couldn't take choices based on the user's input. * voice * compatibility-api * python * php * node.js * #### [Getting Detailed Price Summaries about Calls](https://developer.signalwire.com/compatibility-api/guides/voice/python/getting-detailed-price-summaries-about-calls.md) This snippet will show how you can utilize the List Calls Endpoint to pull detailed call reports within a specific date range! The results will include some helpful summary stats about total calls, inbound vs outbound, total cost, and total duration. We will also export further detail on a per-call record basis to a CSV for record-keeping or extra review. * python * compatibility-api * voice * #### [Handling Calls from Code](https://developer.signalwire.com/compatibility-api/guides/voice/general/handling-calls-from-code.md) In Making and Receiving Phone Calls we learned how to use Compatibility XML bins to control outbound and inbound calls. In particular, we showed how to play a simple audio message. * python * php * node.js * compatibility-api * voice * #### [IVR with Voicemails Forwarded to Email - Node.js](https://developer.signalwire.com/compatibility-api/guides/voice/nodejs/ivr-with-voicemail-to-email.md) This advanced example builds an application that implements a simple phone tree IVR with a few interesting features, including: * node.js * compatibility-api * voice * #### [MultiChannel Banking Helper - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/python-multichannel-banking-helper.md) This application will allow customers to check balance as well as obtain the due date for credit card payments via both voice and SMS. * python * compatibility-api * voice * #### [Recording Phone Calls](https://developer.signalwire.com/compatibility-api/guides/voice/python/how-to-record-phone-calls.md) "This call may be recorded for quality assurance and training purposes". We've all heard it a million times! Call recording is one of the most common use cases in call centers, customer service lines, and even in your average small business. This guide will show how you can record both inbound and outbound calls with ease in a variety of different ways to suit your needs! * python * compatibility-api * voice * #### [Request Callback in a Queue - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/request-callback-in-a-queue.md) In a past blog, we talked about the importance of having a concise phone menu so that customers don't have to wait through your IVR in order to resolve an issue. But what happens if a lot of customers call at once, making long hold and wait times that may make your customers aggravated as they stay on the line for extended periods of time? Have your customers keep their sanity while avoiding long hold times by offering a callback option. Using the SignalWire Python SDK, customers can call and request a call back by pressing a digit, or they can text message the number and request a call back when the next agent is available. * python * compatibility-api * voice * #### [Screen Calls Based on a Block List - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/call-screening-block-list.md) This guide implements a call screening system based on the concept of a blocklist containing offending numbers. When a call comes in, the From number will be cross-checked with the block list to see if it is one of the blocked numbers. If so, the call will hang up. If the number is not in the block list, the call flow moves on to the next segment. * python * compatibility-api * voice * #### [Send an Outbound Survey - Node.js](https://developer.signalwire.com/compatibility-api/guides/voice/nodejs/outbound-survey.md) A telephone survey can be used to obtain useful information from users or customers, like a medical questionnaire for example. With SignalWire's NodeJS SDK, an application can be created to send an outbound call survey to English or Spanish speakers. * node.js * compatibility-api * voice * #### [Sentiment Analysis - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/sentiment-analysis.md) This guide will show you how to easily identify the sentiment and emotion of a call. This is good for POST analysis or with some simple modification, it can be used in real-time to route the caller actively. * python * compatibility-api * voice * #### [SIP Voicemail](https://developer.signalwire.com/compatibility-api/guides/voice/python/sip-voicemail.md) Having voicemail available is an important part of any phone system, and calls to SIP endpoints are no exception. There are a couple different ways to handle voicemails for SIP. You could use a Domain Application set up with two cXML application webhooks. The first would dial your SIP endpoint with a timeout parameter. The second would record a voicemail if the call was not answered within the timeout time. * python * compatibility-api * voice * #### [SIP Voicemail - Node.js](https://developer.signalwire.com/compatibility-api/guides/voice/nodejs/sip-voicemail.md) Set up Voicemail for your SIP endpoint. * node.js * compatibility-api * voice * #### [Status Callbacks](https://developer.signalwire.com/compatibility-api/guides/voice/python/voice-status-callbacks.md) You can learn more about voice status callbacks, all of the possible parameters you can use, and how to set them up in our status callback mega guide! * voice * compatibility-api * python * #### [Summarizing Voice Usage](https://developer.signalwire.com/compatibility-api/guides/voice/python/how-to-use-the-list-calls-api-to-get-statistics-python.md) In this snippet, we will show you how to use SignalWire's List Calls API to gain valuable insight into your usage of voice on SignalWire's platform. After running this script, you gain both itemized and bird's eye views on all of the details of your voice usage, including: * voice * compatibility-api * python * #### [Survey with Google Sheets Reporting - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/python-survey-with-google-sheets.md) This code will show you how you can use the very simple google sheets API instead of a database to store the results of a phone survey designed in Python. In this demo, we will show how it could be used to create a COVID19 health survey that will gather and append the call SID, from number, to number, and the answers to each question to our google sheet. Before we review and explain the code needed for this task, we first need to set up our Google Sheet as well as the Google Cloud Platform. Don't worry, it's easier than you think! * python * compatibility-api * voice * #### [ThinQ](https://developer.signalwire.com/platform/integrations/carriers/thinq.md) SignalWire allows you to easily integrate with your existing providers via SIP as a Bring Your Own Carrier (BYOC). thinQ is a voice API platform that can be integrated with SignalWire as BYOC. Follow the steps below to have inbound calls from thinQ routed to SignalWire as well as outbound calls from SignalWire routed to thinQ. * compatibility-api * ruby * voice * #### [Two Factor Authentication for Voice - Python](https://developer.signalwire.com/compatibility-api/guides/voice/python/two-factor-authentication.md) By adding 2FA to your application, you can provide your users effective protection against many security threats that target user passwords and accounts. It will generate a One-Time Password to their phone number via voice call. Application developers can enable two-factor authentication for their users with ease and without making any changes to the already existing application logic or database structure! This guide uses the Python SignalWire SDK to show an example of how that can be done! * python * compatibility-api * voice * #### [Updating Conference Recordings in SignalWire](https://developer.signalwire.com/compatibility-api/guides/voice/python/updating-conference-recordings.md) When managing conference calls using SignalWire, it's sometimes necessary to pause and resume call recordings dynamically. This guide offers an in-depth look into how to update active conference recordings utilizing the SignalWire REST Client Python SDK as well as SignalWire's REST endpoints. * python * compatibility-api * voice * #### [Voice Conferences](https://developer.signalwire.com/compatibility-api/guides/voice/python/how-to-use-conferences.md) Another very common use case with our voice APIs is creating/dialing conferences! This guide will show how you can dial into simple conferences using XML bins or create a more complex conferencing application using our SignalWire SDKs. * python * compatibility-api * voice *** ## Messaging[​](#messaging "Direct link to messaging")
* #### [Assign numbers to a campaign in bulk](https://developer.signalwire.com/rest/signalwire-rest/guides/campaign-registry/assign-numbers-to-a-campaign-in-bulk) Assign numbers to your campaign all in one go * messaging * python * #### [Delete all assigned phone numbers](https://developer.signalwire.com/rest/signalwire-rest/guides/campaign-registry/release-campaign-numbers-from-csv) Use our REST APIs to easily remove specific phone number assignments from a campaign * python * messaging * #### [Delete all number assignments from a campaign](https://developer.signalwire.com/rest/signalwire-rest/guides/campaign-registry/delete-all-number-assignments) Use our REST API to easily remove all of the phone number assignments in your messaging campaign * messaging * python * #### [Delete all number assignments from multiple campaigns](https://developer.signalwire.com/rest/signalwire-rest/guides/campaign-registry/delete-all-number-assignments-from-multiple-campaigns) Use our REST API to easily remove all of the phone numbers from multiple messaging campaigns at once * messaging * python * #### [Finding Unregistered Numbers in a Project](https://developer.signalwire.com/messaging/guides/general/how-to-find-unregistered-numbers-on-your-project.md) A script to compare all the numbers in your project with a CSV of registered numbers. * python * messaging * #### [Forwarding Texts to Email](https://developer.signalwire.com/compatibility-api/guides/messaging/python/text-to-email.md) This guide will show you how you can handle incoming text messages and forward them to an email address. We will do that by building a server that receives network requests from SignalWire whenever an SMS is received, and then sends an email. * python * messaging * #### [Introduction](https://developer.signalwire.com/messaging/getting-started/platform-free-trial.md) Test SignalWire's messaging APIs before registering with The Campaign Registry. * messaging * #### [List assigned phone numbers from all campaigns](https://developer.signalwire.com/rest/signalwire-rest/guides/campaign-registry/list-all-campaign-number-assignments-to-csv) Using SignalWire's Campaign Registry APIs, this snippet will find all of your phone number assignments, format a data table, and compile details to help you manage all of your numbers. * python * messaging * #### [List phone numbers assigned to a campaign](https://developer.signalwire.com/rest/signalwire-rest/guides/campaign-registry/list-phone-numbers-assigned-to-a-specific-campaign) Keep track of what phone numbers belong to each campaign * python * node.js * ruby * messaging * #### [Number Groups](https://developer.signalwire.com/platform/phone-numbers/guides/number-groups.md) Number Groups let you pool phone numbers that can act as one entity. * messaging * voice * #### [Private URL Shortener](https://developer.signalwire.com/messaging/guides/general/how-to-build-a-private-url-shortener.md) Code example of a private URL shortener in python * python * messaging * #### [Receiving your first SMS](https://developer.signalwire.com/messaging/getting-started/receiving-your-first-sms.md) Learn how to receive your first SMS. * messaging * #### [Removing Landlines From Your Recipient List and Gathering Additional Information](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/remove-all-landlines-from-your-recipient-list.md) Stop sending messages to landlines! This snippet will use a Phone Number Lookup including carrier details for all numbers in your recipient list, and removes any numbers that are not sms-enabled. * messaging * python * #### [Reply Statistics](https://developer.signalwire.com/compatibility-api/guides/messaging/python/how-to-get-reply-statistics-with-python.md) This guide will use the SignalWire Python SDK to get a list of owned DIDs, and compare inbound and outbound messages to provide statistics on reply rate. * python * messaging * #### [Sending SMS from Google Sheets](https://developer.signalwire.com/compatibility-api/guides/messaging/general/how-to-send-sms-from-google-sheets.md) Do you store your customer’s information in an Excel or Google Sheets spreadsheet? Wouldn’t it be handy to be able to send SMS to your customers directly from Google Sheets? With this guide we’ll show you how to integrate SignalWire API with Google Sheets API to track and contact customers regarding payments that are due. We’ll be using Google’s version of Javascript which is called Apps Script. You can modify this code however you need to fit your particular use case. * javascript * messaging * #### [Toll-free verification](https://developer.signalwire.com/messaging/guides/general/toll-free-number-overview.md) Overview of Toll-Free number verification process. * messaging ### Relay Realtime SDK[​](#messaging-relay-realtime-sdk "Direct link to messaging-relay-realtime-sdk")
* #### [First Steps with Messaging with the Realtime SDK](https://developer.signalwire.com/sdks/realtime-sdk/guides/messaging/first-steps-with-messaging.md) Learn how to send and receive SMS messages with the SignalWire Realtime SDK. * node.js * relay realtime sdk * messaging * #### [Forwarding Texts to Email](https://developer.signalwire.com/sdks/realtime-sdk/guides/messaging/forwarding-texts-to-email.md) Learn how to forward texts to an email address using the SignalWire Realtime SDK. * node.js * relay realtime sdk * messaging * #### [Sending SMS from the Browser](https://developer.signalwire.com/sdks/realtime-sdk/guides/messaging/send-sms-from-the-browser.md) Learn how to send SMS from the browser using the SignalWire Realtime SDK. * node.js * relay realtime sdk * messaging ### Compatibility-API[​](#messaging-compatibility-api "Direct link to messaging-compatibility-api")
* #### [Call & Text By Proxy (Masked Numbers) - Python](https://developer.signalwire.com/compatibility-api/guides/general/calltext-by-proxy.md) This guide will show you how to create a bi-directional mask of participants' phone numbers for voice and text messages using SignalWire and Python. * messaging * voice * compatibility-api * python * #### [Handling Incoming Messages from Code](https://developer.signalwire.com/compatibility-api/guides/messaging/general/handling-incoming-messages-from-code.md) In Receiving your first SMS we learned how to use Compatibility XML bins to handle incoming messages. In particular, we showed how to reply with a static message to any incoming SMS. * python * php * node.js * compatibility-api * messaging * #### [Listing Price Summaries](https://developer.signalwire.com/compatibility-api/guides/messaging/general/how-to-use-list-messages-api-to-get-pricing-for-a-date-range.md) With this code snippet you can get the total cost of messaging in a specific date range. * messaging * python * node.js * php * compatibility-api * #### [Multi Factor Authentication for Voice - Ruby](https://developer.signalwire.com/compatibility-api/guides/voice/ruby/multi-factor-authentication.md) Multi-factor authentication (MFA) is used to authenticate users of an application through the use of a secret token that is sent to them over SMS text or a voice call. It is commonly used for logging in to secure systems, but it is also gaining popularity as an one-time password (OTP) mechanism to authorize transactions or to sign documents and contracts. * messaging * voice * ruby * compatibility-api * #### [Redacting Messages for HIPAA Compliance](https://developer.signalwire.com/compatibility-api/guides/messaging/general/how-to-redact-messages-for-hippa-compliancy.md) This guide will show you two ways to approach redacting sensitive information from your outbound messages using the SignalWire API and Python or Node.js. * python * node.js * compatibility-api * messaging * #### [Sending SMS from the Browser](https://developer.signalwire.com/compatibility-api/guides/messaging/python/send-sms-from-the-browser-with-python-flask-and-html.md) This guide will use Flask to create a simple web application that can send sms through the browser. * python * compatibility-api * messaging * #### [Sending Your First SMS](https://developer.signalwire.com/messaging/getting-started/sending-your-first-sms.md) import Frame from "@site/src/components/Extras/Frame/Frame"; * messaging * node.js * python * php * compatibility-api * #### [SMS Status Callbacks for Delivery Tracking](https://developer.signalwire.com/compatibility-api/guides/messaging/general/sms-status-callbacks.md) This script utilizes SMS status callbacks to show a simple delivery status tracker that could begin running before a message campaign goes out and end when a message campaign ends. This tracker will log every message status event to the console and keep a record of any message failures. When the message campaign is complete and the app is ended, all the failures along with relevant information will be downloaded to CSV for later investigation. * python * node.js * compatibility-api * messaging * #### [Text Subscription](https://developer.signalwire.com/compatibility-api/guides/messaging/python/text-subscription.md) This guide will show you how to create a phrase-based subscription service using SignalWire and Python. The application will demonstrate how you can easily create and maintain multiple campaigns as well as their associated subscribers. The list administrator can broadcast to specific campaigns and is notified of new subscribers and removal requests via email. If you reply with stop or unsubscribe, the number will be placed on a black list. * python * compatibility-api * messaging * #### [Webhook Security](https://developer.signalwire.com/platform/basics/security-and-compliance/webhook-security.md) When building an application with SignalWire services, you are very likely to use webhooks to exchange information with SignalWire. A webhook is an HTTP(S) request sent to your web application when a key event has occurred, such as an inbound call, inbound message, or a status change. This allows SignalWire to query your web application in order for instructions on what to do next. For example, you might use a webhook to handle an inbound call by reading the instructions in your webhook to play an IVR, route the customer to the right department, and connect them with an agent. You could also use a webhook as a status callback where each status change of a call or message is sent to your web application which might store some instructions for handling emergent errors. * messaging * voice * fax * compatibility-api * node.js *** ## Chat[​](#chat "Direct link to chat")
### Relay Browser SDK[​](#chat-relay-browser-sdk "Direct link to chat-relay-browser-sdk")
* #### [Building Chat Apps with React](https://developer.signalwire.com/chat/guides/build-a-react-chat-application.md) Learn how to build a chat application with React. * javascript * relay browser sdk * node.js * chat * #### [First steps with Chat](https://developer.signalwire.com/chat/getting-started/chat-first-steps.md) Quickly implement a full-fledged chat into your web application. * javascript * relay browser sdk * chat * #### [Simple Chat Demo](https://developer.signalwire.com/chat/getting-started/get-started-with-a-simple-chat-demo.md) In this guide we will explore a simple chat application built using the SignalWire SDK. * chat * relay browser sdk * javascript * node.js *** ## Video[​](#video "Direct link to video")
* #### [Managing Video Rooms with APIs](https://developer.signalwire.com/video/getting-started/managing-rooms-with-apis.md) Guide to managing prebuilt rooms with REST APIs. * video * node.js ### Relay Browser SDK[​](#video-relay-browser-sdk "Direct link to video-relay-browser-sdk")
* #### [Highlighting the Speaker](https://developer.signalwire.com/sdks/browser-sdk/guides/video/highlighting-whos-speaking.md) Using the SignalWire Video SDK, you can get information on who of the participants is currently speaking. You can use this information, for example, to highlight the participant in your user interface. * video * javascript * relay browser sdk * #### [Interactive Live Streaming](https://developer.signalwire.com/sdks/browser-sdk/guides/video/interactive-live-streaming.md) In case of large events, scalability is key. If you need to broadcast your live video event to a large audience, we have a couple of solutions. * video * javascript * relay browser sdk * #### [Making a Clubhouse Clone](https://developer.signalwire.com/video/guides/making-a-clubhouse-clone.md) Learn how to make a Clubhouse clone using the SignalWire Video API. * javascript * node.js * relay browser sdk * video * #### [Recording Video Calls](https://developer.signalwire.com/sdks/browser-sdk/guides/video/recording-video.md) If you are using SignalWire to conduct your video conferences, it is quite simple to record the video feed and access them later at your convenience. Depending on how you are using SignalWire Video, there are several ways you might go about controlling your recordings. * video * javascript * relay browser sdk * #### [Screen Sharing](https://developer.signalwire.com/sdks/browser-sdk/guides/video/sharing-your-screen.md) SignalWire Video API allows you to host real-time video calls and conferences on your website. In this guide, we'll learn to add screen sharing ability in your video call interface. * video * javascript * relay browser sdk * #### [Simple Video Demo](https://developer.signalwire.com/video/getting-started/simple-video-demo.md) Add high-quality, high-performance video to your application or website * video * relay browser sdk * javascript * node.js * #### [Streaming to YouTube and Other Platforms](https://developer.signalwire.com/sdks/browser-sdk/guides/video/streaming-to-youtube-and-other-platforms.md) 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. * video * javascript * relay browser sdk * #### [Switching Webcams or Microphones During a Call](https://developer.signalwire.com/sdks/browser-sdk/guides/video/switch-webcam-or-microphone.md) 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. * video * javascript * relay browser sdk * #### [Video Layouts](https://developer.signalwire.com/video/guides/layouts.md) SignalWire Video Conferences offer a wide set of layouts to display the members in a room. To learn how to use layouts, check out the guides for Setting the Video Call Layout and Using Layout Positions. * video * javascript * relay browser sdk * #### [Video Overlays](https://developer.signalwire.com/sdks/browser-sdk/guides/video/video-overlays.md) SignalWire renders the video of your room in the cloud. This means that everyone sees the same content, and you could have a virtually unlimited number of connected users: the network link between your computer and SignalWire's server will only need to carry a single video stream, no matter what. * video * javascript * node.js * relay browser sdk *** ## Fax[​](#fax "Direct link to fax")
* #### [Common Fax Errors](https://developer.signalwire.com/fax/getting-started/common-fax-errors.md) Our guide to understanding and troubleshooting the most common fax error messages. * fax ### Compatibility-API[​](#fax-compatibility-api "Direct link to fax-compatibility-api")
* #### [Callback for Inbound Fax](https://developer.signalwire.com/fax/getting-started/securing-callback-for-inbound-fax-with-cxml.md) Learn how to secure your callback for a inbound fax * fax * compatibility-api * #### [Forwarding Inbound Faxes to Email](https://developer.signalwire.com/fax/getting-started/fax-to-email.md) This short and simple guide will show how you can use the SignalWire Python SDK and the MailGun API in order to forward your incoming SignalWire faxes to email. You can easily bridge this older technology by allowing faxes to be delivered to your inbox with only a few lines of code. * python * compatibility-api * fax * #### [Retrying Failed Faxes](https://developer.signalwire.com/fax/getting-started/fax-with-retries.md) Example application that sends Faxes, and retries if it fails * node.js * compatibility-api * fax * #### [Sending and Receiving Fax](https://developer.signalwire.com/fax/getting-started/first-steps-with-fax.md) After you have acquired a number, or in case you have one already, 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: * javascript * python * c#/.net * php * ruby * compatibility-api * fax *** ## Numbers[​](#numbers "Direct link to numbers")
* #### [Mustache Template Parameters in cXML applications](https://developer.signalwire.com/compatibility-api/guides/general/utilizing-mustache-templates.md) An introduction to saving parameters as mustache variables through XML webhooks. * numbers * #### [Purchasing Numbers in Bulk](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/how-to-purchase-numbers-in-bulk.md) Enjoy this user-friendly approach to adding API search parameters through queries in your console. Whether you want to buy local or purchase toll-free, this guide can help find all the numbers that suit your needs and seamlessly add them to your project. * numbers * python * node.js * #### [Status Callbacks Overview](https://developer.signalwire.com/compatibility-api/guides/signalwire-status-callbacks.md) SignalWire allows for a variety of different types of callbacks that allow you to keep an eye on your traffic and perform actions based on incoming events. * numbers * voice * messaging * python * #### [Update Webhooks in Bulk](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/how-to-update-webhooks-in-bulk.md) Use Python or Node.js to Update Webhooks on Bulk Amount of Numbers * numbers * python * node.js * #### [What is E164?](https://developer.signalwire.com/platform/phone-numbers/getting-started/what-is-e164.md) An introduction to what E164 format is. * numbers ### Compatibility-API[​](#numbers-compatibility-api "Direct link to numbers-compatibility-api")
* #### [cXML scripts](https://developer.signalwire.com/compatibility-api/guides/general/creating-and-using-cxml-scripts.md) cXML scripts create a URL endpoint that responds with a set of instructions that can be executed to handle calls, SMS, or fax. * numbers * voice * fax * messaging * compatibility-api * #### [Listing Numbers to a CSV](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/list-numbers-to-csv.md) List all of the numbers in your SignalWire Project and export them to CSV * numbers * voice * python * node.js * compatibility-api * #### [Releasing Numbers](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/release-numbers.md) This code snippet will filter all numbers by a certain area code or sequence and then return all the numbers that match. Once you review the numbers that it prints out, you can uncomment the delete line and run it again to release the numbers all at once. * numbers * python * ruby * compatibility-api * #### [Releasing Numbers from a CSV](https://developer.signalwire.com/compatibility-api/guides/general/phone-numbers/release-project-numbers-based-off-csv.md) The Python script example below will delete numbers from your SignalWire Space based on a CSV file of the intended numbers to be deleted. * numbers * python * compatibility-api * #### [Webhooks Overview](https://developer.signalwire.com/platform/phone-numbers/guides/how-to-configure-your-webhook.md) An introduction to using webhooks to receive information and events about calls and messages. * numbers * voice * messaging * fax * compatibility-api * node.js *** ## SignalWire Space[​](#signalwire-space "Direct link to signalwire-space")
* #### [Change settings](https://developer.signalwire.com/platform/dashboard/guides/changing-settings-in-your-signalwire-space.md) Currently, SignalWire’s infrastructure is unable to allow for the changing of URLs. All Space attributes are tied to the Space URL. However, if you must change a SignalWire Space URL, please create a new Space on our website and open a Support ticket. SignalWire's Support Team will navigate through the process of releasing and/or transferring phone numbers from a previous Space and delete the old Space when the release/transfer is complete. * signalwire space * #### [Close an account](https://developer.signalwire.com/platform/dashboard/guides/closing-a-signalwire-account.md) This guide presents the steps needed for how a customer can close their account by contacting us through a ticket. * signalwire space * #### [Common issues](https://developer.signalwire.com/platform/dashboard/guides/how-to-set-auto-top-up-by-credit-card.md) This guide will show the steps to set up auto top up and how to resolve common credit card rejection errors. * signalwire space * #### [Create a subproject](https://developer.signalwire.com/platform/dashboard/guides/subprojects.md) A guide to creating subprojects in SignalWire Space. * signalwire space * #### [Create an account](https://developer.signalwire.com/platform/dashboard/getting-started/signing-up-for-a-space.md) Open a new Space, or user account, on the SignalWire platform. * signalwire space * #### [Increase Space limits](https://developer.signalwire.com/platform/dashboard/guides/how-to-request-an-increase-to-your-signalwire-space-limits.md) Use this process to request an increase to a Space's Daily Top-up, Projects per Space, numbers per Project, Verified IDs per Project, Call backlog, or Message backlog * signalwire space * #### [International support](https://developer.signalwire.com/platform/dashboard/guides/how-to-enable-international-outbound-dialing-sms.md) Step by step guide for how to enable International Outbound Dialing & SMS on a SignalWire Space * signalwire space * #### [Logs](https://developer.signalwire.com/platform/dashboard/guides/export-logs-from-your-signalwire-space.md) SignalWire provides a way to download logs in CSV format from your SignalWire Space. This is useful for when you are troubleshooting an issue, looking at the volume of your traffic, investigate billing, or just want to see what's going on in your Space. * signalwire space * #### [Multi-factor authentication](https://developer.signalwire.com/platform/dashboard/guides/enabling-2famulti-factor-authentication.md) The Multi-Factor Authentication setting can be enabled via your SignalWire Space Dashboard at the User level. * signalwire space * #### [Navigate](https://developer.signalwire.com/platform/dashboard/get-started/explore.md) Explore your SignalWire Space. * signalwire space * #### [Resources](https://developer.signalwire.com/platform/call-fabric/resources.md) Learn about Resources on the SignalWire platform - what they are, how they work, and how to manage them in the Dashboard. * signalwire space * #### [Suspended Spaces](https://developer.signalwire.com/platform/dashboard/guides/suspended-signalwire-cloud-space.md) Why a SignalWire Space is suspended and process for reactivating. * signalwire space * #### [Trial mode](https://developer.signalwire.com/platform/dashboard/guides/trial-mode.md) Every SignalWire account, when it is first created, is in trial mode. That means there are some limitations, to protect our services from potential abuse, and our new users from causing extensive issues. * signalwire space * #### [User management](https://developer.signalwire.com/platform/dashboard/guides/user-management.md) Adding new users for access to your SignalWire Space is quick and easy through your SignalWire Space dashboard. There are two permission roles that you can make any given account: * signalwire space * #### [What is an SID?](https://developer.signalwire.com/platform/dashboard/guides/what-is-a-sid.md) Learn about a SignalWire ID below! * signalwire space * #### [What is Call Fabric?](https://developer.signalwire.com/platform/call-fabric.md) Learn about Call Fabric, SignalWire's innovative solution designed to unify various communication technologies under one umbrella. * signalwire space *** ## FreeSWITCH[​](#freeswitch "Direct link to freeswitch")
* #### [Choosing a FreeSWITCH Repository](https://developer.signalwire.com/platform/integrations/freeswitch/choosing-a-freeswitch-repository.md) Learn which FreeSWITCH repository is right for you between the Public and Advantage repositories. * freeswitch * getting started * #### [Installing FreeSWITCH or FreeSWITCH Advantage](https://developer.signalwire.com/platform/integrations/freeswitch/installing-freeswitch-or-freeswitch-advantage.md) Learn how to install FreeSWITCH or FreeSWITCH Advantage on your system. * freeswitch * getting started * #### [Adding AI Capabilities to FreeSWITCH](https://developer.signalwire.com/platform/integrations/freeswitch/add-ai-to-freeswitch.md) Learn how to add an AI agent to your FreeSWITCH instance to handle your calls. * freeswitch * favorite * ai * voice * #### [Backtracing From a Core Dump](https://developer.signalwire.com/platform/integrations/freeswitch/freeswitch-crash-getting-a-backtrace-from-a-core-dump.md) The first command you need is to install some needed tools for gdb to do the backtracing, curl to upload the backtrace log, and debug symbols for FreeSWITCH. You may need to install other debug symbols if you have any custom libraries in use. * freeswitch * #### [Clean and Reconfigure with mod\_signalwire](https://developer.signalwire.com/platform/integrations/freeswitch/how-to-mod_signalwire-in-freeswitch-clean-and-reconfigure.md) When using FreeSWITCH modsignalwire, these commands can be used to unload modsignalwire, discard current Connector configs, and obtain a new Token. * freeswitch * #### [FreeSWITCH Memory Address and Memory Pool Sanitizer](https://developer.signalwire.com/platform/integrations/freeswitch/freeswitch-memory-address-and-memory-pool-sanitizer.md) Customers who are subscribed to FreeSWITCH Advantage may request access to an alternate repository that contains special FreeSWITCH packages with memory address and pool sanitation built-in. These special packages may help flush out otherwise difficult-to-find memory corruption issues, more commonly discovered while using advanced ESL techniques. Contact your sales manager for access inquiries. You will not be able to access this repository without proper permission. * freeswitch * #### [Sending an SMS from FreeSWITCH XML Dialplan](https://developer.signalwire.com/platform/integrations/freeswitch/sending-an-sms-from-freeswitch-xml-dialplan-through-signalwire-cloud.md) In order to send an SMS from a FreeSWITCH dialplan extension, we need to do a few things: * freeswitch * messaging --- [Skip to main content](#__docusaurus_skipToContent_fallback) 🎉 Join us at ClueCon 2025: A Developer Conference | August 4-7, 2025 | WebRTC, AI & Telephony | [Learn More & Register](https://www.cluecon.com/) [![SignalWire](/img/logo.svg)![SignalWire](/img/logo-dark.svg)](https://developer.signalwire.com/index.md) [Guides](https://developer.signalwire.com/guides.md) [Products](#) - Calling - [Voice](https://developer.signalwire.com/voice.md) - [AI](https://developer.signalwire.com/ai.md) - [Video](https://developer.signalwire.com/video.md) - [Fax](https://developer.signalwire.com/fax.md) - *** - Messaging - [SMS](https://developer.signalwire.com/messaging.md) - [Chat](https://developer.signalwire.com/chat.md) - *** - [SWML](https://developer.signalwire.com/swml.md) - [Call Flow Builder](https://developer.signalwire.com/call-flow-builder.md) - [Datasphere](https://developer.signalwire.com/rest/signalwire-rest/guides/datasphere/curl-usage) - [RELAY](https://developer.signalwire.com/sdks/overview/what-is-relay.md) - [Compatibility API](https://developer.signalwire.com/compatibility-api.md) [APIs & SDKs](#) - SignalWire - [REST API](https://developer.signalwire.com/rest/signalwire-rest/overview) - [Agents SDK (New!)](https://developer.signalwire.com/sdks/agents-sdk.md) - [RELAY Browser SDK](https://developer.signalwire.com/sdks/browser-sdk/.md) - [RELAY Realtime Server SDK](https://developer.signalwire.com/sdks/realtime-sdk/.md) - *** - Compatibility - [REST API](https://developer.signalwire.com/rest/compatibility-api/overview) - [SDKs](https://developer.signalwire.com/compatibility-api/sdks.md) - [cXML](https://developer.signalwire.com/compatibility-api/cxml.md) - *** - [All REST APIs](https://developer.signalwire.com/rest) - [All RELAY SDKs](https://developer.signalwire.com/sdks.md) [Blog](https://developer.signalwire.com/blog) [Support](#) * [Create a Ticket](https://signalwire.zohodesk.com/portal/en/newticket) * [My Tickets](https://signalwire.zohodesk.com/portal/en/myarea) * [Platform Status](https://status.signalwire.com) [Community](https://signalwire.zohodesk.com/portal/en/community) [Platform](https://developer.signalwire.com/platform.md) - [SignalWire Space (Signup)](https://signalwire.com/signup) - [Platform Status](https://status.signalwire.com) - *** - [Call Fabric](https://developer.signalwire.com/platform/call-fabric.md) - [Dashboard Documentation](https://developer.signalwire.com/platform/dashboard.md) - [Integrations](https://developer.signalwire.com/platform/integrations.md) - [Phone Numbers](https://developer.signalwire.com/platform/phone-numbers.md) - [Platform Basics](https://developer.signalwire.com/platform/basics.md) [](https://discord.com/invite/F2WNYTNjuF)[](https://github.com/signalwire/docs) Search # Search the documentation Type your search here realtime-sdk: v4 (current)browser-sdk: v3 (current) [](https://typesense.org/?utm_medium=referral\&utm_content=powered_by\&utm_campaign=docsearch) Company * [About Us](https://signalwire.com/company/about-us) * [Blog](https://signalwire.com/company/blog) * [Contact Us](https://signalwire.com/company/contact) * [Home](https://signalwire.com) * [Legal](https://signalwire.com/legal/signalwire-cloud-agreement) * [Privacy Policy](https://signalwire.com/legal/privacy-policy) * [Security](https://signalwire.com/legal/security) Community * [Stack Overflow](https://stackoverflow.com/questions/tagged/signalwire) * [Discord](https://discord.com/invite/F2WNYTNjuF) More * [GitHub](https://github.com/signalwire) Pricing * [AI Agent](https://signalwire.com/pricing/ai-agent-pricing) * [Messaging](https://signalwire.com/pricing/messaging) * [Voice](https://signalwire.com/pricing/voice) * [Video](https://signalwire.com/pricing/video) * [Fax](https://signalwire.com/pricing/fax) * [Number Lookup](https://signalwire.com/pricing/lookup) * [Integrations](https://signalwire.com/pricing/integrations) * [MFA](https://signalwire.com/pricing/mfa-api-pricing) Copyright © 2025 SignalWire Inc. --- # Browser SDK ``` npm install @signalwire/js ``` [ GitHub![GitHub stars](https://img.shields.io/github/stars/signalwire/signalwire-js?style=social)](https://github.com/signalwire/signalwire-js)[ ](https://www.npmjs.com/package/@signalwire/js) [npm![npm version](https://img.shields.io/npm/v/@signalwire/js?style=flat-square\&color=red)](https://www.npmjs.com/package/@signalwire/js) [ SDK Reference](https://developer.signalwire.com/sdks/browser-sdk/technical-reference.md) # Overview The SignalWire Browser SDK is a JavaScript library that enables WebRTC-based voice, video, and chat applications directly in web browsers. Built on WebSocket architecture, it provides real-time communication capabilities without plugins or downloads. Voice calls, dialing the PSTN, and connecting to SIP endpoints This latest version of the Browser SDK is ideal for Chat applications and streaming or conferencing with audio and video. If you need to add browser support for voice calls or dial the PSTN or SIP endpoints, please use our [previous version of the Browser SDK](https://developer.signalwire.com/sdks/browser-sdk/v2). ## How It Works[​](#how-it-works "Direct link to How It Works") The SDK operates through WebSocket connections that handle both method calls and real-time events. When you call methods like `join()` or `publish()`, the SDK sends requests and returns promises. Simultaneously, you can listen for real-time events like new members joining or messages arriving using the `.on()` method. ## Getting Started[​](#getting-started "Direct link to Getting Started") ### Install the SDK[​](#install-the-sdk "Direct link to Install the SDK") Choose your preferred installation method: ``` npm install @signalwire/js ``` Or include it via CDN: ``` ``` ### Obtain tokens from your server[​](#obtain-tokens-from-your-server "Direct link to Obtain tokens from your server") Browser applications require tokens from SignalWire's REST APIs for security. Create these server-side: ``` // Server-side: Get a Video Room token // Replace , , and with your actual values const response = await fetch('https://.signalwire.com/api/video/room_tokens', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': 'Basic ' + btoa(':') // Your SignalWire credentials }, body: JSON.stringify({ room_name: "my_room", user_name: "John Smith", permissions: [ "room.self.audio_mute", "room.self.audio_unmute", "room.self.video_mute", "room.self.video_unmute", "room.self.deaf", "room.self.undeaf", "room.self.set_input_volume", "room.self.set_output_volume", "room.self.set_input_sensitivity" ], room_display_name: "My Room", join_as: "member" }) }); const { token } = await response.json(); ``` ### Test your setup[​](#test-your-setup "Direct link to Test your setup") Create a simple video room to test your setup: * NPM Package * CDN ``` import { Video } from "@signalwire/js"; // Join a video room const roomSession = new Video.RoomSession({ token: "your-room-token", // From your server rootElement: document.getElementById("video-container") }); // Listen for events roomSession.on("member.joined", (e) => { console.log(`${e.member.name} joined the room`); }); roomSession.on("room.joined", () => { console.log("Successfully joined the room!"); }); // Join the room await roomSession.join(); ``` ``` ``` Add this HTML element to your page: ```
``` ## Usage Examples[​](#usage-examples "Direct link to Usage Examples") * Video Conferencing * Real-time Chat * PubSub Messaging * WebRTC Utilities ``` import { Video } from "@signalwire/js"; const roomSession = new Video.RoomSession({ token: "your-room-token", rootElement: document.getElementById("video-container"), video: true, audio: true }); // Handle room events roomSession.on("room.joined", () => { console.log("Joined the video room"); // Set up UI controls after joining setupControls(); }); roomSession.on("member.joined", (e) => { console.log(`${e.member.name} joined`); }); roomSession.on("member.left", (e) => { console.log(`${e.member.name} left`); }); // Detect when members are talking roomSession.on("member.talking", (e) => { if (e.member.id === roomSession.memberId) { console.log("You are talking"); } else { console.log(`${e.member.name} is talking`); } }); // Join the room await roomSession.join(); // Example: Set up media controls for your UI function setupControls() { // Toggle camera on button click document.getElementById("cameraBtn").onclick = async () => { if (roomSession.localVideo.active) { await roomSession.videoMute(); console.log("Camera muted"); } else { await roomSession.videoUnmute(); console.log("Camera unmuted"); } }; // Toggle microphone on button click document.getElementById("micBtn").onclick = async () => { if (roomSession.localAudio.active) { await roomSession.audioMute(); console.log("Microphone muted"); } else { await roomSession.audioUnmute(); console.log("Microphone unmuted"); } }; } ``` ``` import { Chat } from "@signalwire/js"; const chatClient = new Chat.Client({ token: "your-chat-token" }); // Subscribe to channels await chatClient.subscribe(["general", "support"]); // Listen for messages chatClient.on("message", (message) => { console.log(`${message.member.name}: ${message.content}`); // Add your custom logic to display messages in your UI }); // Listen for member events chatClient.on("member.joined", (member) => { console.log(`${member.name} joined the channel`); }); chatClient.on("member.left", (member) => { console.log(`${member.name} left the channel`); }); // Send messages await chatClient.publish({ channel: "general", content: "Hello everyone!" }); // Send with metadata await chatClient.publish({ channel: "general", content: "Check out this image!", meta: { image_url: "https://example.com/image.jpg", message_type: "image" } }); ``` ``` import { PubSub } from "@signalwire/js"; const pubSubClient = new PubSub.Client({ token: "your-pubsub-token" }); // Subscribe to channels await pubSubClient.subscribe(["notifications", "alerts"]); // Listen for messages pubSubClient.on("message", (message) => { console.log(`Channel: ${message.channel}`); console.log(`Content:`, message.content); // Handle different message types if (message.channel === "alerts") { console.log("Alert received:", message.content); // Add your custom logic to show alerts in your UI } }); // Publish messages await pubSubClient.publish({ channel: "notifications", content: { type: "user_action", user_id: "123", action: "button_click", timestamp: Date.now() } }); // Publish with metadata await pubSubClient.publish({ channel: "alerts", content: "System maintenance in 30 minutes", meta: { priority: "high", category: "maintenance" } }); ``` ``` import { WebRTC, Video } from "@signalwire/js"; // Check browser support if (WebRTC.supportsGetUserMedia()) { console.log("Browser supports getUserMedia"); } if (WebRTC.supportsGetDisplayMedia()) { console.log("Browser supports screen sharing"); } // Get available devices const cameras = await WebRTC.getCameraDevices(); const microphones = await WebRTC.getMicrophoneDevices(); const speakers = await WebRTC.getSpeakerDevices(); console.log("Cameras:", cameras); console.log("Microphones:", microphones); console.log("Speakers:", speakers); // Get user media with SignalWire WebRTC helper const stream = await WebRTC.getUserMedia({ video: { width: { ideal: 1280 }, height: { ideal: 720 }, frameRate: { ideal: 30 } }, audio: { echoCancellation: true, noiseSuppression: true } }); // Use custom stream in video room const roomSession = new Video.RoomSession({ token: "your-room-token", rootElement: document.getElementById("video"), localStream: stream }); // Device monitoring const deviceWatcher = await WebRTC.createDeviceWatcher(); deviceWatcher.on("changed", (event) => { console.log("Devices changed:", event.changes); // Add your custom logic to handle device changes }); ``` ## Explore the SDK[​](#explore-the-sdk "Direct link to Explore the SDK") ## [Technical Reference](https://developer.signalwire.com/sdks/browser-sdk/technical-reference.md) [Complete API documentation for all namespaces, classes, and methods](https://developer.signalwire.com/sdks/browser-sdk/technical-reference.md) ## [Guides & Examples](https://developer.signalwire.com/sdks/browser-sdk/guides.md) [Step-by-step tutorials and practical examples to get you building quickly](https://developer.signalwire.com/sdks/browser-sdk/guides.md) --- # Chat The Chat namespace contains the classes and functions that you need to create a real-time chat application. ## Classes[​](#classes "Direct link to Classes") * [ChatMember](https://developer.signalwire.com/sdks/browser-sdk/chat/member.md) * [ChatMessage](https://developer.signalwire.com/sdks/browser-sdk/chat/message.md) * [Client](https://developer.signalwire.com/sdks/browser-sdk/chat/client.md) --- # Chat.Client You can use the Client object to build a messaging system into the browser. Example usage: ``` import { Chat } from "@signalwire/js"; const chatClient = new Chat.Client({ token: "", // get this from the REST APIs }); await chatClient.subscribe(["mychannel1", "mychannel2"]); chatClient.on("message", (message) => { console.log("Received", message.content, "on", message.channel, "at", message.publishedAt); }); await chatClient.publish({ channel: "mychannel1", content: "hello world", }); ``` ## Constructors[​](#constructors "Direct link to Constructors") ### constructor[​](#constructor "Direct link to constructor") • **new Client**(`chatOptions`) Creates a new Chat client. #### Parameters[​](#parameters "Direct link to Parameters") | Name | Type | Description | | ------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | `chatOptions` | `Object` | - | | `chatOptions.token` | `string` | SignalWire Chat token that can be obtained from the [REST APIs](https://developer.signalwire.com/rest/signalwire-rest/endpoints/chat/chat-tokens-create). | #### Example[​](#example "Direct link to Example") ``` import { Chat } from "@signalwire/js"; const chatClient = new Chat.Client({ token: "", }); ``` ## Methods[​](#methods "Direct link to Methods") ### disconnect[​](#disconnect "Direct link to 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[​](#returns "Direct link to Returns") `void` #### Example[​](#example-1 "Direct link to Example") ``` client.disconnect(); ``` *** ### getAllowedChannels[​](#getallowedchannels "Direct link to getAllowedChannels") ▸ **getAllowedChannels**(): `Promise` Returns the channels that the current token allows you to subscribe to. #### Returns[​](#returns-1 "Direct link to Returns") `Promise` An object whose keys are the channel names, and whose values are the permissions. For example: ``` { "my-channel-1": { "read": true, "write": false }, "my-channel-2": { "read": true, "write": true }, } ``` #### Examples[​](#examples "Direct link to Examples") ``` const chatClient = new Chat.Client({ token: "", }); const channels = await chatClient.getAllowedChannels(); console.log(channels); ``` *** ### getMemberState[​](#getmemberstate "Direct link to getMemberState") ▸ **getMemberState**(`params`): `Promise<{ channels: Record }>` Returns the states of a member in the specified channels. #### Parameters[​](#parameters-1 "Direct link to 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[​](#returns-2 "Direct link to Returns") `Promise<{ channels: Record }>` #### Example[​](#example-2 "Direct link to Example") ``` 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 "Direct link to getMembers") ▸ **getMembers**(`params`): `Promise<{ members: ChatMemberEntity[] }>` - See [ChatMemberEntity documentation](https://developer.signalwire.com/sdks/browser-sdk/chat/member-entity.md) for more details. Returns the list of members in the given channel. #### Parameters[​](#parameters-2 "Direct link to Parameters") | Name | Type | Description | | ---------------- | -------- | ------------------------------------------------- | | `params` | `Object` | - | | `params.channel` | `string` | The channel for which to get the list of members. | #### Returns[​](#returns-3 "Direct link to Returns") `Promise<{ members: ChatMemberEntity[] }>` - See [ChatMemberEntity documentation](https://developer.signalwire.com/sdks/browser-sdk/chat/member-entity.md) for more details. #### Example[​](#example-3 "Direct link to Example") ``` const m = await chatClient.getMembers({ channel: "my-channel" }); m.members.length; // 7 m.members[0]; // { id: ..., channel: ..., state: ... } ``` *** ### getMessages[​](#getmessages "Direct link to getMessages") ▸ **getMessages**(`params`): `Promise<{ cursor: PagingCursor; messages: ChatMessageEntity[] }>` See [PagingCursor documentation](#paginationcursor) and [ChatMessageEntity documentation](https://developer.signalwire.com/sdks/browser-sdk/chat/message-entity.md) for more details. Returns the list of messages that were sent to the specified channel. #### Parameters[​](#parameters-3 "Direct link to Parameters") | Name | Type | Description | | ---------------- | ----------------------------------- | ------------------------------------------- | | `params` | `Object` | - | | `params.channel` | `string` | Channel for which to retrieve the messages. | | `params.cursor?` | [`PagingCursor`](#paginationcursor) | Cursor for pagination. | #### Returns[​](#returns-4 "Direct link to Returns") `Promise<{ cursor: PagingCursor; messages: ChatMessageEntity[] }>` See [PagingCursor documentation](#paginationcursor) and [ChatMessageEntity documentation](https://developer.signalwire.com/sdks/browser-sdk/chat/message-entity.md) for more details. #### Example[​](#example-4 "Direct link to Example") ``` 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[​](#off "Direct link to off") ▸ **off**(`event`, `fn?`) Remove an event handler. #### Parameters[​](#parameters "Direct link to Parameters") | Name | Type | Description | | ------- | -------- | ---------------------------------------------------------------------------------- | | `event` | `string` | Name of the event. See [Events](#events) for the list of available events. | | `fn?` | Function | An event handler which had been previously attached. | *** ### on[​](#on "Direct link to on") ▸ **on**(`event`, `fn`) Attaches an event handler to the specified event. #### Parameters[​](#parameters "Direct link to Parameters") | Name | Type | Description | | ------- | -------- | ---------------------------------------------------------------------------------- | | `event` | `string` | Name of the event. See [Events](#events) for the list of available events. | | `fn` | Function | An event handler. | #### Example[​](#example "Direct link to Example") In the below example, we are listening for the `call.state` event and logging the current call state to the console. This means this will be triggered every time the call state changes. ``` call.on("call.state", (call) => { console.log("call state changed:", call.state); }); ``` *** ### once[​](#once "Direct link to once") ▸ **once**(`event`, `fn`) Attaches an event handler to the specified event. The handler will fire only once. #### Parameters[​](#parameters "Direct link to Parameters") | Name | Type | Description | | ------- | -------- | ---------------------------------------------------------------------------------- | | `event` | `string` | Name of the event. See [Events](#events) for the list of available events. | | `fn` | Function | An event handler. | *** ### publish[​](#publish "Direct link to publish") ▸ **publish**(`params`): `Promise` Publish a message into the specified channel. #### Parameters[​](#parameters-4 "Direct link to 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` | Metadata associated with the message. There are no requirements on the content of metadata. | #### Returns[​](#returns-5 "Direct link to Returns") `Promise` #### Examples[​](#examples-1 "Direct link to Examples") Publishing a message as a string: ``` await chatClient.publish({ channel: "my-channel", content: "Hello, world." }); ``` Publishing a message as an object: ``` await chatClient.publish({ channel: "my-channel", content: { field_one: "value_one", field_two: "value_two", }, }); ``` *** ### removeAllListeners[​](#removealllisteners "Direct link to removeAllListeners") ▸ **removeAllListeners**(`event?`) Detaches all event listeners for the specified event. #### Parameters[​](#parameters "Direct link to Parameters") | Name | Type | Description | | -------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | `event?` | `string` | Name of the event (leave this undefined to detach listeners for all events). See [Events](#events) for the list of available events. | *** ### setMemberState[​](#setmemberstate "Direct link to setMemberState") ▸ **setMemberState**(`params`): `Promise` Sets a state object for a member, for the specified channels. The previous state object will be completely replaced. #### Parameters[​](#parameters-5 "Direct link to 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. If not provided, defaults to the current member. | | `params.state` | `Record` | The state to set. There are no requirements on the content of the state. | #### Returns[​](#returns-6 "Direct link to Returns") `Promise` #### Example[​](#example-5 "Direct link to Example") ``` await chatClient.setMemberState({ channels: ["chan1", "chan2"], state: { online: true, typing: false, }, }); ``` *** ### subscribe[​](#subscribe "Direct link to subscribe") ▸ **subscribe**(`channels`): `Promise` List of channels for which you want to receive messages. You can only subscribe to those channels for which your token has read permission. 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](#unsubscribe). #### Parameters[​](#parameters-6 "Direct link to 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[​](#returns-7 "Direct link to Returns") `Promise` #### Example[​](#example-6 "Direct link to Example") ``` const chatClient = new Chat.Client({ token: "", }); chatClient.on("message", (m) => console.log(m)); await chatClient.subscribe("my-channel"); await chatClient.subscribe(["chan-2", "chan-3"]); ``` *** ### unsubscribe[​](#unsubscribe "Direct link to unsubscribe") ▸ **unsubscribe**(`channels`): `Promise` List of channels from which you want to unsubscribe. #### Parameters[​](#parameters-7 "Direct link to 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[​](#returns-8 "Direct link to Returns") `Promise` #### Example[​](#example-7 "Direct link to Example") ``` await chatClient.unsubscribe("my-channel"); await chatClient.unsubscribe(["chan-2", "chan-3"]); ``` *** ### updateToken[​](#updatetoken "Direct link to updateToken") ▸ **updateToken**(`token`): `Promise` Replaces the token used by the client with a new one. You can use this method to replace the token when, for example, it is expiring, in order to keep the session alive. The new token can contain different channels from the previous one. In that case, you will need to subscribe to the new channels if you want to receive messages for those. Channels that were in the previous token but are not in the new one will get unsubscribed automatically. #### Parameters[​](#parameters-8 "Direct link to Parameters") | Name | Type | Description | | ------- | -------- | -------------- | | `token` | `string` | The new token. | #### Returns[​](#returns-9 "Direct link to Returns") `Promise` #### Example[​](#example-8 "Direct link to Example") ``` const chatClient = new Chat.Client({ token: '' }) chatClient.on('session.expiring', async () => { const newToken = await fetchNewToken(..) await chatClient.updateToken(newToken) }) ``` ## Events[​](#events "Direct link to Events") ### member.joined[​](#memberjoined "Direct link to member.joined") • **member.joined**(`member`) A new member joined the chat. #### Parameters[​](#parameters-9 "Direct link to Parameters") | Name | Type | | -------- | -------------------------------------------------------------------------------- | | `member` | [`ChatMember`](https://developer.signalwire.com/sdks/browser-sdk/chat/member.md) | *** ### member.left[​](#memberleft "Direct link to member.left") • **member.left**(`member`) A member left the chat. #### Parameters[​](#parameters-10 "Direct link to Parameters") | Name | Type | | -------- | -------------------------------------------------------------------------------- | | `member` | [`ChatMember`](https://developer.signalwire.com/sdks/browser-sdk/chat/member.md) | *** ### member.updated[​](#memberupdated "Direct link to member.updated") • **member.updated**(`member`) A member updated its state. #### Parameters[​](#parameters-11 "Direct link to Parameters") | Name | Type | | -------- | -------------------------------------------------------------------------------- | | `member` | [`ChatMember`](https://developer.signalwire.com/sdks/browser-sdk/chat/member.md) | *** ### message[​](#message "Direct link to message") • **message**(`message`) A new message has been received. #### Parameters[​](#parameters-12 "Direct link to Parameters") | Name | Type | | --------- | ---------------------------------------------------------------------------------- | | `message` | [`ChatMessage`](https://developer.signalwire.com/sdks/browser-sdk/chat/message.md) | *** ### session.expiring[​](#sessionexpiring "Direct link to session.expiring") • **session.expiring**() The session is going to expire. Use the `updateToken` method to refresh your token. *** ## Type Aliases[​](#type-aliases "Direct link to Type Aliases") ### PaginationCursor[​](#paginationcursor "Direct link to PaginationCursor") This is a utility object that aids in pagination. It is specifically used in conjunction with the [getMessages](#getmessages) method. #### Properties[​](#properties "Direct link to 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. --- # ChatMember Represents a member in a chat. ## Properties[​](#properties "Direct link to Properties") ### channel[​](#channel "Direct link to channel") Accesses the channel of this member. **Syntax:** `ChatMember.channel()` **Returns:** `string` *** ### id[​](#id "Direct link to id") Accesses the ID of this member. **Syntax:** `ChatMember.id()` **Returns:** `string` *** ### state[​](#state "Direct link to state") Accesses the state of this member. **Syntax:** `ChatMember.state()` **Returns:** `any` --- # ChatMemberEntity An object representing a Chat Member with only the state properties of [`ChatMember`](https://developer.signalwire.com/sdks/browser-sdk/chat/member.md). ## Properties[​](#properties "Direct link to Properties") ### channel[​](#channel "Direct link to channel") • `Readonly` **channel**: `string` The channel of this member. *** ### id[​](#id "Direct link to id") • `Readonly` **id**: `string` The id of this member. *** ### state[​](#state "Direct link to state") • `Readonly` **state**: `Record` The state of this member. --- # ChatMessage Represents a message in a chat. ## Constructors[​](#constructors "Direct link to Constructors") ### constructor[​](#constructor "Direct link to constructor") • **new ChatMessage**(`payload`) #### Parameters[​](#parameters "Direct link to Parameters") | Name | Type | | --------- | ------------- | | `payload` | `ChatMessage` | ## Properties[​](#properties "Direct link to Properties") ### channel[​](#channel "Direct link to channel") Accesses the channel in which this message was sent. **Syntax:** `ChatMessage.channel()` **Returns:** `string` *** ### content[​](#content "Direct link to content") Accesses the content of this message. This can be any JSON-serializable object or value. **Syntax:** `ChatMessage.content()` **Returns:** `string` *** ### id[​](#id "Direct link to id") Accesses the id of this message. **Syntax:** `ChatMessage.id()` **Returns:** `string` *** ### member[​](#member "Direct link to member") Accesses the member which sent this message. **Syntax:** `ChatMessage.member()` **Returns:** [`ChatMember`](https://developer.signalwire.com/sdks/browser-sdk/chat/member.md) *** ### meta[​](#meta "Direct link to meta") Accesses any metadata associated with this message. **Syntax:** `ChatMessage.meta()` **Returns:** `any` *** ### publishedAt[​](#publishedat "Direct link to publishedAt") Accesses the date and time at which this message was published. **Syntax:** `ChatMessage.publishedAt()` **Returns:** `Date` --- # ChatMessageEntity An object representing a Chat Message with only the state properties of [`ChatMessage`](https://developer.signalwire.com/sdks/browser-sdk/chat/message.md). ## Properties[​](#properties "Direct link to Properties") ### content[​](#content "Direct link to content") • `Readonly` **content**: `any` The content of this message. This can be any JSON-serializable object or value. *** ### id[​](#id "Direct link to id") • `Readonly` **id**: `string` The id of this message. *** ### member[​](#member "Direct link to member") • `Readonly` **member**: [`ChatMember`](https://developer.signalwire.com/sdks/browser-sdk/chat/member.md) The member which sent this message. *** ### meta[​](#meta "Direct link to meta") • `Readonly` **meta?**: `any` Any metadata associated with this message. *** ### publishedAt[​](#publishedat "Direct link to publishedAt") • `Readonly` **publishedAt**: `Date` The date and time at which this message was published. --- # Overview This section contains guides for using the Relay browser SDK v3. --- # Video Guides This section contains video guides for using the Relay browser SDK v3. --- # Room Previews 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. ![A screenshot with a preview of a Video Room. Text at the top reads 'Join a room'. Four previews are shown, each labeled with the room name.](/assets/images/00dc9ac-Screen_Shot_2022-03-24_at_21.45.18-4a54f852d9a25b5205bb8c4be102f834.webP) Room previews. ## Introducing Video Previews[​](#introducing-video-previews "Direct link to Introducing Video Previews") Video previews are live thumbnails of the ongoing room sessions. They refresh twice every minute, and record a small slice of the room. You can use these previews to represent a room. ## Turning Video Previews On[​](#turning-video-previews-on "Direct link to Turning Video Previews On") Depending on how you are creating your rooms, you need to enable video previews before you can begin using them. If you’re using the API to programmatically [create rooms](https://developer.signalwire.com/rest/signalwire-rest/endpoints/video/create-room), you need to set the `enable_room_previews` attribute to `true` when creating the new room. If you’re auto-creating a new room when requesting a room token, you need to set the `enable_room_previews` attribute to `true` . If you’re using the new programmable video communication tool, just turn on `Enable Room Previews` option from settings. ![This screenshot shows the configuration options for Video Conferences.](/assets/images/conference-settings-8d9ed1be6470afc36bd2d9433ff5fb47.png) Turning room previews on from the UI. ## Obtaining the actual previews[​](#obtaining-the-actual-previews "Direct link to Obtaining the actual previews") SignalWire makes the video previews accessible as animated `.webp` images. There are a few ways to get their URL: some might be easier or better suited based on your application. In the following sections we review the different methods, namely REST APIs, JavaScript SDKs, and Programmable Video Conferences. ### REST API[​](#rest-api "Direct link to REST API") If you have a proxy backend (as described in the [Simple Video Demo](https://developer.signalwire.com/video/getting-started/simple-video-demo.md)), you can query the Rest API for the room sessions. You can either list all room sessions with the [`GET /api/video/room_sessions`](https://developer.signalwire.com/rest/signalwire-rest/endpoints/video/list-room-sessions) endpoint. Or if you have the id of your current room session, you can [`GET /api/video/room_sessions/{id}`](https://developer.signalwire.com/rest/signalwire-rest/endpoints/video/get-room-session). The URL for the preview image will be in the attribute, `preview_url` for the room session. If preview is turned off, there'll be a `null` instead of the URL. ### Realtime API and Video Client SDK[​](#realtime-api-and-video-client-sdk "Direct link to Realtime API and Video Client SDK") #### RELAY v3[​](#relay-v3 "Direct link to RELAY v3") For Realtime API (Relay v3), you can add an event listener for [`room.started`](https://developer.signalwire.com/sdks/realtime-sdk/video/client.md#onroomstarted) event to get new room sessions as they are created. #### RELAY v4[​](#relay-v4 "Direct link to RELAY v4") For Realtime API (Relay v4), you can add an event listener for [`onRoomStarted`](https://developer.signalwire.com/sdks/realtime-sdk/video/client.md#onroomstarted) event to get new room sessions as they are created. For the Video Client SDK running in the browser, the `previewUrl` is available in the same [RoomSession](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md) object you create to start the video call. You will find the preview image in the `previewUrl` attribute of the RoomSession object. ### Programmable Video Conferences[​](#programmable-video-conferences "Direct link to Programmable Video Conferences") If you're using SignalWire's Programmable Video Conferences to create and administrate rooms through the Dashboard, you can access the Video Preview by tapping into the [`setupRoomSession`](https://developer.signalwire.com/video/conference/technical-reference.md) parameter when setting up the video room in your web page. ## Refreshing the previews[​](#refreshing-the-previews "Direct link to Refreshing the previews") ### Vanilla HTML/JavaScript[​](#vanilla-htmljavascript "Direct link to Vanilla HTML/JavaScript") The previews of the room are regenerated a few times every minute. The content changes, but the URL remains the same. To keep them up to date in your website, you should keep on updating them using a timing mechanism like `createInterval`. For example, using Programmable Video Conferences with AppKit: ``` ``` ### React[​](#react "Direct link to React") If you are using React, you can use the [@signalwire-community/react](https://signalwire-community.github.io/docs/react/) package which offers a handy component for rendering room previews. You just need to provide the URL, and the component will take care of refreshing, caching, loading indicators, and so on. For example: ``` // npm install @signalwire-community/react import { RoomPreview } from "@signalwire-community/react"; export default function App() { // const previewUrl = ... return ( ); } ``` ### React Native[​](#react-native "Direct link to React Native") If you are using React Native, you can use the [@signalwire-community/react-native-room-preview](https://signalwire-community.github.io/docs/react-native/components/roompreview/) package which offers a handy component for rendering room previews. Just like for the React component, you just need to provide the URL, and the component will take care of refreshing, caching, loading indicators, and so on. For example: ``` import React from "react"; import { SafeAreaView } from "react-native"; import { RoomPreview } from "@signalwire-community/react-native-room-preview"; export default function App() { return ( ); } ``` ### Demo[​](#demo "Direct link to Demo") If you'd like to explore and tinker with this feature, you can do so right from the browser in [Code Sandbox](https://codesandbox.io/s/room-preview-demo-zb2urs). The demo code is also available on [GitHub](https://github.com/signalwire/guides/tree/main/Video/Room%20Preview%20Demo). --- # Highlighting the Speaker Using the SignalWire Video SDK, you can get information on who of the participants is currently speaking. You can use this information, for example, to highlight the participant in your user interface. ### Prerequisites[​](#prerequisites "Direct link to Prerequisites") We will assume that you are familiar with the process of setting up a room session. If not, first read our [First steps with Video](https://developer.signalwire.com/video/getting-started/video-first-steps.md) guide. It shows you how to set up a basic videoconference room using the SDK. ### Getting Started[​](#getting-started "Direct link to Getting Started") The Video SDK communicates information about who is currently speaking via events. The event we're interested in is `member.talking`. This event is generated whenever a member starts or stops talking, and the associated callbacks receive objects of the following type: ``` { room_session_id: string, room_id: string, member: { id: string, room_session_id: string, room_id: string, talking: boolean } } ``` Take the following boilerplate for connecting to a room session: ``` const roomSession = new SignalWire.Video.RoomSession({ token: "", rootElement: document.getElementById("myVideoElement"), audio: true, video: true, }); // You connect events here roomSession.on("member.joined", (e) => { console.log(`${e.member.name} joined`); }); roomSession.join(); ``` We can add an event listener for `member.talking` as follows: ``` roomSession.on("member.talking", (e) => { console.log("Event: member.talking"); const isCurrentlyTalking = e.member.talking; const memberId = e.member.id; // Update your UI: the participant with id `e.member.id` is talking iff e.member.talking == true }); ``` Note that to know the current list of participants in your room, you should listen to the following events to update your own list: * `room.joined` * `member.joined` * `member.updated` * `member.left` Or utilize the `memberList.updated` method to listen for any member changes. ### Next steps[​](#next-steps "Direct link to Next steps") Now that you have listened to the appropriate events, you can either update your custom UI or indicate who is speaking in a way that is *integrated* with the video. For integrating your custom graphics with the video, you need overlays; read more at the following pages from our Zoom Clone series: * [Video Overlays](https://developer.signalwire.com/sdks/browser-sdk/guides/video/video-overlays.md) ### Wrap up[​](#wrap-up "Direct link to Wrap up") We have shown how to detect when any of the current members in a room are speaking. The strategy consists in listening to the `member.talking` event, which can be used to update an internal list of members. For more resources, refer to: * [Simple Video Demo](https://developer.signalwire.com/video/getting-started/simple-video-demo.md) * [Video RoomSession Technical Reference](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md) --- # Interactive Live Streaming In case of large events, scalability is key. If you need to broadcast your live video event to a large audience, we have a couple of solutions. As a first option, you can use [RTMP Streaming](https://developer.signalwire.com/sdks/browser-sdk/guides/video/streaming-to-youtube-and-other-platforms.md). With RTMP Streaming, you can stream the audio and video of the video room to an external service such as YouTube, from where your audience can watch. Streaming with RTMP works fine in many cases, but sometimes you may need more flexibility. What if you want to temporarily bring a member from the audience on stage, for example to ask or answer a question? What if you want your own custom UI? To address these advanced use cases, we support *Interactive Live Streaming*. ## What is Interactive Live Streaming[​](#what-is-interactive-live-streaming "Direct link to What is Interactive Live Streaming") You can use Interactive Live Streaming with any of your video rooms. When streaming, a room can have two different kinds of participants: audience and members. An *audience participant* can only watch and listen: their own media is not going to be shared. On the other hand, a *member* is the typical videoconference room member: they can watch and listen, but their own media is also shared with all other participants in the room. Depending on their permissions, members can also perform other actions, such as changing the layout of the room or playing videos. When streaming, audience participants can be *promoted* to members and, vice-versa, members can be *demoted* to audience participants. Demo Application To try Interactive Live Streaming in a demo application that we built for you, check out our [GitHub repo](https://github.com/signalwire/examples/tree/main/Video/Interactive-Live-Streaming). ## Joining a room[​](#joining-a-room "Direct link to Joining a room") When using the [Browser SDK](https://developer.signalwire.com/sdks/browser-sdk/.md), the kind of [Video Room Token](https://developer.signalwire.com/rest/signalwire-rest/endpoints/video/create-room-token) that you get determines whether you join the room as audience or as a member. ### Joining as audience[​](#joining-as-audience "Direct link to Joining as audience") To join as audience, specify `"join_as": "audience"` when creating a token. ``` curl -L -X POST "https://$SPACE_URL/api/video/room_tokens" \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -u "$PROJECT_ID:$API_TOKEN" \ --data-raw '{ "room_name": "my_room", "user_name": "John Smith", "join_as": "audience" }' ``` Then use the returned token to initialize a [RoomSession](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md). ### Joining as a member[​](#joining-as-a-member "Direct link to Joining as a member") To join as an audience member, specify `"join_as": "member"` when creating a token. ``` curl -L -X POST "https://$SPACE_URL/api/video/room_tokens" \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -u "$PROJECT_ID:$API_TOKEN" \ --data-raw '{ "room_name": "my_room", "user_name": "John Smith", "join_as": "member" }' ``` Then use the returned token to initialize a [RoomSession](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md): ``` import * as SignalWire from "@signalwire/js"; const roomSession = new SignalWire.Video.RoomSession({ token: "", rootElement: document.getElementById("yourVideoElement"), }); roomSession.join(); ``` For more information about using tokens to join a video room, please refer to our [Simple Video Demo](https://developer.signalwire.com/video/getting-started/simple-video-demo.md). Follow that guide to learn the basics about instantiating custom video rooms using the SDKs. ## Promoting and demoting[​](#promoting-and-demoting "Direct link to Promoting and demoting") Using the SDKs, you can programmatically promote and demote participants, to allow the audience participants to interact with the room and vice-versa. To promote a member, use the [promote](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md#promote) method: ``` 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", ], }); ``` Only members can promote other participants. As you can observe from the code snippet above, you can specify a set of permissions to assign to the new member. The `memberId` value identifies the id of the audience participant that you want to promote. Demoting a member back to the audience, instead, is performed by the [demote](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md#demote) method: ``` await roomSession.demote({ memberId: "de550c0c-3fac-4efd-b06f-b5b8614b8966", mediaAllowed: "all", }); ``` ## Wrap up[​](#wrap-up "Direct link to Wrap up") We have seen how to use Interactive Live Streaming to easily build next generation communication platforms. Make sure to check out our [technical documentation](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md#promote). If, instead, you are just starting out, then we suggest reading our guide on [how to get started with the Video APIs](https://developer.signalwire.com/video/getting-started/simple-video-demo.md). --- # Recording Video Calls If you are using SignalWire to conduct your video conferences, it is quite simple to record the video feed and access them later at your convenience. Depending on how you are using SignalWire Video, there are several ways you might go about controlling your recordings. ## How to start a recording[​](#how-to-start-a-recording "Direct link to How to start a recording") ### From the Embeddable Video Conference Widget[​](#from-the-embeddable-video-conference-widget "Direct link to From the Embeddable Video Conference Widget") If you are using Embeddable Video Rooms in your website, just click the Start Recording option to start the recording. info Anyone with a moderator token will be able to start and stop recording. Embed the guest video room version on public pages for people that shouldn't be able to control recordings. ![A screenshot of an embedded video conference widget. The ellipsis menu icon is selected, showing the 'Start Recording' menu item.](/assets/images/pvc-start-afbc8e724589b1396d280ffb98dd1267.webP) Starting a recording from the Embeddable Video Conference Widget. If you are using [AppKit](https://www.npmjs.com/package/@signalwire/app-kit) to create or [extend embeddable rooms](https://developer.signalwire.com/video/getting-started/extending-rooms-with-custom-code.md), use the `setupRoomSession` callback to get a reference to the [`RoomSession`](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md) object. You can use that reference to the RoomSession object to start recordings. ``` ``` ### From the Browser SDK[​](#from-the-browser-sdk "Direct link to From the Browser SDK") To start recording in an ongoing room session from the browser SDK, use the [`RoomSession.startRecording()`](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md#startrecording) method. You must have the `room.recording` permission to be able to start and stop recording. This method returns a Promise which resolves to a [RoomSessionRecording](https://developer.signalwire.com/sdks/browser-sdk/video/room-session-recording.md) object. You can use this returned object to control the recording, including pausing and stopping it. ``` // Join a room const roomSession = new SignalWire.Video.RoomSession({ token: "", rootElement: document.getElementById("root"), }); await roomSession.join(); // Start recording const rec = await roomSession.startRecording(); // Stop recording after 10 seconds setTimeout(rec.stop, 10 * 1000); ``` ### The Record on Start Option[​](#the-record-on-start-option "Direct link to The Record on Start Option") To start recording the video conference as soon as it is started, use the *Record on Start* option. With this option enabled, all sessions occurring in that room will automatically be recorded. If you are creating a Embeddable Video Conference, it will be available via your SignalWire Dashboard (at the *Conferences* tab on the *Video* page). If you are creating an advanced room through the REST API, use the [`record_on_start`](https://developer.signalwire.com/rest/signalwire-rest/endpoints/video/create-room) option while creating the room. Further, you have to make sure that the `room.recording` [permission](https://developer.signalwire.com/rest/signalwire-rest/overview/permissions) is set in the room token. info The *Record on Start* setting is the only control the REST API provides related to room recording. To control room recordings more precisely from your server, use the [Realtime SDK](https://developer.signalwire.com/sdks/realtime-sdk/video/roomsession.md). The Realtime SDK exposes a RoomSession object similar to the one in the [Browser SDK](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md), so you have finer control over the room session in progress. ## How to Stop a Recording[​](#how-to-stop-a-recording "Direct link to How to Stop a Recording") ### From the Embeddable Video Conference Widget[​](#from-the-embeddable-video-conference-widget-1 "Direct link to From the Embeddable Video Conference Widget") ![A screenshot of an embedded video conference widget. The ellipsis menu icon is selected, showing the 'Stop Recording' menu item.](/assets/images/pvc-stop-1b0f754195b7583c334b768e1fa96c13.webP) Stop a recording from the Embeddable Video Conference Widget To stop an ongoing recording through the Embeddable Video Conference widget, click the Stop Recording option. ### From the Browser SDK[​](#from-the-browser-sdk-1 "Direct link to From the Browser SDK") Use the [`RoomSessionRecording.stop()`](https://developer.signalwire.com/sdks/browser-sdk/video/room-session-recording.md) method to stop the ongoing recording. This method is included on the object returned when you called the [`RoomSession.startRecording()`](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md#startrecording) method. ``` const rec = await roomSession.startRecording(); await rec.stop(); ``` ## How to Access Recordings[​](#how-to-access-recordings "Direct link to How to Access Recordings") ### From the SignalWire Dashboard[​](#from-the-signalwire-dashboard "Direct link to From the SignalWire Dashboard") Any recording you make will be available in your SignalWire Dashboard for download at the Storage sidebar tab. Navigate to **Storage** > **Recordings** to view, or download your recordings. ### From the REST APIs[​](#from-the-rest-apis "Direct link to From the REST APIs") You can get a list of all videos that have been recorded with a `GET` request at [`https://.signalwire.com/api/video/room_recordings`](https://developer.signalwire.com/rest/signalwire-rest/endpoints/video/list-room-recordings-by-session). The request returns a JSON object with a paginated array of all room recordings, including the id of the room session which was recorded, and a `uri` string that you can use to download the recording. * curl * fetch ``` curl -L -X GET 'https://.signalwire.com/api/video/room_recordings' \ -H 'Accept: application/json' \ -H 'Authorization: Basic ' ``` ``` fetch("https://.signalwire.com/api/video/room_recordings", { method: "GET", headers: { Authorization: "Basic " + btoa("project_id:api_token") }, }) .then((response) => response.json()) .then((json) => console.log(json)); ``` ## Conclusion[​](#conclusion "Direct link to Conclusion") There are several ways you can record your video conferences and calls, most of them just a handful of clicks away. Your recordings will stay in the SignalWire servers so you can access them when you need, and delete them if you don't. --- # Screen Sharing SignalWire Video API allows you to host real-time video calls and conferences on your website. In this guide, we'll learn to add screen sharing ability in your video call interface. ## Getting Started[​](#getting-started "Direct link to Getting Started") It is incredibly easy to allow screen sharing on any project that already uses the SignalWire Video JS SDK. However, if you haven't yet set up a video conference project using the Video SDK, you can check out the [Simple Video Demo](https://developer.signalwire.com/video/getting-started/simple-video-demo.md) guide first. ## Adding a Screen Share feature[​](#adding-a-screen-share-feature "Direct link to Adding a Screen Share feature") To start sharing the screen, you need to call the [RoomSession.startScreenShare()](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md#startscreenshare) method. This will make the browser prompt your user with the browser's screen share dialog like the one shown below. ![A screenshot of Chrome's screen-sharing dialog. The dialog prompts the user to Choose what to share, from option sincluding the entire screen, window, or Chrome tab.](/assets/images/fb7be4d-Screen_Shot_2021-07-06_at_23.18.57-bbf269a760914272d1a7c8296ad73814.webP) After the user selects which screen or tab to share, SignalWire Video SDK will automatically add a new video feed with your screen's contents to the video call. By default, the shared screen will take full-screen role, and a participant will be shown in the top-right corner of the video. For example: ![A screenshot of a Video Conference. The shared screen is full screen, and one member is visible in the top right corner.](/assets/images/c00f48a-Screenshot_2021-11-16_at_16.47.38-640de79a57f5785a412dd806f224b9b4.webP) The shared video goes full-screen, and one of the members is shown in the corner. [RoomSession.startScreenShare()](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md#startscreenshare) asynchronously returns a [RoomSessionScreenShare](https://developer.signalwire.com/sdks/browser-sdk/video/room-session-screenshare.md) object.
To stop the video feed, simply call the [RoomSessionScreenShare.leave()](https://developer.signalwire.com/sdks/browser-sdk/video/room-session-screenshare.md#leave) method. ### Toggle screen share with an HTML button[​](#toggle-screen-share-with-an-html-button "Direct link to Toggle screen share with an HTML button") To put it all together, this is how you would toggle screen share with a button: ``` // Assuming your Room object is named `roomSession` let screenShareObj; async function toggle_screen_share() { if (roomSession === undefined) return; if (screenShareObj === undefined) { screenShareObj = await roomSession.startScreenShare(); } else { screenShareObj.leave(); screenShareObj = undefined; } } ``` You can call the `toggle_screen_share` function from your "Share Screen" button in HTML like so: ``` ``` ### Try it out[​](#try-it-out "Direct link to Try it out") You can try tinkering with a demo on [CodeSandbox](https://codesandbox.io/s/serverless-sound-9omwz). --- # Streaming to YouTube and Other Platforms 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. # Getting started To get started, we need to create a video room, or find the id of an existing one. You can create a new room either from the REST APIs, or from the UI. For this guide, we will use a room with UI included. See [Integrating Video Conferences With Any Website in Minutes](doc:integrating-video-meetings-with-any-website) for instructions on how to create a room. You also need to set up your streaming service. Any service supporting RTMP or RTMPS works with SignalWire. In any case, you will need a stream URL and, sometimes, a stream key. For YouTube, you will find your stream key and your stream URL in a screen such as the one depicted in the image below. ![A screenshot of the YouTube stream parameters menu. The Stream Settings tab is selected, with fields for Stream Key type, Stream Key, Stream URL, and Backup server URL. Appropriate SignalWire parameters have been entered in each field.](/assets/images/yt-rtmp-639c59b34285191fd877836a1436c6e8.webP) YouTube stream parameters. Regardless of the streaming service that you are using, you need to make a note of the stream URL (which usually starts with "rtmp") and, when provided, of the stream key. # Connecting the stream with the Dashboard UI If you would like your video conference to start a stream every time you enter the video room, you can set up a stream from the room's settings. This will start a stream automatically when you join the room from the Dashboard or when you join the room embedded in an external application. From your Video Dashboard, click on the name of the conference you would like to use. This setting is only available on conferences with UI included. Then, click on the Streaming tab. ![A screenshot of the Streaming tab of a given Video Conference on the Video page of a SignalWire Space. The Streaming tab includes a field labeled Stream URL, where the room's video stream will be sent.](/assets/images/pvc-streaming-settings-39d18de9a83bdb1f821a88418b2df5fa.webp) Streaming tab in room settings Click the blue "Setup a Stream" button and input the RTMP URL. If there is no stream key, simply use the stream URL that you copied from the streaming service. If you have a stream key, append it to the stream URL, separated by a slash like this: `rtmp:///`. Then, hit "Save". You can delete the stream later if you need to from the ⋮ menu. You can now start the room by joining it from the Dashboard or from where it is embedded. You should be able to see your stream in the streaming service within a few seconds. caution Setting up streaming in the Programmable Video Conference (PVC) room settings will automatically start the outbound stream in any active instance of the room. That means that if you embed the same PVC in multiple applications, the stream will start when the room is joined from any of those applications. Ensure the room is embedded in a secure application accessible only to users who you would like to be able to stream. # Connecting the stream with REST APIs We can also use the REST APIs to connect a room to the stream. We need five things: * Your Space name. This is the `` in your Space URL `.signalwire.com` * Your Project Id. * Your API token. * The UUID of the room you want to stream. From your SignalWire Space, open the configuration page for your room: you will find the UUID in the URL, which will look like this: `431dcfbe-2218-44ae-7e2f-b5a11a9c79e9`. * The final RTMP URL. If you don't have a stream key, simply use the stream URL that you copied from the streaming service. If you also have a stream key, append it to the stream URL, separated by a slash. Like this: `rtmp:///`. ![A screenshot of a SignalWire Space on the Video tab. The UUID of the selected video room is underlined in red as the alphanumeric string following a slash in the URL.](/assets/images/screenshot-5eea84084050c3975ec10c397e00e088.webP) The UUID of the room is in the URL of the configuration page for that room. We are now ready to associate the stream with the room. If you are using a room with UI included: ``` curl --request POST 'https://.signalwire.com/api/video/conferences//streams' \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ -u ":" --data-raw '{ "url": "" }' ``` If you are using a room without UI included: ``` curl --request POST 'https://.signalwire.com/api/video/rooms//streams' \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ -u ":" --data-raw '{ "url": "" }' ``` You can now start the room by joining it. You should be able to see your stream in the streaming service within a few seconds. caution As with setting up a stream in the Dashboard UI, setting the stream with the REST API will automatically start the outbound stream in any active instance of the room. Ensure the video conference is embedded in a secure application accessible only to users who you would like to be able to stream. # Connecting the stream with SDKs Finally, you may choose to use the Video SDK to set up the stream. With this option, you can build an application that starts and stops the RTMP stream. You can see a [full demo application](https://github.com/signalwire/guides/tree/main/Video/RTMP-Streaming) on the Guides Repo. For this demo, we first created a PVC in the Video Dashboard and copied the embed code. We pasted the embed code in an html file and added buttons to start and stop the stream. ```

If your streaming service provides a stream key, append it to the stream URL, separated by a slash.
ex: rtmp://<stream_url>/<stream_key>.

``` Later, we will put click handlers on the start and stop buttons to call [`startStream`](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md#startstream) and [`stopStream`](https://developer.signalwire.com/sdks/browser-sdk/video/room-session-stream.md#stop) respectively. The [`startStream`](https://developer.signalwire.com/sdks/browser-sdk/video/room-session.md#startstream) function is available on the Room Session object, so first we need to use the [`setupRoomSession`](https://developer.signalwire.com/video/conference/technical-reference.md) callback function on the PVC to get that object. So, the `VideoConference` constructor at the end of the embed script should look like this: ``` SignalWire.AppKit.VideoConference({ token: "vpt_40b...458", setupRoomSession: setRoomSession, }); ``` We can then access `setRoomSession` in the external JavaScript file and use the Room Session object returned to set event listeners and click handlers. The JavaScript file will look something like this: ``` let roomSession; let stream; const stopStream = () => { if (stream) { stream.stop(); } }; const setRoomSession = (session) => { roomSession = session; roomSession.on("room.left", () => { stopStream(); }); }; document.addEventListener("DOMContentLoaded", () => { document.getElementById("rtmp-form").onsubmit = async (e) => { e.preventDefault(); const url = document.getElementById("stream-url").value; try { stream = await roomSession.startStream({ url }); } catch (error) { console.log(error); alert( "There was an error starting the stream. Please check your URL and try again." ); } }; document.getElementById("stop").onclick = (e) => { e.preventDefault(); try { stopStream(); } catch (e) { console.log(e); } }; }); ``` The full demo application has some cosmetic additions, but these two files are all you need to get an RTMP outbound stream set up from any application with an embedded PVC. You should be able to see your stream in the streaming service within a few seconds of pressing "Start Stream". While this demo used a PVC, you can use the same methods on a video room without the prebuilt UI. For a complete guide on building video rooms without a prebuilt UI, see [Simple Video Demo](https://developer.signalwire.com/video/getting-started/simple-video-demo.md). From there, you can add start and stop stream buttons and hook them up in the same way as above. # Wrap up We showed the options to configure an RTMP stream that allows you to stream the content of your video room to any compatible streaming service: the Dashboard UI, a POST request, or an SDK application is all you need. # Resources * [API Streams Reference](https://developer.signalwire.com/rest/signalwire-rest/endpoints/video/list-streams-by-room-id) * [SDK Streaming Demo](https://github.com/signalwire/guides/tree/main/Video/RTMP-Streaming) * [SDK Streaming Reference](https://developer.signalwire.com/sdks/browser-sdk/video/room-session-stream.md) * [PVC Reference](https://developer.signalwire.com/video/conference/technical-reference.md) --- # Switching Webcams or Microphones During a Call 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. ## Getting Started[​](#getting-started "Direct link to Getting Started") It is very easy to switch between input devices once you have the SDK up and running. However, if you haven't yet set up a video conference project using the Video SDK, you can check out the [Simple Video Demo](https://developer.signalwire.com/video/getting-started/simple-video-demo.md) guide first. ## Getting a list of supported input devices[​](#getting-a-list-of-supported-input-devices "Direct link to Getting a list of supported input devices") First, we want to find out what devices are available as input. Getting the list of media devices is handled by the `WebRTC` object available via `SignalWire.WebRTC` from the SDK. The methods in the `WebRTC` allow you to get the list of microphones, cameras, and speakers. ### Listing webcams[​](#listing-webcams "Direct link to Listing webcams") To get the list of connected devices that can be used via the browser, we use the `getCameraDevicesWithPermissions()` method in `WebRTC`. The method returns an array of [InputDeviceInfo](https://developer.mozilla.org/en-US/docs/Web/API/InputDeviceInfo) object, each of which have two attributes of interest to us here: `InputDeviceInfo.deviceId` and `InputDeviceInfo.label`. The `label` will be used to refer to the webcam via the UI, and looks like 'Facetime HD Camera' or 'USB camera'. The `deviceId` is used in your code to address a particular device. ``` const cams = await SignalWire.WebRTC.getCameraDevicesWithPermissions(); cams.forEach((cam) => { console.log(cam.label, cam.deviceId); }); ``` ### Listing microphones[​](#listing-microphones "Direct link to Listing microphones") Exactly as with `getCameraDevicesWithPermissions()`, we can use the `getMicrophoneDevicesWithPermissions()` to get a list of allowed microphones. ``` const mics = await SignalWire.WebRTC.getMicrophoneDevicesWithPermissions(); mics.forEach((mic) => { console.log(mic.label, mic.deviceId); }); ``` ## Changing webcams and microphones[​](#changing-webcams-and-microphones "Direct link to Changing webcams and microphones") Once you have set up the video call with `SignalWire.Video.joinRoom()` or equivalent methods, we can use `Room.updateCamera()` and `Room.updateMicrophone()` to change devices. As a simplified example: ``` const roomSession = new SignalWire.Video.RoomSession({ token, rootElement: document.getElementById("root"), // an html element to display the video iceGatheringTimeout: 0.01, requestTimeout: 0.01, }); try { await roomSession.join(); } catch (error) { console.error("Error", error); } const cams = await SignalWire.WebRTC.getCameraDevicesWithPermissions(); const mics = await SignalWire.WebRTC.getMicrophoneDevicesWithPermissions(); // Pick the first camera in the list as the new video input device roomSession.updateCamera({ deviceId: cams[0].deviceId, }); // Pick the first microphone in the list as the new audio input device roomSession.updateMicrophone({ deviceId: mics[0].deviceId, }); ``` *Note that you don't explicitly have to update camera and microphone. SignalWire Video SDK chooses the preferred input devices by default on setup. Only `updateCamera` or `updateMicrophone` when you want to switch to a non-default device.* ## A complete code example[​](#a-complete-code-example "Direct link to A complete code example") A complete demo of switching between examples is available for you to read and experiment on [CodeSandbox](https://codesandbox.io/s/lingering-glitter-r8bxl). You can tinker with the code without leaving your browser. The functions of interest to us here are at `src/frontend/index.js`. Look for functions `populateMicrophone()` and `populateCamera()`. --- # Video Overlays SignalWire renders the video of your room in the cloud. This means that everyone sees the same content, and you could have a virtually unlimited number of connected users: the network link between your computer and SignalWire's server will only need to carry a single video stream, no matter what. To give your clients metadata about the position of the different video members within the cloud-rendered video stream, SignalWire APIs support the concept of *layers*. In a few words layers indicate, at any instant of time, the semantic content of each portion of the video stream. We can use this information for example to show the name of a member whenever the user hovers its mouse over it, and much more. In this demo app, we will just show how to display a selection indicator as follows: ![An animated gif showing a SignalWire video room with three participants. The mouse hovers over each participant. This hover action initiates a blur effect on the selected participant video.](https://i.ibb.co/zbPncdc/selection.gif) ## Frontend[​](#frontend "Direct link to Frontend") We will make all our changes to the `