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-jsover WebSocket. RepointwsHostand 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).
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.- Stock pusher-js (WebSocket)
- ClutchCall QUIC-native client
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 stockpusher-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.
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.- Node (Express)
- Python (Flask)
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.
- Node
- Python
- cURL (REST)
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
Onprivate-* 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.
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 theX-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
What is drop-in today
What is drop-in today
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.
pusher-js and the
ClutchCall QUIC-native client (@clutchcall/sdk/realtime). The official
Pusher server SDKs work when you change only the host.Where to check before you rely on it
Where to check before you rely on it
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.

