Skip to main content
WSS
/
v1
/
charts
/
ws
Messages
Quote/Trade Event
type:object

Server-pushed quote and/or trade update

Error Response
type:object

Error response for subscribe/unsubscribe or auth

Auth Required Response
type:object

Server requests authentication

Refresh Auth Response
type:object

Server warns authentication expires soon

Auth Expired Response
type:object

Server notifies authentication has expired

Auth Request
type:object

Authenticate with OAuth2 access token

Subscribe Request
type:object

Subscribe to quotes/trades for a symbol

Unsubscribe Request
type:object

Unsubscribe from a symbol

Ping Request
type:object

Keep-alive ping

Key Features

Connect Then Authenticate

Open a WebSocket to the endpoint, then send a request to POST /auth with your token. Subscribe only after authSuccess.

Real-Time Quotes

Stream live bid/ask, last price, OHLC, volume, and change for charting.

Real-Time Trades

Receive last-trade updates (price, size, timestamp) for tape and chart integration.

Subscribed Quotes

Subscribe to one or more symbols; receive event messages with quote and trade data for each subscribed symbol.

TradingView Format

Quote and trade payloads use TradingView-friendly field names for easy integration.

Equities & Options

Support for stock tickers and OSI option symbols.

Keep-Alive

Ping/pong for connection health; optional correlation ID for pong.

Endpoint

Connect to the WebSocket at /v1/charts/ws.Production: wss://api.aries.com/v1/charts/ws
Staging: wss://api.aries.com/v1/charts/ws
Health check: GET /tv/health (HTTP)

Authentication

Authentication is required. Use an OAuth2 access token (e.g. from POST /v1/oauth2/token). After the connection is open, send a request message with method POST, path /auth, and body { "token": "<your_access_token>" }. Wait for a response with action authSuccess before sending subscribe messages. If the server returns authRequired or error, authentication failed (e.g. invalid or expired token). The server may send refreshAuth before expiry and authExpired when the session ends.
This WebSocket follows a TradingView-compatible message format. All request/response messages use the shared envelope: type, id, payload (with method, path, body for requests).

Equities

Standard stock ticker symbols (e.g., AAPL, MSFT, GOOGL, TSLA).

Options

Option contracts use OSI (Options Symbology Initiative) symbols (e.g., AAPL240119C00150000 for AAPL Jan 19 2024 $150 Call).
All messages use a JSON envelope:
FieldTypeRequiredDescription
typestringYesrequest | subscribe | unsubscribe | ping | event | response | pong
idstringNoCorrelation ID (client sets on request; server echoes on response)
timestampstringNoRFC3339 timestamp
payloadobjectYesMessage body
  • quotes (default): Bid/ask, last price, OHLC, volume, change, change percent, exchange, description. Suitable for price display and chart overlays.
  • bars: Bar/candle data; use type: "bars" in subscribe if supported.

Live Chart Updates

Display real-time price movements on interactive charts.

TradingView Widgets

Feed real-time data into TradingView charting library or embedded widgets.

Quote Displays

Show last price, bid/ask, and volume in chart widgets (after authenticating).

Technical Analysis

Provide data for indicators and overlays in charting tools.

Connection

Connect to the Charting WebSocket the same way you would the Market Data WebSocket: establish the connection, then authenticate, then subscribe to symbols to receive real-time quotes and trades.

Connect to the endpoint

Open a secure WebSocket connection to:
wss://api.aries.com/v1/charts/ws

Authenticate

Immediately after the connection is open, send one request message to authenticate. Do not send subscribe messages until you receive a successful auth response. Provide your token; the full auth message is built as:
{
  "type": "request",
  "id": "auth-001",
  "payload": {
    "method": "POST",
    "path": "/auth",
    "body": {
      "token": "{{user_access_token}}"
    }
  }
}
Server responds (success): type: "response", with payload.action: "authSuccess" and optional payload.data.expiresIn (session TTL in milliseconds). Server responds (failure): payload.action: "authRequired" or payload.action: "error" with payload.error (e.g. “token is required”, “authentication failed”). Reconnect or send a new auth request with a valid token.

Subscribe to symbols

After authSuccess, send subscribe messages to start receiving quote and trade event messages for the requested symbols. See Subscribing to Chart Data below.

Subscribing to Chart Data

After you have connected and authenticated, you can subscribe to real-time quotes (and trades) for one or more symbols. Each subscription uses a subscribe message; the server then sends event messages containing quote/trade data for those symbols.

Basic subscription structure

Send a subscribe message with type fixed as "subscribe", any id (for correlation), and a payload containing:
Payload fieldRequiredDescription
typeYesquotes or bars
symbolYesTicker (e.g. AAPL) or OSI option symbol
Full message to send:
{
  "type": "subscribe",
  "id": "sub-1",
  "payload": {
    "type": "quotes",
    "symbol": "AAPL"
  }
}

Subscription examples

Single symbol (quotes)

