Streams WebSocket
Tempo limite de conexão
- O servidor fecha a conexão WebSocket após 60 segundos de inatividade (Connection Keep-Alive).
- A inatividade é definida como a ausência de solicitações enviadas pelo cliente.
Conexão Manter Ativa
Para manter a conexão WebSocket ativa, você precisa
- Enviar solicitações periódicas a cada 50 segundos
- Gerencie adequadamente possíveis desconexões na lógica do seu aplicativo.
Autorização
Introdução
Antes de assinar qualquer solicitação WebSocket, você deve criar uma chave de API em sua conta pessoal do Cryptomus.
Instruções detalhadas para criar uma chave de API estão disponíveis. aqui
Obtenção de um token único para conexão
Antes de se conectar ao servidor WebSocket, você precisa obter um token de autenticação único.
Você pode obter o token enviando a solicitação correspondente
O token é válido por 5 minutos ou até a primeira conexão bem-sucedida.
Conectando-se ao servidor WebSocket
Para conectar-se ao servidor WebSocket
1. Obtenha um desconto único token de autenticação
2. Especifique o token no parâmetro de consulta `token` ao estabelecer a conexão.
Exemplo de URL de conexão: wss://api-ws.cryptomus.com/ws?token=b0b1cacd26993392ecf072155bd1686c96e380ad12cefa564aa6665c85c77334
O token só pode ser usado uma vez. Para cada nova conexão, você precisa solicitar um novo token.
Após a verificação bem-sucedida do token, a conexão será estabelecida e você poderá se inscrever nos canais disponíveis.
Obtenção de um token de autenticação único para conexão WebSocket
Permite gerar um token de autenticação único para conexão com o servidor WebSocket. O token é válido até a primeira conexão bem-sucedida ou até expirar (5 minutos).
Cabeçalhos de autorização
Informações completas sobre os cabeçalhos de autorização necessários estão disponíveis. aqui
Resposta
{ "token": "168b34a3a12370740ff1654f0d0c4726ff1bba8c4675edc0d7553f15e5a2a094" }CópiaCódigos possíveis
200: O pedido foi criado com sucesso
404: Usuário ou recurso não encontrado
500: Erro interno do servidor
Símbolos da escala de profundidade
Solicitar
Resposta
1{
2 "status": "success",
3 "message": "success",
4 "data": [
5 {
6 "scale": "0.01",
7 "index": 0 // index
8 },
9 ...
10 ]
11}CópiaLista de mercado
Solicitar
Resposta
1{
2 "result": [
3 {
4 "id": "01HSBPVS17CT2GN2FV34K3AMP9",
5 "symbol": "BTC_USDT",
6 "baseCurrency": "BTC",
7 "quoteCurrency": "USDT",
8 "baseMinSize": "0.0000100000000000",
9 "quoteMinSize": "0.1000000000000000",
10 "baseMaxSize": "10000000000.0000000000000000",
11 "quoteMaxSize": "99999999.0000000000000000",
12 "basePrec": "8",
13 "quotePrec": "6",
14 "baseCurrencyFullName": "Bitcoin",
15 "quoteCurrencyFullName": "Tether USD"
16 },
17 ...
18 ]
19}CópiaExemplo de implementação
Node.js
1const WebSocket = require('ws');
2
3class CryptomusWebSocket {
4 constructor(token) {
5 this.token = token;
6 this.socket = new WebSocket('wss://api-ws.cryptomus.com/ws?token=${this.token}');
7 this.setupConnection();
8 }
9
10 setupConnection() {
11 this.socket.on('open', () => {
12 console.log('Connected to Cryptomus WebSocket');
13 this.startPing();
14 });
15
16 this.socket.on('message', (data) => {
17 console.log('Received:', data.toString());
18 });
19 }
20
21 ping() {
22 if (this.socket.readyState === WebSocket.OPEN) {
23 this.socket.send(JSON.stringify({
24 id: 0,
25 method: "ping",
26 params: []
27 }));
28 }
29 }
30
31 startPing() {
32 setInterval(() => {
33 this.ping();
34 }, 50 * 1000); // Every 50 seconds
35 }
36}
37
38// Usage
39const token = "your_auth_token_here";
40const client = new CryptomusWebSocket(token);
41 CópiaPython
1import asyncio
2import websockets
3import json
4
5class CryptomusWebSocket:
6 def __init__(self, token):
7 self.token = token
8 self.socket = None
9
10 async def connect(self):
11 self.socket = await websockets.connect(f"wss://api-ws.cryptomus.com/ws?token={self.token}")
12 print('Connected to Cryptomus WebSocket')
13
14 async def ping(self):
15 await self.socket.send(json.dumps({
16 "id": 0,
17 "method": "ping",
18 "params": []
19 }))
20
21 async def start_ping(self):
22 while True:
23 await asyncio.sleep(50) # Every 50 seconds
24 await self.ping()
25
26 async def listen(self):
27 async for message in self.socket:
28 print(f"Received: {message}")
29
30 async def run(self):
31 await self.connect()
32
33 # Start ping task
34 ping_task = asyncio.create_task(self.start_ping())
35
36 # Listen for messages
37 await self.listen()
38
39# Usage
40token = "your_auth_token_here"
41client = CryptomusWebSocket(token)
42asyncio.run(client.run())
43 CópiaTodos os endpoints retornam a hora no formato de timestamp Unix.
Estrutura da mensagem de solicitação
| Nome | Tipo de parâmetro | Definição |
|---|---|---|
| id | Integer | Deve ser único para processar a resposta à sua solicitação. |
| method | String | O nome da solicitação |
| params | Array | Passe os parâmetros para o método aqui. |
Tipo de parâmetro
IntegerDefinição
Deve ser único para processar a resposta à sua solicitação.Tipo de parâmetro
StringDefinição
O nome da solicitaçãoTipo de parâmetro
ArrayDefinição
Passe os parâmetros para o método aqui.
A conexão WebSocket será encerrada se um JSON inválido for enviado.
Tipos de mensagens e solicitações
- Solicitação (`ping`, `candles_request`, etc.)
- Assinaturas (`candles_subscribe`, `lastprice_subscribe`, etc.). A renovação da assinatura para o mesmo tipo de dados será cancelada.
Mensagem de resposta
| Nome | Tipo de parâmetro | Definição |
|---|---|---|
| id | Integer | Identificador da solicitação |
| data | Null | Se a solicitação falhar. Se for bem-sucedida, a estrutura de resposta para cada método é mostrada abaixo. |
| error | Null | Se for bem-sucedido. Se ocorrer um erro. |
| message | String | |
| code | Integer | Código de erro |
Tipo de parâmetro
IntegerDefinição
Identificador da solicitaçãoTipo de parâmetro
NullDefinição
Se a solicitação falhar. Se for bem-sucedida, a estrutura de resposta para cada método é mostrada abaixo.Tipo de parâmetro
NullDefinição
Se for bem-sucedido. Se ocorrer um erro.Tipo de parâmetro
IntegerDefinição
Código de erro
Código: 1. Mensagem: Formato de mensagem inválido
Código: 2. Mensagem: Outros erros
Tipos de mensagens de resposta
- Resultado da consulta
- Status da assinatura (sucesso/falha)
- Atualizar eventos
Pingue-pongue
Ping
1{
2 "id": 0,
3 "method": "ping",
4 "params": []
5}
6 CópiaResposta pong
1{
2 "id": 0,
3 "method": "pong",
4 "data": null,
5 "error": null
6}
7 CópiaExemplos de assinaturas
Solicitar
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "BTC_USDT"
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 CópiaEvento de atualização
1{
2 "id": 0,
3 "method": "trade_update",
4 "data": [], // See structure for each method below
5 "error": null
6}
7 CópiaÚltimo preço
Subscrição
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11 CópiaInscreva-se em todos os eventos lastprice_subscribe
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 CópiaEvento
1{
2 "id": 0,
3 "method": "lastprice_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750953362,
7 "price": "107152.55"
8 },
9 "error": null
10}
11 CópiaCancelamento de assinatura
Solicitar
1{
2 "id": 0,
3 "method": "lastprice_unsubscribe",
4 "params": [
5 "BTC_USDT",
6 "ETH_USDT",
7 ...
8 ]
9}
10 CópiaCancelar inscrição em todos os eventos lastprice_unsubscribe
1{
2 "id": 0,
3 "method": "lastprice_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}CópiaProfundidade
Subscrição
Primeiro você precisa obter o índice de escala do mercado. como conseguir
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "params": [
5 "BTC_USDT:0", // market:scale_index
6 "BTC_USDT:1",
7 "ETH_USDT:1",
8 ...
9 ]
10}
11 CópiaInscreva-se em todos os eventos depth_subscribe
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 CópiaEvento
1{
2 "id": 0,
3 "method": "depth_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750952911,
7 "full_reload": false, // If false, it is a partial update, if true, it is a fully updated orderbook.
8 "scale_index": 0,
9 "asks": [
10 [
11 "107043.93", // price
12 "0.304313" // value
13 ]
14 ],
15 "bids": [
16 [
17 "106976.11",
18 "0" // for partial update - finished orders will be 0
19 ]
20 ]
21 },
22 "error": null
23}
24 CópiaCancelamento de assinatura
Solicitar
1{
2 "id": 0,
3 "method": "depth_unsubscribe",
4 "params": [
5 "BTC_USDT:0", // market:scale_index
6 "ETH_USDT:1",
7 ...
8 ]
9}
10 CópiaCancelar inscrição em todos os eventos depth_unsubscribe
1{
2 "id": 0,
3 "method": "depth_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 CópiaTicker
Subscrição
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11 CópiaInscreva-se em todos os eventos ticker_subscribe
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 CópiaEvento
1{
2 "id": 0,
3 "method": "ticker_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750953144,
7 "price": "107090.35",
8 "open": "107042.21",
9 "high": "108248.15",
10 "low": "106573.19",
11 "volume": "1531.027982",
12 "quote_volume": "164564314.80174687",
13 "price_change": "0.04"
14 },
15 "error": null
16}
17 CópiaCancelamento de assinatura
Solicitar
1{
2 "id": 0,
3 "method": "ticker_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10 CópiaCancelar inscrição em todos os eventos ticker_unsubscribe
1{
2 "id": 0,
3 "method": "ticker_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 CópiaTrocas
Subscrição
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11 CópiaInscreva-se em todos os eventos trade_subscribe
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 CópiaEvento
1{
2 "id": 0,
3 "method": "trade_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750953177,
7 "trades": [
8 {
9 "price": 107100.01,
10 "quantity": 0.000254,
11 "timestamp": 1750953177,
12 "direction": "buy"
13 },
14 ...
15 ]
16 },
17 "error": null
18}
19 CópiaCancelamento de assinatura
Solicitar
1{
2 "id": 0,
3 "method": "trade_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10 CópiaCancelar inscrição em todos os eventos trade_unsubscribe
1{
2 "id": 0,
3 "method": "trade_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 CópiaPedidos
Subscrição
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11 CópiaInscreva-se em todos os eventos order_subscribe
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 CópiaEventos
Pedido criado
1{
2 "id": "1",
3 "method": "order_update",
4 "data": {
5 "type": "created",
6 "info": {
7 "id": "01JYET5DQ772MPYHHE417FQF1J",
8 "symbol": "TRX_USDT",
9 "orderType": "limit",
10 "direction": "sell",
11 "price": "0.2200000000000000",
12 "quantity": "50.0000000000000000",
13 "value": "11.0000000000000000",
14 "filledQuantity": "0.0000000000000000",
15 "filledValue": "0.0000000000000000",
16 "clientOid": null,
17 "createTs": 1750696376
18 }
19 },
20 "error": null
21}
22 CópiaPedido atualizado
1{
2 "id": "3",
3 "method": "order_update",
4 "data": {
5 "type": "updated",
6 "info": {
7 "id": "01JYET5DQ772MPYHHE417FQF1J",
8 "symbol": "TRX_USDT",
9 "orderType": "limit",
10 "direction": "sell",
11 "price": "0.2200000000000000",
12 "quantity": "50.0000000000000000",
13 "value": "11.0000000000000000",
14 "filledQuantity": "20.0000000000000000",
15 "filledValue": "4.4000000000000000",
16 "clientOid": null,
17 "createTs": 1750696376,
18 "updateTs": 1750696487,
19 }
20 },
21 "error": null
22}
23 CópiaPedido concluído
1{
2 "id": "3",
3 "method": "order_update",
4 "data": {
5 "type": "finished",
6 "info": {
7 "id": "01JYET5DQ772MPYHHE417FQF1J",
8 "symbol": "TRX_USDT",
9 "orderType": "limit",
10 "direction": "sell",
11 "price": "0.2200000000000000",
12 "quantity": "50.0000000000000000",
13 "value": "11.0000000000000000",
14 "filledQuantity": "50.0000000000000000",
15 "filledValue": "11.0000000000000000",
16 "clientOid": null,
17 "createTs": 1750696376,
18 "finishTs": 1750696417,
19 "state": "completed""internalState": "filled"
20 }
21 },
22 "error": null
23}
24 CópiaCancelar inscrição para receber atualizações
De mercados específicos
1{
2 "id": 0,
3 "method": "order_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10 CópiaDe todos os mercados
1{
2 "id": 0,
3 "method": "order_unsubscribe",
4 "params": [
5 "all" // Optional, will also work if an empty array is passed in
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 CópiaBalanços
Subscrição
Moeda base de lista de mercado
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "params": [
5 "BTC", // BaseCurrency from market list
6 "TRX,
7 "ETH",
8 ...
9 ]
10}
11 CópiaInscreva-se em todos os eventos balance_subscribe
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 CópiaEventos
1{
2 "id": "4",
3 "method": "balance_update",
4 "data": {
5 "info": {
6 "walletId": "01J7E836F6K5KCX5DP2W0F6FAG",
7 "currencyCode": "USDT",
8 "amount": "50.0000000000000000",
9 "oldBalance": "40000.0000000000000000",
10 "newBalance": "39950.00000000"
11 }
12 },
13 "error": null
14}
15 CópiaCancelar inscrição em eventos
De moedas específicas
Moeda base de market-list
1{
2 "id": 0,
3 "method": "balance_unsubscribe",
4 "params": [
5 "BTC", // BaseCurrency from market list
6 "ETH",
7 ...
8 ]
9}
10 CópiaDe todas as moedas
1{
2 "id": 0,
3 "method": "balance_unsubscribe",
4 "params": [
5 "all" // Optional, will also work if an empty array is passed in
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 CópiaOfertas
Subscrição
1{
2 "id": 0,
3 "method": "deal_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT,
7 "ETH_USDT",
8 ...
9 ]
10}
11 CópiaInscreva-se em todos os eventos deal_subscribe
1{
2 "id": 0,
3 "method": "deal_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 CópiaEventos
1{
2 "id": "4",
3 "method": "deal_update",
4 "data": {
5 "info": {
6 "dealId": "01JYH50V5VWPP3QTYGM6CPZ0AR",
7 "symbol": "TRX_USDT",
8 "dealState": "completed",
9 "transactionId": "01JYH50V5YM8M3943KJ9HY2VXM",
10 "filledPrice": "0.2726960000000000",
11 "filledQuantity": "100.0000000000000000",
12 "filledValue": "27.2696000000000000",
13 "fee": "1.0907840000000000",
14 "feeCurrency": "USDT",
15 "tradeRole": "taker",
16 "committedAt": 1750774869
17 }
18 },
19 "error": null
20}
21 CópiaCancelar inscrição para receber atualizações
De mercados específicos
1{
2 "id": 0,
3 "method": "deal_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT,
7 ...
8 ]
9}
10 CópiaDe todos os mercados
1{
2 "id": 0,
3 "method": "deal_unsubscribe",
4 "params": [
5 "all" // Optional, will also work if an empty array is passed in
6 ]
7}
8 CópiaResposta
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 Cópia