***
id: dbcca373-5951-4202-9866-009b87d4c670
title: Realtime Server SDK
sidebar-title: Overview
position: 0
slug: /node
subtitle: Node.js server SDK for real-time communication through WebSocket connections
description: >-
Build real-time voice, video, messaging, and chat applications with the
SignalWire Realtime SDK for Node.js. Event-driven WebSocket architecture with
dedicated namespaces.
keywords: >-
SignalWire, Realtime SDK, Node.js, JavaScript, real-time communication,
overview, introduction, getting started
max-toc-depth: 3
----------------
@signalwire/realtime-api
signalwire/signalwire-js
```bash
npm install @signalwire/realtime-api
```
The SignalWire Realtime SDK v4 is a Node.js server SDK that enables real-time communication through WebSocket connections. Built on an event-driven architecture, it provides dedicated namespaces for voice, video, messaging, chat, pub/sub, and task management.
## Getting Started
```bash
npm install @signalwire/realtime-api
```
For Voice, Messaging, and Task namespaces, create a RELAY Application resource in your dashboard:
1. Set a name for your application
2. Choose a reference (e.g., "support", "sales") that matches your client's topics
3. Assign [phone numbers](/docs/platform/phone-numbers#phone-number-configuration) or [SIP addresses](/docs/platform/addresses) to route calls to this application
Get your project credentials from the [SignalWire Dashboard](/docs/platform/your-signalwire-api-space):
```javascript
import { SignalWire } from "@signalwire/realtime-api";
const client = await SignalWire({
project: "your-project-id",
token: "your-api-token"
});
// Access namespace clients
const voiceClient = client.voice;
```
Create a simple inbound call handler to test your setup:
```javascript
import { SignalWire } from "@signalwire/realtime-api";
const client = await SignalWire({
project: "your-project-id",
token: "your-api-token"
});
const voiceClient = client.voice;
// Answer incoming calls and play a greeting
await voiceClient.listen({
topics: ["support"], // Must match your RELAY Application reference
onCallReceived: async (call) => {
console.log("Incoming call from:", call.from);
await call.answer();
await call.playTTS({ text: "Welcome to SignalWire!" });
}
});
console.log("Waiting for calls...");
```
Now call the SignalWire phone number or SIP address you assigned to your RELAY Application in step 2. Your application will answer and play the greeting!
## Core Concepts
### WebSocket Event Architecture
The SDK operates on a bidirectional WebSocket connection between your application and SignalWire's servers. This enables real-time communication through a structured event system:
```mermaid
graph LR
A["SDK Client
(Your Application)"] <-->|"Method Calls
client.dialPhone(), client.send()
roomSession.join()"|B[WebSocket
Connection] <-->|"Process & Respond"| C[SignalWire]
C -->|"Real-time Events
call.received, message.received
room.started"| B -->|"Event Data
client.listen(callbacks)"| A
```
When you call a method like `client.dialPhone()`, the SDK sends your request over the WebSocket connection and SignalWire processes it and responds immediately. These method calls follow a request-response pattern - the returned promise resolves with the result data, such as a `Call` object containing all the details of your newly created call.
The `listen()` methods handle a different communication pattern: real-time event notifications. These are asynchronous events triggered by external actions - like when someone calls your number (`onCallReceived`), sends you a message (`onMessageReceived`), or when something happens in a video room you're monitoring (`onMemberJoined`). Unlike method responses, these events arrive whenever the triggering action occurs, not as a direct response to your code.
### Authentication and Access Control
All SDK clients authenticate using project credentials. Voice, Messaging, and Task namespaces also require topic subscriptions that control event routing:
```javascript
import { SignalWire } from "@signalwire/realtime-api";
const client = await SignalWire({
project: "your-project-id", // SignalWire project identifier
token: "your-project-token" // API token from project settings
});
const voiceClient = client.voice;
// Voice, Messaging, and Task require topics for event routing
await voiceClient.listen({
topics: ["support", "sales"], // Required for Voice, Messaging, Task
onCallReceived: (call) => { /* handle call */ }
});
```
Your `project` ID and `token` are available in the [SignalWire Dashboard](/docs/platform/your-signalwire-api-space). These authenticate your WebSocket connection and establish your access permissions.
Topics (formerly contexts) work with RELAY Application resources to route events. When you assign a phone number or a SIP address to a RELAY Application with reference "support", SignalWire routes all calls from that number or SIP address to SDK clients authenticated with the "support" topic. This creates strict access control - a client subscribed to "support" cannot receive events intended for "sales".
The routing process is straightforward: incoming calls hit a phone number or a SIP address, SignalWire checks the RELAY Application's reference, then delivers the event only to clients with matching topics. This happens automatically based on your authentication.
```javascript
// Topic-based client (receives events only for subscribed topics)
await voiceClient.listen({
topics: ["support", "sales"], // Only receive calls for these topics
onCallReceived: (call) => { /* handle call */ }
});
// Non-topic client (receives all events for the project)
await videoClient.listen({
onRoomStarted: (roomSession) => { /* handle room */ } // No topics needed
});
```
## Available Namespaces
Make and receive calls, play audio, record, and build IVRs
Monitor video rooms, members, recordings, and streams
Publish and subscribe to real-time message channels
Build chat applications with members and messages
Distribute tasks to workers via topic routing