Bitget TypeScript SDK example: ws-api-client-trade.ts

Bitget TypeScript SDK V3 UTA WebSocket API example for Bitget/V3 - UTA/WS-API/ws-api-client-trade.ts. Source code reference for exchange REST, WebSocket, and API integration patterns with links to matching Siebly SDK documentation.

Example Path

Bitget/V3 - UTA/WS-API/ws-api-client-trade.ts

Source Link

Repository source: https://github.com/sieblyio/crypto-api-examples/blob/master/examples/Bitget/V3 - UTA/WS-API/ws-api-client-trade.ts

Related SDK Docs

Example Source

import { DefaultLogger, WebsocketAPIClient } from 'bitget-api';

// function attachEventHandlers<TWSClient extends WebsocketClientV3>(
//   wsClient: TWSClient,
// ): void {
//   wsClient.on('update', (data) => {
//     console.log('raw message received ', JSON.stringify(data));
//   });
//   wsClient.on('open', (data) => {
//     console.log('ws connected', data.wsKey);
//   });
//   wsClient.on('reconnect', ({ wsKey }) => {
//     console.log('ws automatically reconnecting.... ', wsKey);
//   });
//   wsClient.on('reconnected', (data) => {
//     console.log('ws has reconnected ', data?.wsKey);
//   });
//   wsClient.on('authenticated', (data) => {
//     console.log('ws has authenticated ', data?.wsKey);
//   });
// }

