Aliran WebSocket
Waktu Koneksi Habis
- Server menutup koneksi WebSocket setelah 60 detik tidak aktif (Koneksi Tetap Aktif)
- Ketidakaktifan didefinisikan sebagai tidak adanya permintaan yang dikirim oleh klien
Koneksi Tetap Hidup
Untuk menjaga koneksi WebSocket tetap aktif, Anda perlu
- Kirim permintaan berkala setiap 50 detik
- Tangani potensi pemutusan koneksi dengan tepat dalam logika aplikasi Anda
Otorisasi
Perkenalan
Sebelum menandatangani permintaan WebSocket apa pun, Anda harus membuat kunci API di akun pribadi Cryptomus Anda
Petunjuk terperinci untuk membuat kunci API tersedia Di Sini
Mendapatkan Token Sekali Pakai untuk Koneksi
Sebelum terhubung ke server WebSocket, Anda perlu mendapatkan token autentikasi satu kali
Anda dapat memperoleh token dengan mengirimkan permintaan yang sesuai
Token berlaku selama 5 menit atau sampai koneksi pertama berhasil
Menghubungkan ke Server WebSocket
Untuk terhubung ke server WebSocket
1. Dapatkan satu kali token autentikasi
2. Tentukan token dalam parameter kueri token saat membuat koneksi
Contoh URL koneksi: wss://api-ws.cryptomus.com/ws?token=b0b1cacd26993392ecf072155bd1686c96e380ad12cefa564aa6665c85c77334
Token hanya dapat digunakan sekali. Untuk setiap koneksi baru, Anda perlu meminta token baru.
Setelah verifikasi token berhasil, koneksi akan dibuat, dan Anda dapat berlangganan saluran yang tersedia
Mendapatkan Token Autentikasi Satu Kali untuk Koneksi WebSocket
Memungkinkan pembuatan token autentikasi satu kali untuk menghubungkan ke server WebSocket. Token ini berlaku hingga koneksi pertama berhasil atau hingga masa berlakunya habis (5 menit).
Header Otorisasi
Informasi lengkap tentang header otorisasi yang diperlukan tersedia Di Sini
Tanggapan
{ "token": "168b34a3a12370740ff1654f0d0c4726ff1bba8c4675edc0d7553f15e5a2a094" }
MenyalinKode yang mungkin
200: Pesanan berhasil dibuat
404: Pengguna atau sumber daya tidak ditemukan
500: Kesalahan server internal
Simbol skala kedalaman
Meminta
Tanggapan
1{
2 "status": "success",
3 "message": "success",
4 "data": [
5 {
6 "scale": "0.01",
7 "index": 0 // index
8 },
9 ...
10 ]
11}
MenyalinDaftar pasar
Meminta
Tanggapan
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}
MenyalinContoh Implementasi
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
MenyalinPython
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
MenyalinSemua titik akhir mengembalikan waktu dalam format stempel waktu Unix
Struktur Pesan Permintaan
Nama | Jenis parameter | Definisi |
---|---|---|
id | Integer | Harus unik untuk memproses respons terhadap permintaan Anda |
method | String | Nama permintaan |
params | Array | Lewatkan parameter untuk metode di sini |
Jenis parameter
IntegerDefinisi
Harus unik untuk memproses respons terhadap permintaan AndaJenis parameter
StringDefinisi
Nama permintaanJenis parameter
ArrayDefinisi
Lewatkan parameter untuk metode di sini
Koneksi WebSocket akan dihentikan jika JSON yang tidak valid dikirim
Jenis pesan dan permintaan
- Permintaan (`ping`, `candles_request`, dll.)
- Berlangganan (`candles_subscribe`, `lastprice_subscribe`, dll.). Berlangganan ulang ke tipe data yang sama akan dibatalkan.
Pesan Tanggapan
Nama | Jenis parameter | Definisi |
---|---|---|
id | Integer | Permintaan pengenal |
data | Null | jika permintaan gagal. Jika berhasil, struktur respons untuk setiap metode ditunjukkan di bawah ini. |
error | Null | jika berhasil. Jika terjadi kesalahan |
message | String | |
code | Integer | Kode kesalahan |
Jenis parameter
IntegerDefinisi
Permintaan pengenalJenis parameter
NullDefinisi
jika permintaan gagal. Jika berhasil, struktur respons untuk setiap metode ditunjukkan di bawah ini.Jenis parameter
NullDefinisi
jika berhasil. Jika terjadi kesalahanJenis parameter
IntegerDefinisi
Kode kesalahan
Kode: 1. Pesan: Format pesan tidak valid
Kode: 2. Pesan: Kesalahan lainnya
Jenis Pesan Respons
- Hasil kueri
- Status berlangganan (berhasil/gagal)
- Perbarui acara
Ping-pong
Ping
1{
2 "id": 0,
3 "method": "ping",
4 "params": []
5}
6
MenyalinRespon pong
1{
2 "id": 0,
3 "method": "pong",
4 "data": null,
5 "error": null
6}
7
MenyalinContoh langganan
Meminta
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "BTC_USDT"
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
MenyalinPerbarui Acara
1{
2 "id": 0,
3 "method": "trade_update",
4 "data": [], // See structure for each method below
5 "error": null
6}
7
MenyalinHarga terakhir
Berlangganan
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11
MenyalinBerlangganan semua acara lastprice_subscribe
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
MenyalinPeristiwa
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
MenyalinPembatalan Langganan
Meminta
1{
2 "id": 0,
3 "method": "lastprice_unsubscribe",
4 "params": [
5 "BTC_USDT",
6 "ETH_USDT",
7 ...
8 ]
9}
10
MenyalinBerhenti berlangganan dari semua acara lastprice_unsubscribe
1{
2 "id": 0,
3 "method": "lastprice_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
MenyalinKedalaman
Berlangganan
Pertama Anda perlu mendapatkan indeks skala pasar cara mendapatkan
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
MenyalinBerlangganan semua acara depth_subscribe
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
MenyalinPeristiwa
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
MenyalinPembatalan Langganan
Meminta
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
MenyalinBerhenti berlangganan dari semua acara depth_unsubscribe
1{
2 "id": 0,
3 "method": "depth_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
MenyalinJantung
Berlangganan
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11
MenyalinBerlangganan semua acara ticker_subscribe
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
MenyalinPeristiwa
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
MenyalinPembatalan Langganan
Meminta
1{
2 "id": 0,
3 "method": "ticker_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10
MenyalinBerhenti berlangganan dari semua acara ticker_unsubscribe
1{
2 "id": 0,
3 "method": "ticker_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
MenyalinPerdagangan
Berlangganan
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11
MenyalinBerlangganan semua acara trade_subscribe
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
MenyalinPeristiwa
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
MenyalinPembatalan Langganan
Meminta
1{
2 "id": 0,
3 "method": "trade_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10
MenyalinBerhenti berlangganan dari semua acara trade_unsubscribe
1{
2 "id": 0,
3 "method": "trade_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
MenyalinPesanan
Berlangganan
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11
MenyalinBerlangganan semua acara order_subscribe
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
MenyalinAcara
Pesanan telah dibuat
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
MenyalinPesanan diperbarui
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
MenyalinPesanan selesai
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
MenyalinBerhenti berlangganan pembaruan
Dari pasar tertentu
1{
2 "id": 0,
3 "method": "order_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10
MenyalinDari semua pasar
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
MenyalinTanggapan
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
MenyalinSaldo
Berlangganan
Mata Uang Dasar dari daftar pasar
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "params": [
5 "BTC", // BaseCurrency from market list
6 "TRX,
7 "ETH",
8 ...
9 ]
10}
11
MenyalinBerlangganan semua acara balance_subscribe
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
MenyalinAcara
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
MenyalinBerhenti berlangganan dari acara
Dari mata uang tertentu
Mata Uang Dasar dari market-list
1{
2 "id": 0,
3 "method": "balance_unsubscribe",
4 "params": [
5 "BTC", // BaseCurrency from market list
6 "ETH",
7 ...
8 ]
9}
10
MenyalinDari semua mata uang
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
MenyalinTanggapan
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
MenyalinPenawaran
Berlangganan
1{
2 "id": 0,
3 "method": "deal_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT,
7 "ETH_USDT",
8 ...
9 ]
10}
11
MenyalinBerlangganan semua acara deal_subscribe
1{
2 "id": 0,
3 "method": "deal_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
MenyalinTanggapan
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
MenyalinAcara
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
MenyalinBerhenti berlangganan pembaruan
Dari pasar tertentu
1{
2 "id": 0,
3 "method": "deal_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT,
7 ...
8 ]
9}
10
MenyalinDari semua pasar
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
MenyalinTanggapan
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
Menyalin