The WebSocket relay lets the Voyager server dispatch LinkedIn API calls through the user’s real Chrome browser instead of issuing them from the server. The Chrome extension holds a WebSocket to the server, receives requests, executes them with fetch() and credentials: 'include', and streams the response back. LinkedIn sees requests coming from the user’s actual browser with real cookies and a real residential IP.
cookie_sync_request; the extension grabs fresh cookies from Chrome’s cookie store and syncs them back automatically.wss://<server>/api/relay on startup.auth message with the API key and user ID.The relay is transparent to all Voyager endpoints. Whether a request goes through the relay or direct HTTP, the API response format is identical.
The first message on the WebSocket must be an auth message:
The server responds:
If authentication fails, or no auth message arrives within 10 seconds, the server closes the connection.
The server sends request messages:
The extension replies with the same id:
Or on failure:
The server pings every 20 seconds to keep the MV3 service worker alive:
The extension replies with { "type": "pong" }.
MV3 service workers are killed after 30s of inactivity. The 20s ping keeps the worker warm. As a backup, the extension also maintains a Chrome alarm (relay-keepalive) that fires every 24s — if the worker was killed and restarted, it reconnects automatically.
If the WebSocket disconnects (server redeploy, network change, Chrome sleep, etc.), the extension reconnects with exponential backoff:
The backoff resets to 1s on successful connection. When the user changes the API key, user ID, or server URL in options, the extension closes and immediately reconnects.
Voyager’s retry layer is explicitly aware of relay drops. An outbound call that fails with "Relay connection closed" is classified as a retryable transport error — the next attempt falls through to direct HTTP + proxy, so a momentary relay drop rarely surfaces to the caller as a failure.
The Chrome extension icon reflects the relay status:
relayConnected — WebSocket is open for this userfetcherSet — the relay fetcher is wired into VoyagerApi and SalesNavApiWhen the relay isn’t usable, Voyager falls back to direct HTTP + residential proxy — not to a headless browser.
SalesNav endpoints that fingerprint a real Chrome session are more robust through the relay, but most still work on Tier 2 as well. If SalesNav specifically fails on direct HTTP for a tenant, check whether li_a and li_ep_auth_context are synced.
The server side needs no configuration — the relay is always available at /api/relay. The extension needs:
https://li.scaleabm.org, configurable in optionsThe extension connects the relay automatically on startup. No manual activation is needed.