Subscribe to real-time quotes for one equity:
{
  "type": "subscribe",
  "id": "sub-1",
  "payload": { "type": "quotes", "symbol": "AAPL" }
}
You will receive event messages with payload.type: "quotes" and payload.symbol: "AAPL" containing payload.data.quote and payload.data.trade.
Subscribe to quotes for several symbols by sending one subscribe message per symbol (each with its own id if needed):First symbol:
{
  "type": "subscribe",
  "id": "sub-aapl",
  "payload": { "type": "quotes", "symbol": "AAPL" }
}
Second symbol:
{
  "type": "subscribe",
  "id": "sub-msft",
  "payload": { "type": "quotes", "symbol": "MSFT" }
}
Third symbol:
{
  "type": "subscribe",
  "id": "sub-googl",
  "payload": { "type": "quotes", "symbol": "GOOGL" }
}
The server sends event messages for each subscribed symbol; use payload.symbol to route updates.
For option contracts, use the OSI symbol:
{
  "type": "subscribe",
  "id": "sub-opt-1",
  "payload": { "type": "quotes", "symbol": "AAPL240119C00150000" }
}
{
  "type": "subscribe",
  "id": "sub-2",
  "payload": { "type": "quotes", "symbol": "TSLA" }
}

Connection Flow

1

Connect

Open a WebSocket connection to wss://api.aries.com/v1/charts/ws
2

Authenticate

Send a request message: type: "request", payload: { "method": "POST", "path": "/auth", "body": { "token": "<access_token>" } }. Wait for a response with payload.action: "authSuccess".
3

Subscribe

Send subscribe messages with payload.type and payload.symbol for each symbol you want.
4

Receive events

Process event messages containing quote and trade data for your subscribed symbols.
5

Unsubscribe (optional)

Send unsubscribe with the same symbol to stop updates.
6

Keep-Alive (optional)

Send ping periodically; server responds with pong.

Client → Server Messages

Subscribe

Provide payload.type and payload.symbol; the full message is built as:
{
  "type": "subscribe",
  "id": "sub-1",
  "payload": {
    "type": "quotes",
    "symbol": "AAPL"
  }
}

Unsubscribe

Stop receiving updates for a symbol. Provide payload.type and payload.symbol (must match the subscription).
{
  "type": "unsubscribe",
  "id": "unsub-1",
  "payload": {
    "type": "quotes",
    "symbol": "AAPL"
  }
}

Ping

Keep-alive; server responds with pong. Optional id is echoed in the pong.
{ "type": "ping", "id": "ping-1" }

Server → Client Messages

Event (quote/trade update)

Server pushes quote and/or trade data for subscribed symbols.
{
  "type": "event",
  "timestamp": "2026-02-23T18:36:59Z",
  "payload": {
    "type": "quotes",
    "symbol": "AAPL",
    "data": {
      "isDelayed": false,
      "quote": {
        "s": "ok",
        "n": "AAPL",
        "v": {
          "ch": 4.77,
          "short_name": "AAPL",
          "lp": 269.35,
          "open_price": 263.48,
          "high_price": 269.43,
          "low_price": 263.38
        }
      },
      "trade": {
        "s": "ok",
        "t": 1771871819,
        "lp": 269.35,
        "v": 0
      }
    },
    "timestamp": 1771871819072
  }
}
Quote (payload.data.quote): s (status), n (symbol), v (values object: ch = change, short_name, lp = last price, open_price, high_price, low_price). Trade (payload.data.trade): s (status), t (Unix seconds), lp (last price), v (volume). payload.data.isDelayed: true if data is delayed; false for real-time.

Response (auth or error)

Auth success: type: "response", payload.action: "authSuccess", optional payload.data.expiresIn. Error (e.g. invalid subscribe): type: "response", payload.error with message.
{
  "type": "response",
  "id": "sub-1",
  "payload": {
    "error": "symbol is required in payload",
    "timestamp": 1736946600123
  }
}

Pong

Reply to ping.
{
  "type": "pong",
  "id": "ping-1",
  "timestamp": "2025-01-15T14:30:00Z"
}

Quick Start Example

Connect, authenticate, then subscribe to quotes (same pattern as the Market Data WebSocket):
const ws = new WebSocket('wss://api.aries.com/v1/charts/ws');

ws.onopen = () => {
  // 1. Authenticate first
  ws.send(JSON.stringify({
    type: 'request',
    id: 'auth-001',
    payload: {
      method: 'POST',
      path: '/auth',
      body: { token: 'YOUR_OAUTH2_ACCESS_TOKEN' }
    }
  }));
};

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);

  if (msg.type === 'response' && msg.payload?.action === 'authSuccess') {
    // 2. After auth success, subscribe to quotes
    ws.send(JSON.stringify({
      type: 'subscribe',
      id: 'sub-1',
      payload: { type: 'quotes', symbol: 'AAPL' }
    }));
  } else if (msg.type === 'event' && msg.payload?.data) {
    const { quote, trade } = msg.payload.data;
    if (quote?.v) console.log('Quote:', quote.v.lp, quote.v.ch, quote.v.volume);
    if (trade) console.log('Trade:', trade.lp, trade.v, trade.t);
  } else if (msg.type === 'response' && msg.payload?.error) {
    console.error('Error:', msg.payload.error);
  } else if (msg.type === 'pong') {
    console.log('Pong received');
  }
};

// Optional keep-alive
const pingInterval = setInterval(() => {
  if (ws.readyState === WebSocket.OPEN) {
    ws.send(JSON.stringify({ type: 'ping', id: 'ping-1' }));
  }
}, 30000);

ws.onclose = () => clearInterval(pingInterval);

Support

Need help with the Charting WebSocket?

Email Support