# X_SOCKET_UNAUTHENTICATED

## Means

the sync upgrade carried no credential this app accepts

## Typical cause

the app's `authenticate` hook decided this upgrade belongs to nobody. **A decision, not a fault** — it never pages anyone, because the refusal is the whole point of the hook. Until this cycle there was no way to authenticate a WebSocket at all, so realtime was single-tenant only. Distinct from `X_TOPIC_FORBIDDEN`, which is a subscriber that already has a socket and asked for something it may not have; this one never gets a socket, so the client learns about it by tearing the connection down

## Fix

send the credential `syncNode({ authenticate })` reads on the upgrade request, or return an anonymous `Actor` from it to admit this socket

[Realtime](/error-codes#realtime)
