Flux WebSocket

Délai d'expiration de la connexion

    - Le serveur ferme la connexion WebSocket après 60 secondes d'inactivité (Connection Keep-Alive)

    - L'inactivité est définie comme l'absence de demandes envoyées par le client

Maintien de la connexion active

Pour maintenir la connexion WebSocket active, vous devez

    - Envoyer des requêtes périodiques toutes les 50 secondes

    - Gérez correctement les déconnexions potentielles dans la logique de votre application

Autorisation

Introduction

Avant de signer une requête WebSocket, vous devez créer une clé API dans votre compte personnel Cryptomus

Des instructions détaillées pour créer une clé API sont disponibles ici

Obtention d'un jeton à usage unique pour la connexion

Avant de vous connecter au serveur WebSocket, vous devez obtenir un jeton d'authentification à usage unique

Vous pouvez obtenir le jeton en envoyant la demande correspondante

Le jeton est valable 5 minutes ou jusqu'à la première connexion réussie

Connexion au serveur WebSocket

Pour se connecter au serveur WebSocket

1. Obtenez un unique jeton d'authentification

2. Spécifiez le jeton dans le paramètre de requête token lors de l'établissement de la connexion

Exemple d'URL de connexion: wss://api-ws.cryptomus.com/ws?token=b0b1cacd26993392ecf072155bd1686c96e380ad12cefa564aa6665c85c77334

Le jeton ne peut être utilisé qu'une seule fois. À chaque nouvelle connexion, vous devrez demander un nouveau jeton.

Après une vérification réussie du jeton, la connexion sera établie et vous pourrez vous abonner aux chaînes disponibles

Obtention d'un jeton d'authentification unique pour la connexion WebSocket

Permet de générer un jeton d'authentification unique pour la connexion au serveur WebSocket. Le jeton est valide jusqu'à la première connexion réussie ou jusqu'à son expiration (5 minutes).

GET
/v2/user-api/exchange/account/web-socket/token
Copie

En-têtes d'autorisation

Des informations complètes sur les en-têtes d'autorisation requis sont disponibles ici

Réponse

{ "token": "168b34a3a12370740ff1654f0d0c4726ff1bba8c4675edc0d7553f15e5a2a094" }
Copie

Codes possibles

200 : la commande a été créée avec succès

404 : Utilisateur ou ressource introuvable

500 : erreur de serveur interne

Symboles de l'échelle de profondeur

Demande

GET
https://exchange-ws.cryptomus.com/api/v2/symbol-scales?symbol={symbol}
Copie

Réponse


1{
2  "status": "success",
3  "message": "success",
4  "data": [
5    {
6      "scale": "0.01",
7      "index": 0 // index
8    },
9    ...
10  ]
11}
Copie

Liste des marchés

Demande

GET
https://api-app.cryptomus.com/v1/exchange/market
Copie

Réponse


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}
Copie

Exemple de mise en œuvre

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            
Copie

Python


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            
Copie

Tous les points de terminaison renvoient l'heure au format d'horodatage Unix

Structure du message de demande

NomType de paramètreDéfinition
idIntegerDoit être unique pour traiter la réponse à votre demande
methodStringLe nom de la demande
paramsArrayTransmettez les paramètres de la méthode ici

Type de paramètre

Integer

Définition

Doit être unique pour traiter la réponse à votre demande

Type de paramètre

String

Définition

Le nom de la demande

Type de paramètre

Array

Définition

Transmettez les paramètres de la méthode ici

La connexion WebSocket sera interrompue si un JSON non valide est envoyé

Types de messages et de demandes

- Requête (`ping`, `candles_request`, etc.)

- Abonnement (`candles_subscribe`, `lastprice_subscribe`, etc.).  Le réabonnement au même type de données sera annulé.

Message de réponse

NomType de paramètreDéfinition
idIntegerIdentifiant de la demande
dataNullSi la requête a échoué. En cas de succès, la structure de réponse pour chaque méthode est présentée ci-dessous.
errorNullen cas de succès. En cas d'erreur
messageString
codeIntegerCode d'erreur

Type de paramètre

Integer

Définition

Identifiant de la demande

Type de paramètre

Null

Définition

Si la requête a échoué. En cas de succès, la structure de réponse pour chaque méthode est présentée ci-dessous.

Type de paramètre

Null

Définition

en cas de succès. En cas d'erreur

Type de paramètre

Integer

Définition

Code d'erreur

Code : 1. Message : Format de message non valide

Code : 2. Message : Autres erreurs

Types de messages de réponse

- Résultat de la requête

- Statut de l'abonnement (succès/échec)

- Mettre à jour les événements

Ping-pong

Ping


1{    
2  "id": 0,   
3  "method": "ping",   
4  "params": []
5} 
6          
Copie

