Connecting to the MEXC WebSocket API

/ 35

I was not able to find very much documentation for MEXC's WebSocket endpoint(s), but was able to wade through a few resources and build a simple deal (trade) subscription monitor.

Hope this helps someone out there :)

Usage:

const mexc = new MEXCStreamer()// handle unknown messagesmexc.on('message', (msg) => {    console.log('[???]', msg.data)})// handle deal/trade notificationsmexc.on('trade', (data) => {    let {S: type, p: price, t: time, v: amount} = data    const fiatValue = parseFloat(( ( price ) * ( amount ) ).toFixed(2))    if (fiatValue > mexc.minFiatValue) {        const formattedFiatValue = mexc.amountFormat.format(fiatValue)        const formattedPrice = mexc.amountFormat.format(price)        const orderType = mexc.orderTypes[type];        let formattedAmount        switch (true) {            case ( amount > 1000000 ):                formattedAmount = `${mexc.amountFormat.format(amount / 1000000)}M`                break            case ( amount > 10000 ):                formattedAmount = `${mexc.amountFormat.format(amount / 1000)}K`                break            default:                formattedAmount = `${mexc.amountFormat.format(amount)}`        }        const msg = `[TRADE] ${( new Date(time) ).toLocaleTimeString()} ${orderType} • $${formattedFiatValue} (${formattedAmount} BTC @ $${formattedPrice})`        console.log(msg)    }})mexc.start()

And here's the MEXCStreamer TypeScript class:

import * as WebSocket from "ws"import { clearInterval, setInterval } from "timers"import { EventEmitter } from "events"import { parseFixed } from "@ethersproject/bignumber";interface DealData {    t: number,    S: string,    v: number,    p: number}class MEXCStreamer extends EventEmitter {    protected ws: WebSocket | undefined    public minFiatValue = 5    public pair = 'BTCUSDT'    readonly amountFormat = Intl.NumberFormat('en-US')    readonly orderTypes: { [key: string]: string } = {        '1': '🙌 BUY',        '2': '🫠 SELL'    }    private interval: NodeJS.Timer | undefined    start() {        this.ws = new WebSocket('wss://wbs.mexc.com/ws')        this.ws.onopen = this.handleOpen.bind(this)        this.ws.onerror = this.handleError.bind(this)        this.ws.onmessage = this.handleMessage.bind(this)    }    destroy() {        if (this.ws)            this.ws.close()        if (this.interval)            clearInterval(this.interval)    }    private ping() {        if (this.ws)            this.ws.send('{"method": "PING"}')    }    private handleError(err: WebSocket.ErrorEvent) {        throw err    }    private handleOpen() {        console.log('⚡️ Connected to MEXC stream!')        if (this.ws) {            this.ws.send(                JSON.stringify({"method": "SUBSCRIPTION", "params": [`spot@public.deals.v3.api@${this.pair}`]})            )            this.interval = setInterval(() => {                this.ping()            }, 30 * 1000)        }    }    private async handleMessage(msg: any) {        const data = JSON.parse(msg.data)        if (data.c?.startsWith('spot@public.deals.v3.api@')) {            this.emit('trade', data.d.deals[0])        } else {            // unhandled incoming message            this.emit('message', msg)        }    }}

Git the gist here.