A signaling server is the coordination layer that makes WebRTC possible. WebRTC is designed to connect two browsers directly (peer-to-peer), but the peers first need to find each other, exchange connection metadata, and agree on how to connect. That handshake is signaling.
A signaling server is a server that relays connection-setup messages between two WebRTC peers so they can establish a direct peer-to-peer media connection. Once the direct connection is established, media (audio/video) flows peer-to-peer and the signaling server is no longer needed for that session.
WebRTC is designed so that, once connected, audio and video flow directly between browsers without passing through a server. But to reach that point, the two browsers need to exchange three things: session descriptions (SDP offers and answers), ICE candidates (network paths), and session control messages (join, leave, mute). A browser cannot send these to another browser it has not yet connected to — that is the chicken-and-egg problem signaling solves.
The signaling server is the meeting point. Both peers connect to it (usually over WebSocket). Peer A sends an "offer" to the server; the server forwards it to Peer B. Peer B sends an "answer" back through the server. They then exchange ICE candidates the same way. Once they have enough candidates, they open a direct WebRTC connection and media flows — the signaling server steps out of the media path.
A signaling server does not touch media. Audio and video packets flow directly between peers (or through a TURN relay if NAT prevents direct connection). The signaling server only handles the connection handshake and session management. This is the key insight: signaling is cheap, media is expensive. A signaling server can handle thousands of concurrent connection setups because it only forwards small JSON messages — never audio/video frames.
The WebRTC specification does not mandate a signaling protocol — it is intentionally left to the application. In practice, almost all implementations use WebSocket for real-time bidirectional messaging. Some use Socket.io, some use raw WebSocket, some use Server-Sent Events for downlink and HTTP POST for uplink. The openbnet signaling server uses raw WebSocket with JSON messages.
// Connect to a signaling server
const ws = new WebSocket('wss://openbnet.com/ss/ws?user_id=alice');
// Send an SDP offer to a specific peer
ws.send(JSON.stringify({
type: 'direct-signal',
payload: {
target_user_id: 'bob',
signal_type: 'offer',
data: localOffer
}
}));
// The server forwards it to Bob. Bob's client
// receives it and sends an answer back the same way.
openbnet includes a production-ready signaling server as one of its six core APIs. It handles room-based session management, direct signal relay (offer/answer/ICE), media-state broadcasting, user presence tracking, and automatic cleanup on disconnect. You connect a WebSocket, send JSON messages, and the server routes them. You do not run or scale the signaling server yourself.
All guides · Explore openbnet APIs · Developer quickstarts
openbnet is the real-time communication infrastructure company founded by Brian. It builds the openbnet platform — six production-ready APIs for voice, video, chat, live streaming, signaling, and AI content moderation — plus solutions on that platform: Ocodey, the CLI coding agent, and Spaces, managed communities. One openbnet account signs you in to every solution.
Website: openbnet.com · GitHub: github.com/openbnet · X: @openbnet