Appearance
Getting Started
FreshAddresses
Each Resource is uniquely identified by its Address, allowing for precise targeting and interaction within the Call Fabric ecosystem. This simplifies the development process by providing a standardized way to handle different communication elements, and enhances flexibility, as developers can interact with a wide range of communication tools using a unified approach.
Resources can have multiple addresses, and addresses are mutable. For instance, you can map a SWML script and a Video Room to the same Resource Address. These addresses can be changed or deleted later as needed.
Types
Call Fabric supports multiple address types to accommodate different communication protocols and use cases:
- Phone numbers: Traditional phone numbers in E.164 format (e.g.,
+14155551234) that can be mapped to resources for PSTN connectivity. - SIP addresses: SIP URIs for VoIP communications (e.g.,
sip:user@domain.com) enabling direct SIP endpoint connections. - Alias: Custom names that provide alternative addressing for resources, making them easier to remember and use (e.g.,
/support-queueor/main-conference).
Each address type follows the same context and naming conventions described below, allowing seamless integration across different communication channels.
Each Resource Address has two components:
- Context: Identifies the path of the address. Currently can be
publicorprivate. - Name: By default the name of the address will be the name of the resource, however, a user can also change or add an
aliasof an address.
For example, the address for an AI Agent resource named Alice-AI in the public context would be /public/Alice-AI. If you were to change the alias to John-AI the address would become /public/John-AI.
If you are interacting with a resource from within the same context, you can omit the context from the address. For example, if you are interacting with a Subscribers resource named Bob from within the private context, you can use the address /Bob instead of /private/Bob.
Once you have created a Resource, you can use the address to interact with it within the Call Fabric ecosystem. Additionally, you can view the created resource in the Resources tab of the SignalWire Dashboard. Here, you can view the address, type, and other details of the resource.
The Resources page of the SignalWire Dashboard.
The filterable Resources list in the SignalWire Dashboard.
\\\*
title: Chat position: 0 subtitle: Programmable, integrated, low-latency Chat APIs and SDKs
For a complete index of all SignalWire documentation pages, fetch https://signalwire.com/docs/llms.txt
The SignalWire Chat API is a flexible IP Message Bus that you can use to send and receive messages.
## PubSub
The most basic chat functionality is provided in a **PubSub** environment, which has two main components: **Channels** and **Messages**. Messages are published to a channel and the new message event is available to any subscribers. This means the publishers and subscribers are isolated and do not need to know where the messages are coming from or being read. If this sounds like the messaging model that meets your needs, check out our PubSub service.
Create PubSub Tokens
Integrate PubSub into your web app
Manage subscriptions and event listeners
## Chat
**Chat** service extends PubSub with a third main component: **Members**.
You can create channels, members can subscribe to those channels, and they can send attributed messages that every other subscriber will be able to see. Members can even carry state. If this model better suits your needs, Chat is for you!
Create Chat Tokens
Integrate Chat features into any web app
Manage members, subscriptions and event listeners, and send messages to a particular channel.
## Frequently asked questions
Chat can be used to send and receive any JSON-serializable object.
Yes! Channels are essentially group chats that members can join and exchange messages in. If you intend to create group chats that use SMS as well, please read the next frequently asked question.
While Chat does not support sending/receiving via SMS by default, using RELAY Realtime SDK along with our [Messaging API](/docs/platform/messaging) you can add SMS support (or any other format of communication) to it!
Yes! You can use Chat along with \Dialogflow\ to create chatbots according to your needs.
Using the [SDK's Chat API](/docs/server-sdks/reference/python/rest/chat) you can listen for the "message" event and log each message accordingly.
What is E911?
E911, or Enhanced 911, is a support system for wireless and VoIP phone users who dial 911, the standard number for requesting help in an emergency across supported countries. Since wireless users are often mobile, this enhancement helps the 911 service by allowing the location of the user to be reported to the call receiver.
SignalWire Addresses allows for a collection of addresses in your SignalWire Space so that they can be utilized for uses like E911 or phone number locality requirements for certain countries around the world.
E911 requires a support request
By default, SignalWire phone numbers purchased through the Dashboard don’t support E911. To enable E911 services, contact the SignalWire Support Team by creating a support ticket in your Dashboard.
Testing E911
There is a proper way to test E911 for your SignalWire number. It’s best to arrange a test call to 911 services and verify the E911 information pops up on their screen correctly. You can call your local 911 center non-emergency number, and notify them you’re testing a VOIP system for the correct display of location information. You should be able to get the non-emergency phone number from local law enforcement or an internet search. All 911 centers have a non-emergency number for testing purposes.
“How do I place a “test” call to make sure 911 works for me?”
“Test calls confirm that your local 911 service can receive your 911 call and has the correct location information. Test calls can be scheduled by contacting your local 911 call center via its non-emergency phone number. To contact the local 911 center responsible for answering calls from your location, go here and click on the state in which you are located. The person responsible for operating the state’s 911 system will be identified, and they should know who you should talk to at your local 911 call center, to schedule a day and time for test calls.”
As stated before, SignalWire phone numbers purchased through the Dashboard don’t support E911. If you’d like to have E911 services enabled, please contact the SignalWire Support Team. Once E911 is enabled for the number by working with the SignalWire support team, you can follow these steps to set up E911 and make a test call:
- Complete the Set of Instructions from the Previous Section.
- Wait about 30 minutes for SignalWire to properly set up E911 on your line.
- Do a test call to 933 first, and listen to your E911 info playback. If you hear the automated information, you’re ready to do a real test.If you hear an error tone, wait a little longer, then try again.
- Call your local police department’s non-emergency number. Let them know you’re making a VoIP test call to verify location information.
- Once you’ve notified your local emergency center of an incoming test call, make the real call to 911 and verify your address displays correctly with the answering personnel.
Provided all the information displays correctly, your verification process for E911 services is complete. The carriers validate the address. If it passes, you’re good to go.
\\\*
title: Get started subtitle: The SignalWire platform slug: getting-started position: 0
For a complete index of all SignalWire documentation pages, fetch https://signalwire.com/docs/llms.txt
SignalWire is a programmable unified communications platform that unifies voice, messaging, video, and AI into a single control plane. SignalWire's APIs and SDKs enable developers to build state-of-the-art realtime communication experiences without needing to manage complex telecom infrastructure or stitch together disconnected tools.
This guide will help you set up your account, explore the core APIs, and launch your first application.
## Your SignalWire Space
When you \create a SignalWire account, you also create a **Space**, like `spacename.signalwire.com`. Your \Dashboard\ is located at that subdomain. In your Dashboard, you can:
\* Buy and configure phone numbers \* Create and manage your applications \* View call logs and analytics \* Access your API credentials \* Set up AI agents, call flows, and more
!\The SignalWire Dashboard\
## Start building
Let's begin by figuring out the best way for you to build. The right approach depends on what you're creating and how you prefer to work.
### What are you trying to build?
**You want to build an AI-powered voice agent that handles phone calls.**
This is common for:
\* Automated customer service \* Appointment scheduling and reminders \* FAQ bots and information lines \* Lead qualification and surveys \* Virtual receptionists
**[Agents SDK](/docs/server-sdks)** - A Python framework for building sophisticated AI voice agents. You get full control over prompts, custom functions (SWAIG) dedicated to AI, customizeable conversation flow, and seamless LLM integration. Best for complex agents that need to perform actions like booking appointments, looking up data, or integrating with your systems.
**[AI Agent (Dashboard)](/docs/platform/ai/no-code-agents)** - Configure an AI agent directly in your Dashboard without writing code. Set up prompts, choose a voice, add functions, and connect it to a phone number. Great for getting started quickly or simpler use cases.
**[SWML with AI](/docs/swml/reference/ai)** - Add AI capabilities to your SWML scripts using the `ai` method. Good when you want AI as part of a larger call flow that includes other logic.
Python, full control
AI in call flows
No-code setup
Quick start with Agents SDK:
```bash pip install signalwire-agents ```
```python from signalwire_agents import AgentBase
class MyAgent(AgentBase): def __init__(self): super().__init__(name="Assistant", route="/agent") self.prompt_add_section("main", body="You are a helpful assistant for Acme Corp.")
agent = MyAgent() agent.serve() ```
Build your first AI voice agent
**You want voice, video, or chat directly in a web browser or mobile app.**
This is common for:
\* Click-to-call buttons on websites \* In-app voice or video calling \* Browser-based contact centers \* Video conferencing applications
**[Browser SDK](/docs/browser-sdk)** - Our JavaScript SDK for building custom WebRTC experiences. You get full control over the UI and user experience. Best when you need video conferencing, custom calling interfaces, or real-time chat.
**[Click-to-Call](/docs/browser-sdk/click-to-call)** - A pre-built widget you can drop onto any website. Users click a button and call you directly from their browser. Minimal code required - great for adding a "call us" button quickly.
Build voice, video, and chat in the browser
**You're building a backend service that handles calls or messages.**
This is common for:
\* IVR systems and phone menus \* Automated call routing \* SMS notifications and two-factor auth \* Call centers and support systems \* AI voice agents
Do you need real-time control?
**If you need simple call handling** (IVRs, call forwarding, playing messages), use **[SWML](/docs/swml)**. Your server responds to webhooks with JSON/YAML instructions. It's stateless, works with any programming language, and is the simplest approach for most use cases.
**If you need real-time control** (live call monitoring, mid-call transfers, complex orchestration), use the **[Realtime SDK](/docs/server-sdks)**. It maintains a persistent WebSocket connection for instant, bi-directional communication. Best for applications that need to react to events as they happen.
**If you're building AI voice agents**, use the **[Agents SDK](/docs/server-sdks)**. It's a Python framework specifically designed for creating conversational AI that handles phone calls. It handles the complexity of integrating with LLMs and managing conversations.
AI voice agents, Python
HTTP webhooks, any language
WebSocket, Node.js
**You want to build without writing much (or any) code.**
This is common for quick prototypes, simple IVRs, and small businesses needing basic call handling.
**[Call Flow Builder](/docs/call-flow-builder)** - A visual, drag-and-drop interface for building call handling logic. No code required. You connect nodes to define what happens when someone calls - play a message, gather input, route to different people, etc.
**[SWML Scripts](/docs/swml)** - Write simple JSON or YAML scripts directly in your Dashboard. It's not quite "no code" but it's very low code, and you don't need to run any servers. SignalWire hosts the scripts for you.
**[AI Agent](/docs/platform/ai/no-code-agents)** - Configure a conversational AI agent through your Dashboard. Set up prompts, choose a voice, and connect it to a phone number. The AI handles conversations autonomously.
Visual drag-and-drop
Simple JSON/YAML
Dashboard AI setup
Quick start for no-code:
1. **Buy a phone number** - Go to Phone Numbers in your Dashboard 2. **Create a Call Flow** - Use Call Flow Builder to design what happens when someone calls 3. **Assign it to your number** - Edit the number settings and select your Call Flow 4. **Call your number** - Test it out!
**You have an existing Twilio application and want to move to SignalWire.**
Good news, SignalWire's **[Compatibility API](/docs/compatibility-api)** is designed as a drop-in replacement. In most cases, you can switch by changing a few lines of code.
What's compatible:
| Twilio | SignalWire | | ---------------- | --------------------------------------------------------------------------------------- | | TwiML | [cXML](/docs/compatibility-api/cxml) (same syntax) | | REST API | [Compatibility REST API](/docs/compatibility-api/rest) | | Helper Libraries | [Compatibility SDKs](/docs/compatibility-api/rest/client-sdks) (Node, Python, Ruby, C#) | | Account SID | Project ID | | Auth Token | API Token |
AI is **not supported** in the Compatibility API. Check out the **AI Application** section instead.
Migration steps:
1. **Create a SignalWire account** at \signalwire.com/signup
2. **Get your credentials** from Dashboard > API > API Tokens 3. **Update your code** to use SignalWire's SDK and credentials 4. **Update webhook URLs** if needed (cXML syntax is identical to TwiML) 5. **[Buy](/docs/platform/phone-numbers) or [port](/docs/platform/porting-into-signalwire) phone numbers** to SignalWire 6. **Test** your application
```javascript // Change from this (Twilio) const twilio = require("twilio"); const client = twilio(ACCOUNT_SID, AUTH_TOKEN);
// To this (SignalWire) const { RestClient } = require("@signalwire/compatibility-api"); const client = RestClient(PROJECT_ID, API_TOKEN, { signalwireSpaceUrl: "your-space.signalwire.com" }); ```
Complete migration documentation
\\\*
## Core concepts
### Communication channels
SignalWire supports the following communication channels:
Phone calls, IVRs, recording, conferencing
Video rooms, screen sharing, recordings
SMS and MMS text messages
Real-time chat for web and mobile apps
Intelligent voice agents powered by LLMs
Send and receive faxes programmatically
Most channels can work over different **transports** depending on how you want to connect:
| Transport | What it is | Common uses | | ---------- | ------------------------------------- | ----------------------------------------------------------------------------- | | **PSTN** | The traditional phone network | Calling regular phone numbers, receiving calls from landlines and cell phones | | **SIP** | Voice over IP protocol | Connecting PBX systems, desk phones, softphones, and VoIP carriers | | **WebRTC** | Browser-based real-time communication | In-app calling, video conferencing, browser-based contact centers |
For example, a voice call could come in via PSTN (someone dialing your number), SIP (from a desk phone), or WebRTC (from your web app). **SignalWire will handle all three.**
### Phone numbers
To make or receive calls and messages through the phone network, you'll need SignalWire phone numbers. You can buy local numbers, toll-free numbers, or short codes directly from your Dashboard or the [API](/docs/apis/rest/phone-numbers/purchase-phone-number).
Each number can be configured to handle incoming calls and messages differently - whether that's forwarding to another number, running a script, connecting to an AI agent, or triggering your own application.
How to buy, configure, and manage your numbers
We also offer the option of purchasing phone numbers programmatically via our [Purchase a Phone Number](/docs/apis/rest/phone-numbers/purchase-phone-number) API Endpoint.
### Resources
In SignalWire, a **Resource** is anything that can handle communications - an AI agent, a script, a SIP connection, or your own application. When a call or message comes in, you tell SignalWire which Resource should handle it.
Common resource types include:
\* **SWML Scripts** - Simple JSON/YAML instructions hosted in your Dashboard \* **AI Agents** - Conversational AI that handles calls autonomously \* **Call Flows** - Visual drag-and-drop call routing \* **Relay Applications** - Your own server applications connected via WebSocket
Understanding the different resource types
### Addresses
Every Resource has an **Address**. This is a unique identifier that lets you target and interact with it. Think of addresses as the **phone number** for any resource, but broader in scope.
Addresses can be:
\* **Phone numbers** - Traditional numbers like `+14155551234` for PSTN calls \* **SIP addresses** - For VoIP connections like `sip:user@domain.com` \* **Aliases** - Custom names like `/support-queue` or `/main-conference` that are easy to remember
A single Resource can have multiple addresses, and you can change them anytime. For example, you might point both a phone number and a custom alias to the same AI agent.
How addressing works in SignalWire
### Subscribers
**Subscribers** are end users who authenticate with SignalWire to make and receive calls. If you're building a contact center, business phone system, or video conferencing app for example, your users become Subscribers.
SignalWire manages these users for you. You create, update, and delete them through our REST APIs, and each Subscriber gets:
\* **Authentication** - Secure credentials and tokens for logging in \* **A callable address** - They can be reached directly at `/private/username` \* **Multi-device support** - They can answer calls from a browser, mobile app, or desk phone
This means you don't have to build user management, authentication, or device registration yourself - SignalWire handles it.
User management and authentication
\\\*
## Next Steps
Once you've chosen your path, here are some resources to help you along the way:
\* **\Discord Community\* - Join 8,000+ developers. Great for questions and sharing what you're building. \ **\GitHub\* - Example code, SDKs, and open source tools. \ **[API Reference](/docs/apis)** - Detailed documentation for all our APIs.
If you get stuck or have questions, our support team is here to help at [support@signalwire.com](mailto:support@signalwire.com).
*Twilio and TwiML are trademarks of Twilio, Inc. SignalWire, Inc. and its products are not affiliated with or endorsed by Twilio, Inc.
Media URL protection
Media URL Protection controls access to media files generated by your SignalWire services, including call recordings, MMS attachments, and fax documents.
By default, these media URLs are publicly accessible to anyone with the direct link, but they contain randomly generated UUIDs that make them virtually impossible to discover or guess. This provides security through obscurity, but may not be sufficient for applications handling sensitive content.
When Media URL Protection is enabled, accessing these URLs requires authentication using your project’s API credentials. This uses the same authentication method as other SignalWire API endpoints. Unauthorized attempts will be denied.
For more information about API credentials and how to use them, see the API credentials documentation.
Configuring media protection
1
Select your project
Navigate to the projects page and select the project where you want to configure media protection.
2
Access project settings
Once in your project dashboard, click on the area where your project name is displayed. This should open a menu with an option called Project Configuration. Click on this option to be directed to the project settings page.
Project settings menu.
Project settings menu
3
Locate media URL protection
Scroll down to find the Media URL Protection Details section, which contains three independent toggles:
- Protect Recording Media URLs - controls access to call recordings generated by your voice services.
- Protect Message Media URLs - applies protection to media attachments sent through SMS and MMS messages, including images, documents, and other attached files.
- Protect Fax Media URLs - secures fax documents and their attachments. Fax metadata and delivery confirmations remain unaffected.
Media Protection Interface.
Media URL Protection settings in your Project Dashboard
4
Enable protection
Toggle any combination of the three protection options from No to Yes based on your security requirements. Changes take effect immediately.
5
You’re protected
Now when a request is sent to a media URL, if no valid authentication is provided, the request will be denied!
Resources
Resources are the primary entities for communication within the Call Fabric ecosystem. They are the building blocks of the system, representing the various communication elements that can be used to interact with subscribers.
Manage Resources
With the REST API
Use the Resources endpoints to manage your Resources programmatically.
Resources endpoints\ \ Control Resources using the SignalWire REST API.
In the Dashboard
The Dashboard is your unified command center for your SignalWire Space. Access it at {your-space-name}.signalwire.com.
Create
No Resources tab?
If you don’t see the My Resources tab, your SignalWire Space is on the Legacy Dashboard. Refer to the Legacy section of this guide for instructions for your Dashboard and information about the migration.
1
Navigate to Resources
To create a Resource in your SignalWire Space, click on the My Resources tab in the left-hand navigation menu.
From there, you can select the type of Resource you would like to create by clicking on the + Add button.
2
Configure the Resource
What's a Resource?
Resources are the building blocks of SignalWire applications. They include AI Agents, SWML Scripts, cXML Scripts, SIP Endpoints, and more.
Create a new Resource from the Dashboard.
Create a new Resource from the Dashboard
Click the Add button to select from the grid of available Resource types.
Select a Resource in the Signalwire Dashboard.
The Resource selection menu
Alternatively, you can create new Resources from their subpages in the sidebar menu, or using the shortcuts on the Dashboard homepage.
After selecting a Resource, enter the details for the Resource on a new page, and select Create to confirm.
Modify or delete
From the Resources page in your SignalWire Dashboard, select the desired Resource to open a detailed view. Here, by selecting the Edit button, you can alter the specifics of the Resource.
The list of Resources in a SignalWire Space.
The list of Resources in a SignalWire Space
In the Legacy Dashboard
The Resources experience is not available in the Legacy Dashboard.
To upgrade your Space to the New UI, contact Support.
Which Dashboard version am I using?
New Dashboard: You have a Resources tab in the left sidebar.
Legacy Dashboard: You have separate tabs for SIP, LaML, RELAY, etc.
Create an account
Sign up for a SignalWire account.
1
Sign up
Initiate the process by entering an email address or selecting a supported authorization provider.
Sign up for a SignalWire account\ \ Open a new account and reserve a unique .signalwire.com Space domain.
2
Name your SignalWire Space
This is your unique .signalwire.com domain to which all services are tied. We recommend using your company name.
Keep the following in mind:
Choose wisely
Once set, your Space domain cannot be changed except by a Support request.
Multiple spaces
You can create multiple Spaces associated with your SignalWire account.
Accounts, Spaces, Projects
Each Space can contain multiple Projects.
3
Create a project
Projects are used to group resources according to your preference, such as by customer account, by geographical region, or any other classification. Name your project something that will help to distinguish it from the other projects you will make in the future, and you’re ready to go.
Now you have a SignalWire Space and your first project. Congratulations!
Next steps
Take your next steps by exploring the Dashboard, verifying a phone number for outbound Caller ID, and exiting Trial Mode by adding at least $5 in credit.
What are subscribers?
Subscribers are the core Resources in SignalWire’s Call Fabric platform that represent users in your communication system. More than just a simple user account, Subscribers provide a complete user management solution with built-in authentication, communication endpoints, and billing integration.
Subscribers represent users in your communication system with enterprise-grade capabilities built-in. They embody SignalWire’s approach to Programmable Unified Communications (PUC), enabling you to onboard and manage users at scale without building complex infrastructure from scratch.
What’s included
Every Subscriber comes with four core components that work together to provide a complete user management solution:
Identity & authentication
Secure user management with industry-standard credential storage for usernames and passwords. Extensible profile system for names, emails, company details, timezones, and locations.
Communication endpoints
Multi-channel connectivity with private Call Fabric address for internal communication plus public phone numbers for external calls. Full SIP, WebRTC, and PSTN support.
Flexible configuration
Customizable codec settings, encryption options, and SIP/WebRTC protocols. Configurable communication preferences and routing rules.
How it works
Subscribers are built on three core technical systems:
Resource addressing
Subscribers use Call Fabric’s unified addressing system for consistent identification across all platform Resources. Each Subscriber is uniquely identified by an address in the format /<Context>/<Name>.
Addresses make Subscribers directly callable. When a call is placed to a Subscriber’s address, Call Fabric automatically routes the call directly to that Subscriber. This enables seamless peer-to-peer communication without complex routing configuration.
Common address examples:
| Address | Description |
|---|---|
/private/john-doe | Direct dial to John’s devices |
/public/support-agent | Publicly accessible support line |
/private/jane?channel=video | Video call to Jane |
How direct calling works:
- When someone calls
/private/john-doe, the call rings John’s registered device - The Subscriber can answer on any device (mobile app, web browser, desk phone)
- Call Fabric handles device registration, presence, and simultaneous ring automatically
Subscribers default to private context for security, with optional public aliases for external access. Learn more about Resource Addresses, including contexts, naming conventions, and advanced routing options.
Authentication system
Multiple token types provide flexible security and integration options:
Subscriber Tokens\ \ Standard user authentication\ \ For End Users: Issued during login, provide access to user-specific resources. Perfect for web and mobile app authentication flows. Guest Tokens\ \ Temporary guest access\ \ For Guest Users: Allows Subscribers to create guest tokens that provide temporary access to specific Resource addresses. The guest token creates a temporary subscriber with limited permissions to access only the specified allowed_address. Invite Tokens\ \ Client-side API access\ \ For Client Applications: Creates a Subscriber Invite Token that enables client-side bearer token authentication for API calls. Refresh Tokens\ \ Session management\ \ For Seamless Experience: Handle automatic token renewal and session management without frequent re-authentication.
API management
Complete REST API with full CRUD operations for programmatic control:
Create Subscriber\ \ Create new subscribers\ \ Individual or bulk creation with profile data, credentials, and configuration settings. Retrieve Subscriber\ \ Get subscriber details\ \ Fetch individual Subscriber information, settings, and current status. Update Subscriber\ \ Modify subscriber data\ \ Update profile information, settings, credentials, and configuration options. Remove Subscriber\ \ Delete subscribers\ \ Remove Subscribers and associated data with proper cleanup and notifications.
Bulk operations handle large user populations efficiently, while webhooks provide real-time notifications for lifecycle events, authentication, and communication activities.
Integration example
Here’s how Subscribers work in practice with the Browser SDK:
Authentication
Making calls
Receiving calls
import { SignalWire } from "@signalwire/js";
// Initialize the client with your token
const client = await SignalWire({
token: "<TOKEN>" // Replace with your actual token
});
// Client is now ready to make and receive calls
console.log("SignalWire client initialized");Common use patterns
- Peer-to-peer calling: Direct subscriber-to-subscriber calls using private addresses like
/private/john-doe - Conference rooms: Multiple subscribers joining shared resources like
/public/team-meeting - AI agent interaction: Subscribers calling AI agents at addresses like
/public/support-ai - PSTN & SIP calling: Ability to call PSTN and SIP destinations directly from Subscriber applications
Common use cases
These technical patterns enable real-world applications across industries:
Contact centers
Agent management made simple
Secure agent onboarding, real-time presence tracking, call routing with queues, and conference bridge integration.
Business phone systems
Enterprise communication
Complete UCaaS/VoIP platforms with call routing, advanced features, multi-channel support, and user lifecycle management.
Video platforms
Personalized video experiences
User authentication, cross-platform compatibility, meeting management, and comprehensive usage analytics.
Value proposition & pricing
$3/user/month - No setup fees, hidden costs, or complex calculations. Includes complete user management, authentication, multi-channel communication, and enterprise-grade security.
Why choose subscribers?
At $3/user/month, Subscribers provide a complete user management solution with built-in infrastructure:
Complete infrastructure
User management, authentication, billing systems, and communication infrastructure included. Production-ready capabilities without custom development.
Enterprise-grade security
Built-in security controls and compliance features. Industry-standard authentication and encryption without additional implementation.
Predictable scaling
Fixed per-user pricing with no hidden costs. Infrastructure automatically scales without rearchitecting your application.
Developer-first integration
Complete REST APIs, SDKs, and comprehensive documentation. Straightforward integration with existing systems using standard protocols.
Get started
Ready to implement Subscribers? Follow these steps:
1
Create your first subscriber
Navigate to the SignalWire Dashboard and create your first Subscriber through the Resources section. This establishes your user entity and generates authentication credentials.
2
Configure user profile
Set up credentials, contact information, and Resource addresses. Configure timezone, location, and other profile details for cross-channel communication.
3
Set security context
Configure private and public contexts based on your security needs. Determine which Subscribers need public aliases and establish access controls.
4
Implementation
Use the Browser SDK or REST API to connect your application with Subscriber authentication. Implement token management and session handling.
SignalWire tools
Learn about the tools built to streamline the developer experience of building with SignalWire tools.
SWSH\ \ Manage your Spaces and Projects from the command line with the powerful and scriptable SignalWire Interactive Shell WireStarter\ \ Quickly bootstrap a versatile development and testing environment with the WireStarter Docker container, pre-loaded with demo apps for immediate use
Video
SignalWire Video is a powerful WebRTC video conferencing tool built on an MCU (Multipoint Control Unit) that handles all the muxing in the cloud. A single unified stream is sent to each participant, resulting in low latency, high quality, and the same video stream for all users.
REST APIs\ \ Use classic HTTP calls to create and maintain tokens, rooms, sessions, and recordings. SDK Video Reference\ \ Manage video rooms, sessions, recordings, and streams. Browser SDKs (v2 and v3)\ \ Make audio/video calls to phone numbers, SIP endpoints, and other browsers.
Frequently asked questions
Can I programmatically create rooms and control attendee permissions?
Yes. Please check out our API reference to see how to create a room with a prebuilt\ UI (a Programmable Video Conference) with a room without a prebuilt UI.
How long can room names be?
Room names can be up to 100 characters, with a display name of up to 200 characters. Be sure to avoid using ”/” in room names.
How can I define user permissions?
You define a user’s permissions for a room when you generate their access token. See the room_tokens API endpoint. Access tokens for Programmable Video Conferences are generated when the conference is created. The response object includes tokens for moderators and guests. Guest tokens will only have permissions to modify their own settings while moderators can effect their own settings, room settings, and settings for other participants.
Do video tokens expire?
No, by default all tokens will last indefinitely. You can alter the lifetime of your tokens using a variety of parameters, more detail here.
Are the video tokens signed or encrypted?
The video tokens are signed and are secure. Encryption cannot be implemented on the user-end without causing problems as SignalWire would then need to decrypt them.
Can users be blocked by IP address?
Not at the SignalWire/Token level. You would have to block them from your website/application.
Is the Video API encrypted?
Yes, it is encrypted through HTTPS and SRTP. WebRTC products are required to be encrypted!
Is SignalWire video HIPAA compliant?
Yes! You control access to video conferences via JWT tokens, recording is disabled by default and must be enabled manually, and recordings can be deleted from SignalWire.
Can I incorporate chat?
Yes! When building your website you will have to generate a unique token for the video room and the chat room, but both can exist on the same page.
Can I use video filters?
There is no native support for this at the moment, but you can implement it yourself using video overlays.
Why do users' cameras briefly activate when joining while muted?
SignalWire enumerates over all devices and ‘checks’ the devices where permissions allow. No video/audio data is transmitted during this test.
Does SignalWire support RTMP?
The Video API supports inbound RTMP via the play method, and outbound RTMP via the startStream method.
Where are recordings stored?
Video Room recordings can be found in your SignalWire Dashboard. Click on Video in the left sidebar, then find a list of recordings under the Recordings tab.
How can recordings be downloaded/deleted?
Video room recordings can be deleted or downloaded via your SignalWire Dashboard in the video recordings section or via the API.
What is considered a participant?
Any new member in the room - this could be a person who joined or a screen being shared.
Are Programmable Video Conferences customizable?
Yes! With Programmable Video Conferences, you can now change the background color, foreground color, primary color, success color, negative color, and switch from light mode to dark mode.
Can you record and screen share in a Programmable Video Conference?
Yes! Our Programmable Video Conferences allow for recording, screen sharing, moderator/guest access, room previews, and more, all with no code required. If you need further customizations, you can write custom code on top of the pre-built room with ease.
Do Programmable Video Conferences have automatic recording?
Yes, you can choose to start recording as soon as the room starts in the settings for Programmable Video Conferences. Even if you do not select this, moderators will still have the ability to manually start and stop recording at their own discretion. Guests will not have this ability.
What is E.164?
E.164 is the international telephone numbering plan used for public switched telephone networks (PSTN). It defines the format of phone numbers that ensures consistency across different telecommunications systems worldwide while ensuring that each number is unique.
E.164 numbers are typically composed of a country code, a national destination code (NDC), and a subscriber number. The maximum length of an E.164 number is 15 digits. It excludes spaces, dashes, and parentheses, and usually begins with a plus sign (+) to indicate that it is a full international number.
When dialing a number on the SignalWire platform, it is required to use the E.164 format. This ensures that the call is routed correctly to the intended destination.
E.164 Number Structure:
- ”+” (Prefix): Indicates an international number.
- Country Code (CC): 1-3 digits assigned to each country (e.g., +1 for the U.S., +44 for the U.K.).
- National Destination Code (NDC): Area or region code for a specific part of the country.
- Subscriber Number (SN): The individual’s or business’s unique phone number.
Example Table:
| Scenario | E.164 Format | Description |
|---|---|---|
| U.S. Mobile Number | +12125551234 | A standard mobile number in the U.S. (country code +1) |
| U.K. Landline | +442071838750 | A landline number in London, U.K. (country code +44) |
| India Mobile Number | +919876543210 | A mobile number in India (country code +91) |
| Brazil Mobile (Sao Paulo) | +5511998765432 | A Sao Paulo mobile number in Brazil (country code +55) |
| Australia Business Line | +61298765432 | A business phone in Sydney, Australia (country code +61) |
| Germany Landline | +492219876543 | A landline number in Cologne, Germany (country code +49) |
Regex Pattern for E.164 Numbers:
If your application does not store numbers in E.164 format, you can use a regular expression to format them for your SignalWire application. Adhering to the official ITU E.164 recommendation the format must be a number that starts with a plus sign (+) and has a maximum length of 15 digits. Since no country code starts with a 0, the first digit after the plus sign must be a number between 1 and 9.
^\+[1-9]\d{1,14}$To ensure the formatted number is a valid number, you can use the SignalWire Phone Number Lookup API to verify the number’s validity and retrieve additional information about it.
Introduction to WireStarter
WireStarter is a Docker container which sets up the SignalWire SDKs and builds a development and testing environment for new developers.
WireStarter includes SWSH (the SignalWire interactive Shell) by default. SWSH is a scriptable utility built to easily configure and manage SignalWire Spaces from a command-line environment.
Prerequisites
Before you begin, ensure you have the following prerequisites:
- A free SignalWire Account
- SignalWire API Credentials: Copy your Project ID and API Token from the API tab of your SignalWire Dashboard.
- Docker Desktop
If you intend to set up an example application, you’ll also need to install ngrok and create a free ngrok account.
Installation
The instructions for installing WireStarter using Docker are universal and will work on MacOS, Linux, and Windows.
The script we run in step 3 will ask for your SignalWire Space ID, SignalWire Project ID, SignalWire Project Token, ngrok Token, and ngrok Args (optional - mostly for custom domains), so make sure you have that information handy by opening the SignalWire ‘tokens’ page and the ngrok ‘Your Authtoken’ page.
Repeat these instructions anytime you need to start WireStarter again.
1
Start Docker Desktop
Docker must be running at the start of the process.
2
Download, install, and run WireStarter
WireStarter is frequently updated. If you’ve used WireStarter before, be sure to delete the previous version (using the Docker Desktop UI or the command line) and reinstall the latest version of the container.
docker run -it -d --rm --name wirestarter briankwest/wirestarter:latestThis Docker command downloads and installs WireStarter (if it isn’t already installed). It then runs the container in the background and automatically removes it on exit.
3
Start SWSH
This command starts a terminal UI which will prompt you for relevant IDs and tokens. It will walk you through configuring the development and testing environment so you can quickly deploy and test our example applications. It then automatically enters SWSH (SignalWire Shell), the official SignalWire CLI.
Follow the prompts on screen to enter your SignalWire Space, Project ID, and API token. Your SignalWire Space is the subdomain that prefixes .signalwire.com. In other words, if your Dashboard is accessed at https://spacename.signalwire.com/dashboard, you should enter spacename when prompted for your Space. Copy the Project ID and REST API token from the API pane of your SignalWire Dashboard.
docker exec -ti wirestarter bashThe WireStarter interface. The user is prompted to enter their SignalWire Space domain.
When prompted, select your preferred editor: nano, vim, or emacs. We recommend nano for beginners.
Copy the SignalWire Space ID, Project ID, and Project token from the API pane of your SignalWire Dashboard. Copy the ngrok Token from the Your Authtoken ngrok page. ngrok Args are optional and only needed if you want to use a custom ngrok domain name. If not, leave the text field blank and proceed.
If you don’t plan to set up a WireStarter example application, you can safely ignore both ngrok prompts by leaving them blank and hitting Enter or Return.
Learn more about WireStarter by visiting its repository on GitHub.
4
Optional: Buy and set up a phone number
After entering the SignalWire and ngrok information in the previous step, you will enter the SWSH CLI. If you already have a number set up in your Space that you want to use, you can skip this step.
Phone numbers purchased in the Dashboard UI must be named before being assigned to these demos. Any name will work — just edit and save the populated number as its own name. Numbers purchased in SWSH are not affected by this limitation.
The SWSH terminal.
Purchase and configure a phone number using the phone_number command.
Enter help or help -v to view more options for SWSH.
You can also purchase a phone number in the Web UI in your SignalWire Space.
Purchased phone numbers
5
Set Startup Variables
Set the following variables from the same bash prompt in order to streamline startup. These variables are required for running SWSH in Non-Interactive mode. If they are not set, SWSH will ask for them at startup.
Linux / MacOS
export PROJECT_ID=<YOUR_PROJECT_ID>
export SIGNALWIRE_SPACE=<YOUR_SIGNALWIRE_SPACE>
export REST_API_TOKEN=<YOUR_REST_API_TOKEN>Windows
setx PROJECT_ID=<YOUR_PROJECT_ID>
setx SIGNALWIRE_SPACE=<YOUR_SIGNALWIRE_SPACE>
setx REST_API_TOKEN=<YOUR_REST_API_TOKEN>Learn more by reading our Introduction to SWSH.
6
Build an Example Application
Follow these instructions to build and test an example application!
Run exit to Exit SWSH
Once WireStarter is successfully configured, and you’ve purchased any numbers with SWSH, run exit once to exit SWSH.
Run setup.sh
From the same bash prompt, run setup.sh and select a demo. Follow the instructions to assign a phone number and finish setup.
If you encounter any problems using WireStarter, please let us know by reporting an issue on its GitHub repo.
You can also get live support in the Community Discord, or by emailing devex@signalwire.com.
The setup script.
Help
Have a question or bug to report?
Help us improve WireStarter for your use case by reporting an Issue on the GitHub Repository.
