The envelope and structure of all WebSocket messages.
Message Format
All server-to-client messages follow a simple two-field envelope.
Server → Client Envelope
interface HydraMessage {
type: string // event type (e.g. 'aircraft', 'signal', 'connected')
data: unknown // payload — shape depends on type
}
Data Message
{
"type": "signal",
"data": {
"signals": [
{ "id": "clxxx", "title": "...", "severity": 4 }
]
}
}
Control Message
{
"type": "connected",
"data": {
"scopes": ["signals", "aircraft"],
"ts": 1710000000000
}
}
All Event Types
type |
Description | Scope |
|---|---|---|
connected |
Connection confirmed with scopes | — |
error |
Auth or server error | — |
aircraft |
Aircraft position update or snapshot | aircraft |
vessel |
Vessel position update or snapshot | vessels |
signal |
Intelligence signal (new or batch) | signals / alerts / airspace / cyber / earthquakes |
alert |
Missile/rocket alert update | alerts |
market |
Prediction market data | markets |
market_correlation |
Signal–market correlation | markets |
x_post |
Social media OSINT post | social |
tension |
Country tension level update | — (internal) |
chat_message |
Live chat message | — (internal) |
chat_history |
Chat history snapshot on connect | — (internal) |
online_count |
Connected user count | — (internal) |
Types marked "internal" are only sent on the /stream/live endpoint.
Snapshot Payloads
On connect, the server sends the current state for each scope. Snapshot messages use the same type as live updates but contain arrays:
Aircraft snapshot:
{
"type": "aircraft",
"data": {
"positions": [
{
"icaoHex": "AE1234", "callsign": "FORGE11",
"lat": 32.5, "lng": 35.1, "altitudeBaro": 28000,
"groundSpeed": 450, "track": 180,
"isMilitary": true, "operator": "USAF",
"timestamp": "2025-03-20T12:00:00.000Z"
}
],
"count": 1,
"timestamp": "2025-03-20T12:00:00.000Z"
}
}
Signal snapshot:
{
"type": "signal",
"data": {
"signals": [
{ "id": "clxxx", "title": "...", "category": "CYBER", "severity": 4 }
]
}
}
Vessel snapshot:
{
"type": "vessel",
"data": {
"positions": [
{
"mmsi": "123456789", "name": "VESSEL NAME",
"lat": 33.1, "lng": 34.2, "speed": 12.5,
"course": 270, "shipType": "Cargo",
"timestamp": 1710000000000
}
],
"count": 1,
"timestamp": "2025-03-20T12:00:00.000Z"
}
}
Error Messages
{
"type": "error",
"data": {
"message": "Unauthorized — provide a valid API key via ?apiKey= or x-api-key header"
}
}
Error messages are sent before the connection is closed with the appropriate close code.
Client → Server
The Hydra WebSocket is server-push only — there are no client-to-server commands. Scope filtering is configured via your API key, not runtime messages. The server does respond to WebSocket protocol-level pong frames for keep-alive.