Pular para o conteúdo principal

WebSockets

A API Liqi CaaS oferece conexões WebSocket para acompanhamento em tempo real de preços, ordens e saldos.

URLs de Conexão

AmbienteURL base
Sandboxwss://websocket-caas-it-sandbox.liqi.app.br/
Productionwss://ws.liqi-caas.com.br/

Autenticação

A conexão WebSocket é autenticada no $connect via token operacional passado em query string. O token é o mesmo obtido em POST /auth/signin (ver Autenticação).

wss://<host>/?token=<TOKEN_OPERACIONAL>

Conexões sem token ou com token inválido são recusadas pelo API Gateway antes de qualquer handler ser executado. Não é possível se conectar primeiro e autenticar depois.

Como Conectar

JavaScript

const token = 'SEU_TOKEN_OPERACIONAL'; // obtido em POST /auth/signin
const ws = new WebSocket(`wss://websocket-caas-it-sandbox.liqi.app.br/?token=${token}`);

ws.onopen = () => {
console.log('Conectado ao WebSocket');

// Subscrever a um canal
ws.send(JSON.stringify({
action: 'subscribe',
channel: 'watchTicker',
data: {
symbol: 'BTC/BRL'
}
}));
};

ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Dados recebidos:', data);
};

ws.onerror = (error) => {
console.error('Erro no WebSocket:', error);
};

ws.onclose = () => {
console.log('Conexão fechada');
};

Python

import asyncio
import websockets
import json

async def connect():
token = "SEU_TOKEN_OPERACIONAL" # obtido em POST /auth/signin
uri = f"wss://websocket-caas-it-sandbox.liqi.app.br/?token={token}"
async with websockets.connect(uri) as ws:
# Subscrever
await ws.send(json.dumps({
"action": "subscribe",
"channel": "watchTicker",
"data": {"symbol": "BTC/BRL"}
}))

# Receber mensagens
async for message in ws:
data = json.loads(message)
print("Recebido:", data)

asyncio.run(connect())

Canais Disponíveis

CanalDescriçãoDados Necessários
watchOrdersAcompanha status de ordens em tempo real-
watchTickerPreço de um par específicosymbol
watchTickersPreços de todos os paresonlyPriority (opcional)
watchBalanceSaldos em tempo real-

Formato das Mensagens

Subscrição

{
"action": "subscribe",
"channel": "<nome-do-canal>",
"data": { ... }
}

O campo action aceita "subscribe" ou "unsubscribe". O nome do canal é case-insensitive no envio — watchOrders, watchorders e WATCHORDERS são tratados da mesma forma. Por padronização, os payloads recebidos sempre vêm com o canal em minúsculas (watchorders, watchbalance, watchticker, watchtickers).

Confirmação da Subscrição

Após cada subscribe ou unsubscribe, o servidor responde na mesma conexão:

Sucesso:

{ "success": true, "message": "Successfully subscribed to channel: watchticker#btcbrl" }

Erro (canal inexistente, sem permissão, payload inválido, etc.):

{ "success": false, "message": "Permission denied for this channel" }

Dados Recebidos

{
"channel": "<nome-do-canal-em-minusculas>",
"message": { ... }
}

Permissões por Canal

Cada canal requer uma permissão específica na chave API utilizada para gerar o token operacional. Se a chave não tiver a permissão necessária, o subscribe é recusado com "Permission denied for this channel".

CanalPermissão necessária
watchOrdersorders:*
watchBalancewallet:*
watchTickermarket:*
watchTickersmarket:*
(qualquer)* (wildcard)