The ManticScore WebSocket endpoint lets you subscribe to multiple entity channels over a single connection. Rather than opening a separate HTTP streaming request for each job, you connect once and subscribe to any mix of research runs, build graphs, Forge executions, chat sessions, and more.Documentation Index
Fetch the complete documentation index at: https://docs.manticscore.com/llms.txt
Use this file to discover all available pages before exploring further.
Connecting
connected frame:
Catchup frame
If you have any in-flight or recently completed work, the server sends acatchup frame right after connected. This lets you know what to subscribe to without polling the REST API first.
in_flight[].last_event_seq as your cursor when subscribing, so you don’t re-receive events you already have.
Client messages
Send JSON text frames to control your subscriptions:subscribe
subscribe
Subscribe to a channel for a specific entity. The server replays events after Pass the
cursor, sends a subscribed confirmation, then streams live events.seq of the last event you received as cursor to resume without gaps.unsubscribe
unsubscribe
Stop receiving events for an entity. The server auto-unsubscribes when it forwards a
done event, but you can also unsubscribe manually.ping
ping
Send a client-side keepalive. The server replies with a
pong frame.Server messages
| Event | When | Key data |
|---|---|---|
connected | On connect | user_id, server_time |
catchup | After connected, when work is in flight | in_flight, completed arrays |
subscribed | After a successful subscribe | entity_id, channel, replayed count |
ping | Server heartbeat every 30s | {} |
pong | Reply to client ping | {} |
auth_expired | Before a 4001 close | {} |
<entity event> | Live event for a subscribed entity | seq, entity_id, channel, event-specific data |
Auto-progression events
Several entity events are emitted by background hooks rather than direct user action. They follow the same envelope as any other entity event but are worth calling out so clients know to render them:| Event | Channel | When |
|---|---|---|
project.seeded | project | After POST /projects finishes, with suggested competitors and features drawn from similar prior research. May arrive with empty arrays when no similar prior data exists. See POST /projects. |
card.forge_ready | chat | When a build node expansion produces leaves that are low-risk, small-effort, and high-confidence. Posted into the project’s most recent chat session with a Ship it action that pre-fills start_implementation. Capped at 3 cards per expansion. See POST /build-nodes/{id}/expand. |
revision_updated | brief | When a Forge PR is appended to the project’s progress section. The brief itself may have been auto-bootstrapped from the latest research if one did not already exist. See Pull requests. |
Available channels
| Channel | What it tracks | Terminal statuses |
|---|---|---|
research | Research jobs | completed, failed |
build | Build graphs | ready, failed |
brief | Briefs | ready, failed |
forge | Forge coding runs | completed, failed, cancelled, rejected |
feature_research | Feature deep research | completed, failed |
chat | Chat sessions | completed, failed |
signal_crawl | Competitive monitor crawls | completed, failed |
company_enrich | Company enrichment | enriched, failed |
implement | Implementation sessions | completed, failed |
learning | Background learning jobs | completed, failed |
project | Project-scoped fanout — research, build, brief, Forge, chat, and agent events for a single project | none (long-lived) |
The
project channel does not have terminal statuses — it stays open as long as the project exists and fans in events from every per-domain channel that carries a project_id. Subscribe with entity_id set to the project UUID. Use GET /projects/:id/home to bootstrap the screen, then pass the returned ws.last_event_seq as cursor to resume without gaps. Per-domain channels remain available for clients that only need a single domain’s events.Connection lifecycle
- Idle timeout: 90 seconds. Keep the connection alive by sending
pingframes or subscribing to active channels. - Server heartbeat: the server sends a
pingframe every 30 seconds. - Auth revalidation: your session is re-checked every 5 minutes. If it has expired, you receive an
auth_expiredframe followed by close code4001. Re-authenticate and reconnect.
Close codes
| Code | Meaning |
|---|---|
1000 | Normal close or idle timeout |
1001 | Server shutdown |
4001 | Auth expired — re-authenticate and reconnect |
4002 | Missing or invalid token |
4003 | Replaced by a newer connection from the same user |