> Fetch clean Markdown by appending `.md` to any page URL under https://signalwire.com/docs or requesting it with the HTTP header `Accept: text/markdown`. The root index at https://signalwire.com/docs/llms.txt lists the available documentation indexes. # Get started > Set up your SignalWire Space, pick the right way to build, and launch your first application. 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. Set up your account, pick the right way to build, and launch your first application. ## Your SignalWire Space When you [create a SignalWire account](https://signalwire.com/signup), you also create a **Space**, like `spacename.signalwire.com`. Your [Dashboard](https://my.signalwire.com) 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 Dashboard's left navigation includes **My Resources**, **Click-to-Call**, **Phone Numbers**, **Messaging Campaigns**, **API Credentials**, **Logs**, **Storage**, and **Configuration**. The home page also displays the current **Project ID** and **Space URL**. ## 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? | What you are building | Primary interface | Choose another interface when | | --------------------------------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | AI voice agent | [Server SDKs](/docs/server-sdks) | Use [SWML AI](/docs/swml/reference/calling/ai) when AI is one part of a declarative call flow. | | Browser or mobile voice, video, or chat | [Browser SDK](/docs/browser-sdk) | Use a server interface only for trusted backend operations and token issuance. | | Backend call or messaging application | [SWML](/docs/swml) | Use the [RELAY client](/docs/server-sdks/guides/relay-client) for persistent realtime control, or Server SDKs for AI agents. | | No-code or low-code voice application | [Call Flow Builder](/docs/call-flow-builder) | Use [SWML scripts](/docs/swml) for hosted JSON or YAML, including an [AI agent](/docs/swml/reference/calling/ai). | | Existing Twilio application | [Compatibility API](/docs/compatibility-api) | Use SignalWire's native interfaces for AI, which the Compatibility API does not support. | #### AI Application **You want to build conversational AI for voice calls, text conversations, or both.** This is common for: * Automated customer service * Appointment scheduling and reminders * FAQ bots and information lines * Lead qualification and surveys * Virtual receptionists #### Quick start with the Python Server SDK ```bash pip install signalwire-sdk ``` ```python from signalwire 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() if __name__ == "__main__": agent.run() ``` #### [Server SDK Quickstart](/docs/server-sdks/guides/quickstart) Build your first AI voice agent #### Browser or Mobile App **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. #### [Browser SDK Guide](/docs/browser-sdk) Build voice, video, and chat in the browser #### Server Application **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 #### Choosing an approach **If you need straightforward call handling** (IVRs, call forwarding, playing messages), use **[SWML](/docs/swml)**. Your server responds to webhooks with JSON/YAML instructions. It's stateless and works with any programming language. **If you need realtime control** (live call monitoring, mid-call transfers, complex orchestration), use the **[RELAY client](/docs/server-sdks/guides/relay-client)**. 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 **[Server SDKs](/docs/server-sdks)**. They're designed for creating conversational AI that handles phone calls, in the language of your choice: the SDK generates the agent configuration and hosts your SWAIG functions for you. #### No-Code / Low-Code **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. #### 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! #### Migrating from Twilio\* **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 | > **Compatibility API limitation** > > 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](https://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" }); ``` #### [Compatibility API Guide](/docs/compatibility-api) Complete migration documentation --- ## Core concepts ### Projects and Subprojects A **Project** groups everything you build: phone numbers, Resources, and API credentials. Every Space starts with one, and you can add more at any time. Beneath a Project you can nest **Subprojects**, one level deep. A Subproject is a full Project with its own Project ID, API tokens, and Resources, which makes it a clean way to isolate a customer, a tenant, or a staging environment. Unlike root Projects, Subprojects can be created and deleted through the API. #### [Learn more about Projects](/docs/platform/projects) What a Project scopes, and how Subprojects nest beneath one ### Communication channels SignalWire supports the following communication channels: #### [Voice](/docs/platform/voice) Phone calls, IVRs, recording, conferencing #### [Video](/docs/platform/video) Video rooms, screen sharing, recordings #### [Messaging](/docs/platform/messaging) SMS and MMS text messages #### [Chat](/docs/platform/chat) Real-time chat for web and mobile apps #### [AI](/docs/platform/ai) Intelligent voice agents powered by LLMs #### [Fax](/docs/platform/fax) 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. #### [Learn more about Phone Numbers](/docs/platform/phone-numbers) 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 #### [Learn more about Resources](/docs/platform/resources) 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. #### [Learn more about Addresses](/docs/platform/addresses) 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. #### [Learn more about Subscribers](/docs/platform/subscribers) User management and authentication --- ## Next steps Once you've chosen your path, here are some resources to help you along the way: * **[Discord Community](https://discord.com/invite/F2WNYTNjuF)** - Join 8,000+ developers. Great for questions and sharing what you're building. * **[GitHub](https://github.com/signalwire/)** - 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. > The SignalWire platform