OKX JavaScript SDK example: rest-private-trade.ts

OKX REST private trade JavaScript example for the Siebly OKX SDK, covering exchange REST API and WebSocket integration, setup, and production SDK docs.

We use environment variables in our examples for API keys. It is your responsibility to manage and secure your keys appropriately.

examples/OKX/Rest/rest-private-trade.ts

What this example covers

  • OKX REST API JavaScript example.
  • Uses the Siebly OKX SDK package okx-api instead of hand-written HTTP request plumbing.
  • Source path: OKX/Rest/rest-private-trade.ts.
  • Imports SDK symbols including RestClient.
  • Calls SDK methods such as on(), subscribeTopic(), getBalance(), submitOrder(), getInstruments().

How to use this example

  • Start here for the specific request or stream pattern, then check the matching SDK guide for install, credentials, and operational notes.
  • Open the repository source when you need the latest committed version: GitHub source file.
/* eslint-disable @typescript-eslint/no-unused-vars */import { RestClient } from 'okx-api';import { OrderRequest } from 'okx-api'; // read from environmental variablesconst 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/rest-private-trade.ts // note the single quotes, preventing special characters such as $ from being incorrectly passed if (!API_KEY || !API_SECRET || !API_PASS) {  throw new Error(    'Missing api credentials. Use environmental variables or hard code in the script',  );} console.log(new Date(), 'Using credentials: ', {  API_KEY,  API_SECRET,  API_PASS,}); const client = new RestClient({  apiKey: API_KEY,  // apiKey: 'apiKeyHere',  apiSecret: API_SECRET,  // apiSecret: 'apiSecretHere',  apiPass: API_PASS,  // apiPass: 'apiPassHere',}); // const wsClient = new WebsocketClient({//   apiKey: API_KEY,//   apiSecret: API_SECRET,//   apiPass: API_PASS,// }); function logWSEvent(type: string, data: any) {  console.log(new Date(), `WS ${type} event: `, data);} // simple sleep functionfunction promiseSleep(milliseconds: number) {  return new Promise((resolve) => setTimeout(resolve, milliseconds));} // WARNING: for sensitive math you should be using a library such as decimal.js!function roundDown(value: any, decimals: number) {  return Number(    Math.floor(parseFloat(value + 'e' + decimals)) + 'e-' + decimals,  );} /** This is a simple script wrapped in a immediately invoked function expression, designed to check for any available BTC balance and immediately sell the full amount for USDT */(async () => {  try {    // // Add event listeners to log websocket events on account    // wsClient.on('update', (data) => logWSEvent('update', data));    // wsClient.on('open', (data) => logWSEvent('open', data));    // wsClient.on('response', (data) => logWSEvent('response', data));    // wsClient.on('reconnect', (data) => logWSEvent('reconnect', data));    // wsClient.on('reconnected', (data) => logWSEvent('reconnected', data));    // wsClient.on('authenticated', (data) => logWSEvent('authenticated', data));    // wsClient.on('exception', (data) => logWSEvent('exception', data));     // // Subscribe to private account topics    // wsClient.subscribeTopic('SPBL', 'account');    // wsClient.subscribeTopic('SPBL', 'orders');     // wait briefly for ws to be ready (could also use the response or authenticated events, to make sure topics are subscribed to before starting)    await promiseSleep(2.5 * 1000);     const allBalances = await client.getBalance();    // const balances = allBalances.filter((bal) => Number(bal.available) != 0);    const usdtBalanceResult = allBalances[0].details.find(      (bal) => bal.ccy === 'USDT',    );    console.log('BTC balance result: ', usdtBalanceResult);     const usdtBalance = Number(usdtBalanceResult?.availBal);    // console.log('balance: ', JSON.stringify(balances, null, 2));     if (!usdtBalanceResult || !usdtBalance) {      console.error('No USDT to trade');      return;    }     console.log(`USDT available: ${usdtBalance}`);     const symbol = 'BTC-USDT';    const quantity = 0.002;     const order: OrderRequest = {      instId: symbol,      ordType: 'market',      side: 'buy',      sz: String(usdtBalance * 0.5),      tdMode: 'cash',      tgtCcy: 'base_ccy',    };     const buyResult = await client.submitOrder(order);     console.log('result: ', buyResult);    return;    // example to find minimum allowed size for a symbol and place an order with it    /*  const symbol = 'BTC-USDT-SWAP';     const symbolsResult = await client.getInstruments({      instType: 'SWAP',    });    const btcRules = symbolsResult.find((rule) => rule.instId === symbol);    console.log('btc trading rules: ', btcRules);    if (!btcRules) {      return console.log('no rules found for trading ' + symbol);    }     const minSize = Number(btcRules.minSz);     const order = {      instId: symbol,      tdMode: 'cross',      ordType: 'market',      side: 'sell',      sz: String(minSize),    } as const;     console.log('submitting order: ', order);     const sellResult = await client.submitOrder(order);     console.log('sell result: ', sellResult); */  } catch (e) {    console.error('request failed: ', e);  }})(); 

Subscribe on Substack

Complete the Substack form below to join our newsletter. Substack handles all subscriber data directly.