Réponse pong


1{
2  "id": 0,
3  "method": "pong",
4  "data": null,
5  "error": null
6}         
7          
Copie

Exemples d'abonnements

Demande


1{    
2  "id": 0,    
3  "method": "trade_subscribe",    
4  "params": [  
5      "BTC_USDT"    
6  ]
7}            
8          
Copie

Réponse


1{    
2  "id": 0,    
3  "method": "trade_subscribe",  
4  "data": {       
5	  "status": "success"    
6  },    
7  "error": null  
8} 
9          
Copie

Événement de mise à jour


1{    
2  "id": 0,    
3  "method": "trade_update",    
4  "data": [], // See structure for each method below  
5  "error": null
6}  
7          
Copie

Dernier prix

Abonnement


1{   
2  "id": 0,   
3  "method": "lastprice_subscribe",   
4  "params": [   
5    "BTC_USDT",  // Market
6    "BTC_USDT",       
7    "ETH_USDT",      
8    ...    
9  ]
10}       
11          
Copie
Abonnez-vous à tous les événements lastprice_subscribe

1{    
2  "id": 0,   
3  "method": "lastprice_subscribe",   
4  "params": [  
5    "all" // This also works for other events    
6  ]
7}
8            
Copie

Réponse


1{    
2  "id": 0,    
3  "method": "lastprice_subscribe",  
4  "data": {       
5    "status": "success"    
6  },    
7  "error": null  
8}   
9          
Copie

Événement


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          
Copie

Annulation d'abonnement

Demande

1{    
2  "id": 0,   
3  "method": "lastprice_unsubscribe",   
4  "params": [  
5    "BTC_USDT",       
6    "ETH_USDT",       
7    ...    
8  ]
9}             
10            
Copie
Se désabonner de tous les événements lastprice_unsubscribe

1{    
2  "id": 0,   
3  "method": "lastprice_unsubscribe",   
4  "params": [  
5    "all" // This also works for other events   
6  ]
7}  
8            
Copie

Réponse


1{    
2  "id": 0,    
3  "data": {      
4    "status": "success"    
5  },    
6  "error": null  
7}
Copie

Profondeur

Abonnement

Vous devez d’abord obtenir l’indice d’échelle du marché comment obtenir


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          
Copie
Abonnez-vous à tous les événements depth_subscribe

1{    
2  "id": 0,   
3  "method": "depth_subscribe",   
4  "params": [  
5    "all" // This also works for other events    
6  ]
7}  
8            
Copie

Réponse


1{    
2  "id": 0,    
3  "method": "depth_subscribe",  
4  "data": {       
5    "status": "success"    
6  },    
7  "error": null  
8} 
9            
Copie

Événement


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            
Copie

Annulation d'abonnement

Demande

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              
Copie
Se désabonner de tous les événements depth_unsubscribe

1{    
2  "id": 0,   
3  "method": "depth_unsubscribe",   
4  "params": [  
5    "all" // This also works for other events    
6  ]
7}  
8              
Copie
Réponse

1{    
2  "id": 0,    
3  "data": {      
4    "status": "success"    
5  },    
6  "error": null  
7}  
8              
Copie

Téléscripteur

Abonnement


1{   
2  "id": 0,   
3  "method": "ticker_subscribe",   
4  "params": [   
5    "BTC_USDT",  // Market
6    "BTC_USDT",       
7    "ETH_USDT",      
8    ...    
9  ]
10}  
11          
Copie
Abonnez-vous à tous les événements ticker_subscribe

1{    
2  "id": 0,   
3  "method": "ticker_subscribe",   
4  "params": [  
5    "all" // This also works for other events    
6  ]
7} 
8          
Copie

Réponse


1{    
2  "id": 0,    
3  "method": "ticker_subscribe",  
4  "data": {       
5    "status": "success"    
6  },    
7  "error": null  
8}  
9          
Copie

Événement


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          
Copie

Annulation d'abonnement

Demande

1{    
2  "id": 0,   
3  "method": "ticker_unsubscribe",   
4  "params": [  
5    "BTC_USDT",      // Market 
6    "ETH_USDT",       
7    ...    
8  ]
9} 
10            
Copie
Se désabonner de tous les événements ticker_unsubscribe

1{    
2  "id": 0,   
3  "method": "ticker_unsubscribe",   
4  "params": [  
5    "all" // This also works for other events    
6  ]
7} 
8            
Copie
Réponse

1{    
2  "id": 0,    
3  "data": {      
4    "status": "success"    
5  },    
6  "error": null  
7}  
8            
Copie

Métiers

Abonnement


