WSS
/ws/v1/quotes Live · Starter+ WebSocket Streaming — Live Quotes
Open a single connection, subscribe to a symbol list, and receive every bid/ask update push-style. No polling, no wasted requests — ideal for dashboards, alert engines, and execution bots that need quotes the instant they change.
Status: Live on the Starter plan and above. Pay-as-you-go keys cannot open the stream; on pay-as-you-go, use the REST
/v1/quote endpoint for polling-based price reads.
Python websocket-client
stream.py
import websocket, json
def on_message(ws, message):
data = json.loads(message)
# Every server frame carries a type: authenticated, subscribed,
# unsubscribed, quote, heartbeat, pong, error.
if data.get("type") == "authenticated":
ws.send(json.dumps({
"action": "subscribe",
"symbols": ["EURUSD", "XAUUSD", "BTCUSD"]
}))
elif data.get("type") == "quote":
print(f"{data['symbol']}: bid={data['bid']} ask={data['ask']}")
def on_open(ws):
# The first message must be auth, and it must arrive within 10
# seconds or the server closes the socket with code 4001. The API
# key is NOT a URL parameter — it is ignored there.
ws.send(json.dumps({"action": "auth", "key": "YOUR_API_KEY"}))
ws = websocket.WebSocketApp(
"wss://tickatlas.com/ws/v1/quotes",
on_message=on_message,
on_open=on_open,
)
ws.run_forever() JavaScript Browser / Node.js
stream.js
const ws = new WebSocket(
"wss://tickatlas.com/ws/v1/quotes"
);
ws.onopen = () => {
// First message must be auth, within 10 seconds, or the server
// closes with code 4001. The key is not accepted as a URL param.
ws.send(JSON.stringify({ action: "auth", key: "YOUR_API_KEY" }));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === "authenticated") {
ws.send(JSON.stringify({
action: "subscribe",
symbols: ["EURUSD", "XAUUSD", "BTCUSD"]
}));
} else if (data.type === "quote") {
console.log(`${data.symbol}: ${data.bid} / ${data.ask}`);
}
}; Connection lifecycle
- Connect to
wss://tickatlas.com/ws/v1/quotes. The API key is not a URL parameter. - Send
{"action": "auth", "key": "YOUR_API_KEY"}as the first message. You have 10 seconds; after that the server closes the socket with code4001. - Wait for the
authenticatedframe, then send asubscribemessage with the symbol list. - Receive a
quotemessage every time a subscribed symbol changes. - Send
unsubscribeor close the socket when done.
Quote message server → client
quote.json
{
"type": "quote",
"symbol": "EURUSD",
"bid": 1.08432,
"ask": 1.08443,
"volume": 12345,
"time": "2026-04-04T14:23:00Z"
} Heads up: WebSocket streaming requires the Starter plan or higher and is unmetered: pushes do not count against your quota. See
the WebSocket LP
for per-plan symbol limits.