Realtime is wire-compatible with Pusher Channels. You keep the client and server libraries that you already use: the same subscribe / bind / trigger surface, the same channel model, and your existing auth endpoint. You only point them at ClutchCall. There is no new API to learn. On the client you have two first-class, drop-in options. Pick either one without changes to your channel or event code:
  • Stock pusher-js over WebSocket. Repoint wsHost and you are done. Use it when you want zero new dependencies and run on normal, reliable networks.
  • The ClutchCall QUIC-native realtime client. This is a pusher-js-API-compatible drop-in. It prefers WebTransport/QUIC and falls back automatically. Use it when mobile or lossy-network resilience matters (see When to pick which).
The server side is identical for both clients: the official Pusher server SDKs or the REST publish endpoint, the same channels, and the same HMAC auth.
This page is a reference for the compatible surface. If you already run Pusher, the only required change is the connection host (client) and the host option (server). App credentials come from the Realtime Console.

Connect a client

Construct a client with your app key. Point it at the ClutchCall realtime host. Choose one of the two clients below. After this step, the channel, bind, and connection-state code is identical for both clients.
Repoint stock pusher-js: set wsHost. Nothing else changes. This is the pure drop-in migration path.
Browser (pusher-js)
string
required
The realtime host, realtime.clutchcall.dev. This is the one line that repoints stock pusher-js from Pusher’s cluster onto ClutchCall.
boolean
default:"false"
Set true to connect over wss://. Recommended for all production traffic.
number
Override only if you terminate on a non-default port. By default the client uses 443 under forceTLS.
pusher-js (and the compatible client) addresses your app by key, not by app ID. The app ID is used only server-side. The client ignores the cluster option when you set wsHost explicitly. That is the correct configuration here.
string
Your backend route that signs private-* / presence-* subscriptions. It is identical for both clients. It is necessary only if you use private or presence channels.

Transport ladder

ClutchCall speaks the Pusher protocol. The QUIC-native client can carry it over three transports. The client negotiates them in order and degrades automatically: Browsers reach QUIC through WebTransport (HTTP/3). Native mobile apps can use raw QUIC directly and avoid the WebTransport framing layer. That is the native-SDK path.
Raw-QUIC on mobile ships through the native mobile SDKs, not the browser package. In the browser, “QUIC” always means WebTransport/HTTP-3. If you need the raw-QUIC mobile transport, check current availability for your platform in the Realtime Console before you depend on it.

When to pick which

Measure your own traffic. On a clean wired network, WebSocket-over-TCP is already fast, and stock pusher-js is the simplest option that works. The QUIC-native client helps on lossy, mobile, or high-latency networks, where TCP head-of-line blocking and slow reconnects hurt.
Both clients are drop-in. They share the same channel, event, presence, and auth code. You can start on stock pusher-js. If resilience needs grow, switch the import to @clutchcall/sdk/realtime later with no other changes.

Subscribe, bind, unsubscribe

Channel
Join a channel. The prefix decides the type. No prefix (or public-) is open. private- requires a signed subscription. presence- adds member state.
void
Register a handler for an event on that channel. bind_global receives all events.
void
Leave a channel. This drops its binds and stops delivery.

Connection states

The client exposes the standard Pusher connection lifecycle. Bind to it to drive UI (for example, a “reconnecting” banner) or to gate publishes:

Authorize private & presence channels

private-* and presence-* subscriptions are HMAC-signed with your app secret. The browser never holds the secret. pusher-js POSTs the socket_id and channel name to your channelAuthorization.endpoint. Your backend signs the response with a Pusher server library. This is the standard Pusher auth flow. Reuse your existing endpoint unchanged.
1

Client requests authorization

On subscribe("private-…") or subscribe("presence-…"), pusher-js POSTs { socket_id, channel_name } to your auth endpoint.
2

Backend signs with the app secret

Your route constructs a Pusher server client with { appId, key, secret } and returns the signed auth payload. For presence channels you also attach the member’s user_id and user_info.
3

Client completes the subscribe

pusher-js forwards the signature to ClutchCall. ClutchCall checks the HMAC and admits the subscription.
The app secret must stay only on your server. Any party with the secret can sign subscriptions and publish events. Create and rotate the secret in the Realtime Console.
Presence channels deliver pusher:subscription_succeeded with the current member list. They then deliver pusher:member_added / pusher:member_removed as members join and leave. These are the standard presence events. Bind them the usual way.

Publish from your server

Use the official Pusher server library, constructed with your { appId, key, secret, host }. Call trigger(channel, event, data). This fans the event out across the ClutchCall edge. Every subscriber on that channel receives it.
Promise
Publish event with JSON data to one channel or an array of channels. data is delivered to every subscriber’s matching bind.
REST
The underlying publish endpoint on the realtime host. The body is { name, channel | channels, data }. Requests are HMAC-signed with the app secret (the server libraries do this for you). The Console Event Creator shows the exact cURL for any event that you compose.
The wire sends data as a JSON string. The Pusher server libraries serialize an object for you. Over raw REST, you pass a stringified body, as shown in the cURL tab.

Client events

On private-* and presence-* channels, subscribers can publish client-* events directly to each other (typing indicators, cursors). There is no round trip through your server. First enable client events for the app in the Console settings.
Client events must have the client- prefix. They are permitted only on authenticated (private-* / presence-*) channels. They are never delivered back to the sender.

Webhooks

Register endpoints in the Console to receive signed event batches. Batches are sent when channels become occupied or vacated, and when presence members join or leave. Check the X-Pusher-Signature HMAC (computed with the webhook signing secret) before you trust a payload.
Channel-existence and presence webhooks plus per-delivery HMAC signing are shipped. Some batching and additional webhook event groups (for example, client-event and cache webhooks) are still rolling out. Treat those as preview. Check availability for your deployment in the Console before you depend on them.

Compatibility scope

These features are drop-in today:
  • Public channels.
  • private-* HMAC subscription auth.
  • presence-* with member state.
  • client-* events.
  • subscribe/bind/unbind/unsubscribe.
  • The full connection-state lifecycle.
  • Server-side trigger (single and multi-channel) over both the server libraries and the REST publish endpoint.
Both clients speak this surface identically: stock pusher-js and the ClutchCall QUIC-native client (@clutchcall/sdk/realtime). The official Pusher server SDKs work when you change only the host.
Some webhook batching and the broader webhook event set are still landing (see above). The browser QUIC path rides WebTransport (HTTP/3) and always has the WebSocket/SockJS fallback beneath it. Raw-QUIC on mobile ships through the native SDKs. Check availability for your platform before you depend on it. If you use an advanced or newer Pusher feature that is not listed under “drop-in”, check it against your deployment first.

Next steps

Realtime — Details

How channels, transports, and the edge fan-out fit together.

Realtime Console

Create app keys, publish test events, and configure webhooks.

Realtime — Cookbook

Copy-pasteable snippets: presence, private channels, server publish.

Realtime — Recipes

End-to-end builds: a live presence list and server-pushed notifications.