1{   
2  "id": 0,   
3  "method": "trade_subscribe",   
4  "params": [   
5    "BTC_USDT",  // Market
6    "BTC_USDT",       
7    "ETH_USDT",      
8    ...    
9  ]
10}  
11          
Copie
Abonnez-vous à tous les événements trade_subscribe

1{    
2  "id": 0,   
3  "method": "trade_subscribe",   
4  "params": [  
5    "all" // This also works for other events    
6  ]
7}  
8          
Copie

Réponse


1{    
2  "id": 0,    
3  "method": "trade_subscribe",  
4  "data": {       
5    "status": "success"    
6  },    
7  "error": null  
8}  
9          
Copie

Événement


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          
Copie

Annulation d'abonnement

Demande

1{    
2  "id": 0,   
3  "method": "trade_unsubscribe",   
4  "params": [  
5    "BTC_USDT",    // Market   
6    "ETH_USDT",       
7    ...    
8  ]
9}  
10            
Copie
Se désabonner de tous les événements trade_unsubscribe

1{    
2  "id": 0,   
3  "method": "trade_unsubscribe",   
4  "params": [  
5    "all" // This also works for other events    
6  ]
7}  
8            
Copie
Réponse

1{    
2  "id": 0,    
3  "data": {      
4    "status": "success"    
5  },    
6  "error": null  
7}  
8            
Copie

Ordres

Abonnement


1{   
2  "id": 0,   
3  "method": "order_subscribe",   
4  "params": [   
5    "BTC_USDT",  // Market
6    "TRX_USDT",       
7    "ETH_USDT",       
8    ...    
9  ]
10}  
11          
Copie

Abonnez-vous à tous les événements order_subscribe


1{    
2  "id": 0,  
3  "method": "order_subscribe",    
4  "params": [      
5    "all" // This also works for other events    
6  ]
7}  
8          
Copie

Réponse


1{    
2  "id": 0,    
3  "method": "order_subscribe",  
4  "data": {      
5    "status": "success"    
6  },    
7  "error": null 
8} 
9          
Copie

Événements

Commande créée

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            
Copie
Commande mise à jour

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            
Copie
Commande terminée

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            
Copie

Se désabonner des mises à jour

De marchés spécifiques

1{    
2  "id": 0,   
3  "method": "order_unsubscribe",   
4  "params": [  
5    "BTC_USDT",   // Market    
6    "ETH_USDT",       
7    ...    
8  ]
9} 
10            
Copie
De tous les marchés

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            
Copie
Réponse

1{    
2  "id": 0,    
3  "data": {      
4    "status": "success"    
5  },    
6  "error": null   
7} 
8            
Copie

Soldes

Abonnement

Monnaie de base de liste de marché


1{   
2  "id": 0,   
3  "method": "balance_subscribe",   
4  "params": [   
5    "BTC",  // BaseCurrency from market list
6    "TRX,      
7    "ETH",       
8    ...    
9  ]
10}  
11          
Copie

Abonnez-vous à tous les événements balance_subscribe


1{    
2  "id": 0,  
3  "method": "balance_subscribe",    
4  "params": [       
5    "all" // This also works for other events    
6  ]
7}  
8          
Copie

Réponse


1{    
2  "id": 0,    
3  "method": "balance_subscribe",  
4  "data": {      
5    "status": "success"    
6  },    
7  "error": null   
8}  
9          
Copie

Événements


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          
Copie

Se désabonner des événements

À partir de devises spécifiques

Monnaie de 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            
Copie
De toutes les devises

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            
Copie
Réponse

1{    
2  "id": 0,    
3  "data": {      
4    "status": "success"    
5  },    
6  "error": null   
7}  
8            
Copie

Offres

Abonnement


1{   
2  "id": 0,   
3  "method": "deal_subscribe",   
4  "params": [   
5    "BTC_USDT",   // Market
6    "TRX_USDT,       
7    "ETH_USDT",       
8    ...   
9  ]
10} 
11          
Copie

Abonnez-vous à tous les événements deal_subscribe


1{    
2  "id": 0,  
3  "method": "deal_subscribe",    
4  "params": [       
5    "all" // This also works for other events    
6  ]
7}  
8          
Copie

Réponse


1{    
2  "id": 0,    
3  "data": {      
4    "status": "success"    
5  },    
6  "error": null  
7}
8          
Copie

Événements


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          
Copie

Se désabonner des mises à jour

De marchés spécifiques

1{    
2  "id": 0,   
3  "method": "deal_unsubscribe",   
4  "params": [  
5    "BTC_USDT",   // Market
6    "TRX_USDT,       
7    ...    
8  ]
9} 
10            
Copie
De tous les marchés

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            
Copie
Réponse

1{    
2  "id": 0,    
3  "data": {      
4    "status": "success"    
5  },    
6  "error": null   
7} 
8            
Copie