(async () => {
  const logger = {
    ...DefaultLogger,
    trace: (...params: any[]) => console.log('trace', ...params),
  };

  const API_KEY = process.env.API_KEY_COM;
  const API_SECRET = process.env.API_SECRET_COM;
  const API_PASS = process.env.API_PASS_COM;

  // If running from CLI in unix, you can pass env vars as such:
  // API_KEY_COM='lkm12n3-2ba3-1mxf-fn13-lkm12n3a' API_SECRET_COM='035B2B9637E1BDFFEE2646BFBDDB8CE4' API_PASSPHRASE_COM='ComplexPa$!23$5^' ts-node examples/ws-private.ts

  const wsClient = new WebsocketAPIClient(
    {
      apiKey: API_KEY,
      apiSecret: API_SECRET,
      apiPass: API_PASS,

      // Whether to use the demo trading wss connection
      // demoTrading: true,

      // If you want your own event handlers instead of the default ones with logs,
      // disable this setting and see the `attachEventHandlers` example below:
      // attachEventListeners: false
    },
    logger, // Optional: inject a custom logger
  );

  // Optional, see above "attachEventListeners". Attach basic event handlers, so nothing is left unhandled
  // attachEventHandlers(wsClient.getWSClient());

  // Optional: prepare the WebSocket API connection in advance.
  // This happens automatically but you can do this early before making any API calls, to prevent delays from a cold start.
  await wsClient.getWSClient().connectWSAPI();

  /**
   * Bitget's WebSocket API be used like a REST API, through this SDK's WebsocketAPIClient. The WebsocketAPIClient is a utility class wrapped around WebsocketClientV3's sendWSAPIRequest() capabilities.
   *
   * Each request sent via the WebsocketAPIClient will automatically:
   * - route via the active WS API connection
   * - return a Promise, which automatically resolves/rejects when a matching response is received
   *
   * Note: this requires V3/UTA API keys!
   */

  /**
   * Place Order
   * https://www.bitget.com/api-doc/uta/websocket/private/Place-Order-Channel#request-parameters
   */
  try {
    const res = await wsClient.submitNewOrder('spot', {
      orderType: 'limit',
      price: '100',
      qty: '0.1',
      side: 'buy',
      symbol: 'BTCUSDT',
      timeInForce: 'gtc',
    });
    /**
      const res = {
        "event": "trade",
        "id": "1750034396082",
        "category": "spot",
        "topic": "place-order",
        "args": [
          {
            "symbol": "BTCUSDT",
            "orderId": "xxxxxxxx",
            "clientOid": "xxxxxxxx",
            "cTime": "1750034397008"
          }
        ],
        "code": "0",
        "msg": "success",
        "ts": "1750034397076"
      };
     */

    console.log(new Date(), 'WS API "submitNewOrder()" result: ', res);
  } catch (e) {
    console.error(new Date(), 'Exception with WS API "submitNewOrder()": ', e);
  }

  /**
   * Batch Place Order Channel
   * https://www.bitget.com/api-doc/uta/websocket/private/Batch-Place-Order-Channel
   */

  try {
    /**
     * Note: batch place will never reject the request, even if all orders were rejected. Check the "code" and "msg" properties for individual orders in the response, to detect batch place errors.
     */
    const res = await wsClient.placeBatchOrders('spot', [
      {
        clientOid: 'xxxxxxxx1',
        orderType: 'limit',
        price: '100',
        qty: '0.1',
        side: 'buy',
        symbol: 'BTCUSDT',
        timeInForce: 'gtc',
      },
      {
        clientOid: 'xxxxxxxx2',
        orderType: 'limit',
        price: '100',
        qty: '0.15',
        side: 'buy',
        symbol: 'BTCUSDT',
        timeInForce: 'gtc',
      },
    ]);

    /**
      const res = {
        "event": "trade",
        "id": "1750035029506",
        "category": "spot",
        "topic": "batch-place",
        "args": [
          {
            "code": "0",
            "msg": "Success",
            "symbol": "BTCUSDT",
            "orderId": "xxxxxxxx",
            "clientOid": "xxxxxxxx"
          },
          {
            "code": "0",
            "msg": "Success",
            "symbol": "BTCUSDT",
            "orderId": "xxxxxxxx",
            "clientOid": "xxxxxxxx"
          }
        ],
        "code": "0",
        "msg": "Success",
        "ts": "1750035029925"
      }
     */

    console.log(new Date(), 'WS API "placeBatchOrders()" result: ', res);
  } catch (e) {
    console.error(
      new Date(),
      'Exception with WS API "placeBatchOrders()": ',
      e,
    );
  }

  /**
   * Cancel Order
   * https://www.bitget.com/api-doc/uta/websocket/private/Cancel-Order-Channel
   */

  try {
    const res = await wsClient.cancelOrder('spot', {
      clientOid: 'xxxxxxxx1',
    });

    /**
      const res = {
        "event": "trade",
        "id": "1750034870205",
        "topic": "cancel-order",
        "args": [
          {
            "orderId": "xxxxxxxx",
            "clientOid": "xxxxxxxx"
          }
        ],
        "code": "0",
        "msg": "Success",
        "ts": "1750034870597"
      }
     */

    console.log(new Date(), 'WS API "cancelOrder()" result: ', res);
  } catch (e) {
    console.error(new Date(), 'Exception with WS API "cancelOrder()": ', e);
  }

  /**
   * Batch Cancel Order
   * https://www.bitget.com/api-doc/uta/websocket/private/Batch-Cancel-Order-Channel
   */

  try {
    const res = await wsClient.cancelBatchOrders('spot', [
      {
        clientOid: 'xxxxxxxx1',
      },
      {
        orderId: '123123123',
      },
    ]);

    /**
      const res = {
        "event": "trade",
        "id": "bb553cc0-c1fa-454e-956d-c96c8d715760",
        "topic": "batch-cancel",
        "args": [
          {
            "code": "0",
            "msg": "Success",
            "orderId": "xxxxxxxxxxxxx"
          },
          {
            "code": "25204",
            "msg": "Order does not exist",
            "orderId": "xxxxxxxxxxxxx"
          }
        ],
        "code": "0",
        "msg": "Success",
        "ts": "1751980011084"
      }
     */

    console.log(new Date(), 'WS API "cancelBatchOrders()" result: ', res);
  } catch (e) {
    console.error(
      new Date(),
      'Exception with WS API "cancelBatchOrders()": ',
      e,
    );
  }

  console.log(new Date(), 'Reached end of example.');
})();