diff --git a/.nvmrc b/.nvmrc
index 7ea6a59..bb8c76c 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-v20.11.0
+v22.11.0
diff --git a/README.md b/README.md
index bb57b33..2ed0d59 100644
--- a/README.md
+++ b/README.md
@@ -19,21 +19,66 @@
[1]: https://www.npmjs.com/package/bybit-api
-Node.js & JavaScript SDK for the Bybit REST APIs and WebSockets:
+Professional Node.js, JavaScript & TypeScript SDK for the Bybit REST APIs and WebSockets:
-- Complete integration with all Bybit REST APIs & WebSockets.
+- Complete integration with all Bybit REST APIs & WebSockets, including the WebSocket API.
- Actively maintained with a modern, promise-driven interface.
-- TypeScript support (with type declarations for most API requests & responses).
-- Over 450 end-to-end tests making real API calls & WebSocket connections, validating any changes before they reach npm.
-- Robust WebSocket integration with configurable connection heartbeats & automatic reconnect then resubscribe workflows.
- - Event driven messaging.
+- TypeScript support (thorough type declarations for most API requests & responses, including WS API).
+- JavaScript support (TypeScript not required but definitely recommended).
+- Thorough & automatic end-to-end tests making real API calls & WebSocket connections, validating any changes before they reach npm.
+- Proxy support via axios integration.
+- Robust WebSocket consumer integration with configurable heartbeats & automatic reconnect then resubscribe workflows.
+ - Event driven messaging
- Smart websocket persistence
- Automatically handle silent websocket disconnections through timed heartbeats, including the scheduled 24hr disconnect.
- - Automatically handle listenKey persistence and expiration/refresh.
+ - Automatically handle authentication.
- Emit `reconnected` event when dropped connection is restored.
-- Proxy support via axios integration.
+- WebSocket API integration, with two design patterns to choose from:
+ - Asynchronous promise-driven responses:
+ - Make requests like a REST API, using the WebSocket API. No need to subscribe to asynchronous events.
+ - Send commands with the await sendWSAPIRequest(...) method.
+ - Await responses to commands directly in the fully typed sendWSAPIRequest() call.
+ - The method directly returns a promise. Use a try/catch block for convenient error handling without the complexity of asynchronous WebSockets.
+ - See example for more details: [examples/ws-api-promises.ts](./examples/ws-api-promises.ts)
+ - Asynchronous event-driven responses:
+ - Subscribe to `response` and `error` events from WebsocketClient's event emitter.
+ - Send commands with the sendWSAPIRequest(...) method.
+ - Responses to commands will arrive via the `response` and `error` events.
+ - See example for more details: [examples/ws-api-events.ts](./examples/ws-api-events.ts)
- Active community support & collaboration in telegram: [Node.js Algo Traders](https://t.me/nodetraders).
+# Table of Contents
+
+## Overview
+- [Installation](#installation)
+- [Issues & Discussion](#issues--discussion)
+- [Related Projects](#related-projects)
+- [Documentation](#documentation)
+- [Examples](#examples)
+
+## REST API Examples
+- [API Clients](#api-clients)
+- [REST API Usage](#rest-api-usage)
+
+## WebSocket Integration & Examples
+- [WebSockets](#websockets)
+- [WebSocket Subscriptions - Consuming Events](#websocket-subscriptions---consuming-events)
+- [Websocket API - Sending Orders via WebSockets](#websocket-api---sending-orders-via-websockets)
+- [Consumer Load Balancing](#balancing-load-across-multiple-connections)
+
+## Additional Features
+- [Logging](#logging)
+ - [Customise Logging](#customise-logging)
+ - [Debug HTTP Requests](#debug-http-requests)
+- [Browser Usage](#browser-usage)
+ - [Import](#import)
+ - [Webpack](#webpack)
+
+## Contributing
+- [Contributions & Thanks](#contributions--thanks)
+
+------
+
## Installation
`npm install --save bybit-api`
@@ -68,7 +113,7 @@ Check out my related JavaScript/TypeScript/Node.js projects:
## Documentation
-Most methods accept JS objects. These can be populated using parameters specified by Bybit's API documentation, or check the type definition in each class within the github repository (see table below for convenient links to each class).
+Most methods accept JS objects. These can be populated using parameters specified by Bybit's API documentation, or check the type definition in each class within the github repository (see table below for convenient links to each class). TypeScript is definitely recommended, but not required.
- [Bybit API Docs](https://bybit-exchange.github.io/docs/v5/intro)
- [REST Endpoint Function List](./docs/endpointFunctionList.md)
@@ -76,62 +121,17 @@ Most methods accept JS objects. These can be populated using parameters specifie
## Structure
-This connector is fully compatible with both TypeScript and pure JavaScript projects, while the connector is written in TypeScript. A pure JavaScript version can be built using `npm run build`, which is also the version published to [npm](https://www.npmjs.com/package/bybit-api).
+The SDK is written in TypeScript, but fully compatible with both TypeScript and pure JavaScript projects. A pure JavaScript version can be built using `npm run build`. The output of the `build` command is the version published to npm, packaged as a JavaScript module (with types available for you TypeScript users).
-The version on npm is the output from the `build` command and can be used in projects without TypeScript (although TypeScript is definitely recommended).
-- [src](./src) - the whole connector written in TypeScript
-- [lib](./lib) - the JavaScript version of the project (built from TypeScript). This should not be edited directly, as it will be overwritten with each release.
+- [src](./src) - the complete SDK written in TypeScript.
+- [lib](./lib) - the JavaScript version of the project (built from TypeScript) that is published to npm. This should not be edited directly, as it will be overwritten with each release.
- [examples](./examples) - examples & demonstrations. Contributions are welcome!
+- [test](./test) - automated end-to-end tests that run before every release, making real API calls.
---
-## REST API Clients
-
-Bybit has several API groups (originally one per product). Each generation is labelled with the version number (e.g. v1/v2/v3/v5). New projects & developments should use the newest available API generation (e.g. use the V5 APIs instead of V3).
-
-Refer to the [V5 interface mapping page](https://bybit-exchange.github.io/docs/v5/intro#v5-and-v3-interface-mapping-list) for more information on which V5 endpoints can be used instead of previous V3 endpoints.
-
-Here are the available REST clients and the corresponding API groups described in the documentation:
-
-| Class | Description |
-| :----------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
-| [ **V5 API** ] | The new unified V5 APIs (successor to previously fragmented APIs for all API groups). To learn more about the V5 API, please read the [V5 upgrade guideline](https://bybit-exchange.github.io/docs/v5/upgrade-guide). |
-| [RestClientV5](src/rest-client-v5.ts) | Unified V5 all-in-one REST client for all [V5 REST APIs](https://bybit-exchange.github.io/docs/v5/intro) |
-| [WebsocketClient](src/websocket-client.ts) | All WebSocket Events (Public & Private for all API categories) |
-| [ **Derivatives v3** ] | The Derivatives v3 APIs (successor to the Futures V2 APIs) |
-| [UnifiedMarginClient](src/unified-margin-client.ts) | [Derivatives (v3) Unified Margin APIs](https://bybit-exchange.github.io/docs/derivatives/unified/place-order) |
-| [ContractClient](src/contract-client.ts) | [Derivatives (v3) Contract APIs](https://bybit-exchange.github.io/docs/derivatives/contract/place-order). |
-| [ **Other** ] | Other standalone API groups |
-| [CopyTradingClient](src/copy-trading-client.ts) | [Copy Trading APIs](https://bybit-exchange.github.io/docs/category/copy-trade) |
-| [AccountAssetClientV3](src/account-asset-client-v3.ts) | [Account Asset V3 APIs](https://bybit-exchange.github.io/docs/account-asset/internal-transfer) |
-
----
-
-### Deprecated/Obsolete APIs
-
-The following API clients are for previous generation REST APIs and will be removed in the next major release. Some have already stopped working (because bybit stopped supporting them). You should use the V5 APIs for all new development.
-
-
- Click me to see the list of APIs
-
-| Class | Description |
-| :--------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------: |
-| [ **Futures v2** ] | The Futures v2 APIs |
-| [~~InverseClient~~](src/inverse-client.ts) | [Inverse Perpetual Futures (v2) APIs](https://bybit-exchange.github.io/docs/futuresV2/inverse/) |
-| [~~LinearClient~~](src/linear-client.ts) | [USDT Perpetual Futures (v2) APIs](https://bybit-exchange.github.io/docs/futuresV2/linear/#t-introduction) |
-| [~~InverseFuturesClient~~](src/inverse-futures-client.ts) | [Inverse Futures (v2) APIs](https://bybit-exchange.github.io/docs/futuresV2/inverse_futures/#t-introduction) |
-| [ **Spot** ] | The spot APIs |
-| [SpotClientV3](src/spot-client-v3.ts) | [Spot Market (v3) APIs](https://bybit-exchange.github.io/docs/spot/public/instrument) |
-| [~~SpotClient~~](src/spot-client.ts) (deprecated, SpotClientV3 recommended) | [Spot Market (v1) APIs](https://bybit-exchange.github.io/docs/spot/v1/#t-introduction) |
-| [ **USDC Contract** ] | The USDC Contract APIs |
-| [USDCPerpetualClient](src/usdc-perpetual-client.ts) | [USDC Perpetual APIs](https://bybit-exchange.github.io/docs/usdc/option/?console#t-querydeliverylog) |
-| [USDCOptionClient](src/usdc-option-client.ts) | [USDC Option APIs](https://bybit-exchange.github.io/docs/usdc/option/#t-introduction) |
-| [~~AccountAssetClient~~](src/account-asset-client.ts) (deprecated, AccountAssetClientV3 recommended) | [Account Asset V1 APIs](https://bybit-exchange.github.io/docs/account_asset/v1/#t-introduction) |
-
-
-
----
+## Examples
Examples for using each client can be found in:
@@ -140,73 +140,99 @@ Examples for using each client can be found in:
If you're missing an example, you're welcome to request one. Priority will be given to [github sponsors](https://github.com/sponsors/tiagosiebler).
-### Usage
+## API Clients
+
+You should be using the V5 APIs. If you aren't, you should upgrade your project to use the V5 APIs as soon as possible. Bybit used to have several API groups (originally one per product), but the V5 API is currently the latest standard.
+
+Refer to the [V5 interface mapping page](https://bybit-exchange.github.io/docs/v5/intro#v5-and-v3-interface-mapping-list) for more information on which V5 endpoints can be used instead of previous V3 endpoints. To learn more about the V5 API, please read the [V5 upgrade guideline](https://bybit-exchange.github.io/docs/v5/upgrade-guide).
+
+Here are the available REST clients and the corresponding API groups described in the documentation:
+
+| Class | Description |
+| :----------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: |
+| [ **V5 API** ] | The new unified V5 APIs (successor to previously fragmented APIs for all API groups). |
+| [RestClientV5](src/rest-client-v5.ts) | Unified V5 all-in-one REST client for all [V5 REST APIs](https://bybit-exchange.github.io/docs/v5/intro) |
+| [WebsocketClient](src/websocket-client.ts) | All WebSocket features (Public & Private consumers for all API categories & the WebSocket API) |
+
+
+## REST API Usage
Create API credentials on Bybit's website:
- [Livenet](https://bybit.com/app/user/api-management?affiliate_id=9410&language=en-US&group_id=0&group_type=1)
- [Testnet](https://testnet.bybit.com/app/user/api-management)
-All REST clients have can be used in a similar way. However, method names, parameters and responses may vary depending on the API category you're using!
-
-Not sure which function to call or which parameters to use? Click the class name in the table above to look at all the function names (they are in the same order as the official API docs), and check the API docs for a list of endpoints/parameters/responses.
The following is a minimal example for using the REST clients included with this SDK. For more detailed examples, refer to the [examples](./examples/) folder in the repository on GitHub:
```typescript
-const {
- InverseClient,
- LinearClient,
- InverseFuturesClient,
- SpotClientV3,
- UnifiedMarginClient,
- USDCOptionClient,
- USDCPerpetualClient,
- AccountAssetClient,
- CopyTradingClient,
- RestClientV5,
-} = require('bybit-api');
+const { RestClientV5 } = require('bybit-api');
+// or
+// import { RestClientV5 } from 'bybit-api';
const restClientOptions = {
- /** Your API key. Optional, if you plan on making private api calls */
- key?: string;
+ /** Your API key */
+ key: 'apiKeyHere',
- /** Your API secret. Optional, if you plan on making private api calls */
- secret?: string;
+ /** Your API secret */
+ secret: 'apiSecretHere',
/** Set to `true` to connect to testnet. Uses the live environment by default. */
- testnet?: boolean;
-
- /** Override the max size of the request window (in ms) */
- recv_window?: number;
-
- /** Default: false. If true, we'll throw errors if any params are undefined */
- strict_param_validation?: boolean;
+ // testnet: true,
/**
- * Optionally override API protocol + domain
- * e.g baseUrl: 'https://api.bytick.com'
- **/
- baseUrl?: string;
+ * Set to `true` to use Bybit's V5 demo trading:
+ * https://bybit-exchange.github.io/docs/v5/demo
+ *
+ * Note: to use demo trading, you should have `testnet` disabled.
+ *
+ * You can find a detailed demoTrading example in the examples folder on GitHub.
+ */
+ // demoTrading: true,
- /** Default: true. whether to try and post-process request exceptions. */
- parse_exceptions?: boolean;
+ /** Override the max size of the request window (in ms) */
+ // recv_window: 5000, // 5000 = 5 seconds
+
+ /**
+ * Enable keep alive for REST API requests (via axios).
+ * See: https://github.com/tiagosiebler/bybit-api/issues/368
+ */
+ // keepAlive: true,
+
+ /**
+ * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over
+ * sockets being kept alive. Only relevant if keepAlive is set to true.
+ * Default: 1000 (defaults comes from https agent)
+ */
+ // keepAliveMsecs: 1000, // 1000 = 1 second
+
+ /**
+ * Optionally override API domain used:
+ * apiRegion: 'default' | 'bytick' | 'NL' | 'HK' | 'TK',
+ **/
+
+ // apiRegion: 'bytick',
/** Default: false. Enable to parse/include per-API/endpoint rate limits in responses. */
- parseAPIRateLimits?: boolean;
+ // parseAPIRateLimits: true,
- /** Default: false. Enable to throw error if rate limit parser fails */
- throwOnFailedRateLimitParse?: boolean;
+ /**
+ * Allows you to provide a custom "signMessage" function,
+ * e.g. to use node crypto's much faster createHmac method
+ *
+ * Look at examples/fasterHmacSign.ts for a demonstration:
+ */
+ // customSignMessageFn: (message: string, secret: string) => Promise;
};
const API_KEY = 'xxx';
const API_SECRET = 'yyy';
-const useTestnet = false;
const client = new RestClientV5({
key: API_KEY,
secret: API_SECRET,
- testnet: useTestnet,
+ // demoTrading: true,
+
// Optional: enable to try parsing rate limit values from responses
// parseAPIRateLimits: true
},
@@ -214,7 +240,7 @@ const client = new RestClientV5({
);
// For public-only API calls, simply don't provide a key & secret or set them to undefined
-// const client = new RestClientV5({});
+// const client = new RestClientV5();
client.getAccountInfo()
.then(result => {
@@ -224,7 +250,7 @@ client.getAccountInfo()
console.error("getAccountInfo error: ", err);
});
-client.getOrderbook({ category: 'linear', symbol: 'BTCUSD' })
+client.getOrderbook({ category: 'linear', symbol: 'BTCUSDT' })
.then(result => {
console.log("getOrderBook result: ", result);
})
@@ -233,131 +259,252 @@ client.getOrderbook({ category: 'linear', symbol: 'BTCUSD' })
});
```
+---
+
## WebSockets
-All API groups can be used via a shared `WebsocketClient`. However, to listen to multiple API groups at once, you will need to make one WebsocketClient instance per API group.
+The WebsocketClient will automatically use the latest V5 WebSocket endpoints by default. To use a different endpoint, use the `market` parameter. Except for the WebSocket API - this can be accessed without any special configuration.
-The WebsocketClient can be configured to a specific API group using the market parameter. These are the currently available API groups:
-| API Category | Market | Description |
-|:----------------------------: |:-------------------: |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| V5 Subscriptions | `market: 'v5'` | The [v5](https://bybit-exchange.github.io/docs/v5/ws/connect) websocket topics for all categories under one market. Use the subscribeV5 method when subscribing to v5 topics. |
-
----
-
-### Older Websocket APIs
-
-The following API groups are still available in the WebsocketClient but are deprecated and may no longer work. They will be removed in the next major release:
-
-
- Click me to see the table
-
-| API Category | Market | Description |
-| :------------------------------: | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| ~~Unified Margin - Options~~ | `market: 'unifiedOption'` | The [derivatives v3](https://bybit-exchange.github.io/docs/derivativesV3/unified_margin/#t-websocket) category for unified margin. Note: public topics only support options topics. If you need USDC/USDT perps, use `unifiedPerp` instead. |
-| ~~Unified Margin - Perps~~ | `market: 'unifiedPerp'` | The [derivatives v3](https://bybit-exchange.github.io/docs/derivativesV3/unified_margin/#t-websocket) category for unified margin. Note: public topics only support USDT/USDC perpetual topics - use `unifiedOption` if you need public options topics. |
-| ~~Futures v2 - Inverse Perps~~ | `market: 'inverse'` | The [inverse v2 perps](https://bybit-exchange.github.io/docs/futuresV2/inverse/#t-websocket) category. |
-| ~~Futures v2 - USDT Perps~~ | `market: 'linear'` | The [USDT/linear v2 perps](https://bybit-exchange.github.io/docs/futuresV2/linear/#t-websocket) category. |
-| ~~Futures v2 - Inverse Futures~~ | `market: 'inverse'` | The [inverse futures v2](https://bybit-exchange.github.io/docs/futuresV2/inverse_futures/#t-websocket) category uses the same market as inverse perps. |
-| ~~Spot v3~~ | `market: 'spotv3'` | The [spot v3](https://bybit-exchange.github.io/docs/spot/v3/#t-websocket) category. |
-| ~~Spot v1~~ | `market: 'spot'` | The older [spot v1](https://bybit-exchange.github.io/docs/spot/v1/#t-websocket) category. Use the `spotv3` market if possible, as the v1 category does not have automatic re-subscribe if reconnected. |
-| ~~Copy Trading~~ | `market: 'linear'` | The [copy trading](https://bybit-exchange.github.io/docs/copy_trading/#t-websocket) category. Use the linear market to listen to all copy trading topics. |
-| ~~USDC Perps~~ | `market: 'usdcPerp` | The [USDC perps](https://bybit-exchange.github.io/docs/usdc/perpetual/#t-websocket) category. |
-| ~~USDC Options~~ | `market: 'usdcOption'` | The [USDC options](https://bybit-exchange.github.io/docs/usdc/option/#t-websocket) category. |
-| ~~Contract v3 USDT~~ | `market: 'contractUSDT'` | The [Contract V3](https://bybit-exchange.github.io/docs/derivativesV3/contract/#t-websocket) category (USDT perps) |
-| ~~Contract v3 Inverse~~ | `market: 'contractInverse'` | The [Contract V3](https://bybit-exchange.github.io/docs/derivativesV3/contract/#t-websocket) category (inverse perps) |
-
- Promise;
};
const ws = new WebsocketClient(wsConfig);
-// (before v5) subscribe to multiple topics at once
-ws.subscribe(['position', 'execution', 'trade']);
-
-// (before v5) and/or subscribe to individual topics on demand
-ws.subscribe('kline.BTCUSD.1m');
-
// (v5) subscribe to multiple topics at once
ws.subscribeV5(['orderbook.50.BTCUSDT', 'orderbook.50.ETHUSDT'], 'linear');
-// (v5) and/or subscribe to individual topics on demand
+// Or one at a time
+ws.subscribeV5('kline.5.BTCUSDT', 'linear');
+ws.subscribeV5('kline.5.ETHUSDT', 'linear');
+
+// Private/public topics can be used in the same WS client instance, even for
+// different API groups (linear, options, spot, etc)
ws.subscribeV5('position', 'linear');
ws.subscribeV5('publicTrade.BTC', 'option');
+/**
+ * The Websocket Client will automatically manage all connectivity & authentication for you.
+ *
+ * If a network issue occurs, it will automatically:
+ * - detect it,
+ * - remove the dead connection,
+ * - replace it with a new one,
+ * - resubscribe to everything you were subscribed to.
+ *
+ * When this happens, you will see the "reconnected" event.
+ */
+
// Listen to events coming from websockets. This is the primary data source
ws.on('update', (data) => {
- console.log('update', data);
+ console.log('data received', JSON.stringify(data, null, 2));
});
-// Optional: Listen to websocket connection open event (automatic after subscribing to one or more topics)
+// Optional: Listen to websocket connection open event
+// (automatic after subscribing to one or more topics)
ws.on('open', ({ wsKey, event }) => {
- console.log('connection open for websocket with ID: ' + wsKey);
+ console.log('connection open for websocket with ID: ', wsKey);
});
-// Optional: Listen to responses to websocket queries (e.g. the response after subscribing to a topic)
+// Optional: Listen to responses to websocket queries
+// (e.g. the response after subscribing to a topic)
ws.on('response', (response) => {
console.log('response', response);
});
-// Optional: Listen to connection close event. Unexpected connection closes are automatically reconnected.
+// Optional: Listen to connection close event.
+// Unexpected connection closes are automatically reconnected.
ws.on('close', () => {
console.log('connection closed');
});
-// Optional: Listen to raw error events. Recommended.
-ws.on('error', (err) => {
- console.error('error', err);
+// Listen to raw error events. Recommended.
+ws.on('exception', (err) => {
+ console.error('exception', err);
+});
+
+ws.on('reconnect', ({ wsKey }) => {
+ console.log('ws automatically reconnecting.... ', wsKey);
+});
+
+ws.on('reconnected', (data) => {
+ console.log('ws has reconnected ', data?.wsKey);
});
```
-See [websocket-client.ts](./src/websocket-client.ts) for further information.
+## Websocket API - Sending orders via WebSockets
+
+Bybit supports sending, amending and cancelling orders over a WebSocket connection. The [WebsocketClient](./src/WebsocketClient.ts) fully supports Bybit's WebSocket API via the `sendWSAPIRequest(...)` method.
+
+Links for reference:
+- [Bybit WebSocket API Documentation](https://bybit-exchange.github.io/docs/v5/websocket/trade/guideline)
+- [WebSocket API Example Node.js/TypeScript/JavaScript](./examples/ws-api-promises.ts).
+
+Note: as of January 2025, the demo trading environment does not support the WebSocket API.
+
+There are two ways to use the WS API, depending on individual preference:
+- event-driven:
+ - send requests via `client.sendWSAPIRequest(wsKey, operation, params)`, fire and forget
+ - handle async replies via event handlers on `client.on('exception', cb)` and `client.on('response', cb)`
+ - See example for more details: [examples/ws-api-events.ts](./examples/ws-api-events.ts)
+- promise-driven:
+ - send requests via `const result = await client.sendWSAPIRequest(wsKey, operation, params)`, which returns a promise
+ - await each call
+ - use try/catch blocks to handle promise rejections
+ - See example for more details: [examples/ws-api-promises.ts](./examples/ws-api-promises.ts)
+
+The below example demonstrates the promise-driven approach, which behaves similar to a REST API. The WebSocket API even accepts the same parameters as the corresponding REST API endpoints, so this approach should be compatible with existing REST implementations. Connectivity, authentication, and processing requests wrapped in promises - these are all handled automatically by the WebsocketClient without additional configuration.
+
+```javascript
+const { WS_KEY_MAP, WebsocketClient } = require('bybit-api');
+
+// or
+// import { WS_KEY_MAP, WebsocketClient } from 'bybit-api';
+
+// Create an instance of the WebsocketClient.
+// This will automatically handle connectivity and authentication for you.
+const wsClient = new WebsocketClient(
+ {
+ key: 'yourApiKeyHere',
+ secret: 'yourApiSecretHere',
+
+ // Whether to use the testnet environment.
+ // Create testnet API keys here: https://testnet.bybit.com/app/user/api-management
+ // testnet: true,
+
+ // Whether to use the livenet demo trading environment
+ // Note: As of Jan 2025, demo trading only supports consuming events, it does
+ // NOT support the WS API.
+ // demoTrading: false,
+ }
+);
+
+// This example is wrapped in an async function, so "await" can be used
+async function main() {
+ /**
+ * Optional. Can be used to prepare a connection before sending
+ * commands (e.g. as part of your startup process).
+ *
+ * This is not necessary and will happen automatically when
+ * sending a command, if you aren't connected/authenticated yet.
+ */
+ // await wsClient.connectWSAPI();
+
+ try {
+ console.log('Step 1: Create an order');
+
+ // The type for `wsAPISubmitOrderResult` is automatically
+ // resolved to `WSAPIResponse`
+ const wsAPISubmitOrderResult = await wsClient.sendWSAPIRequest(
+ WS_KEY_MAP.v5PrivateTrade,
+ 'order.create',
+ {
+ symbol: 'BTCUSDT',
+ side: 'Buy',
+ orderType: 'Limit',
+ price: '50000',
+ qty: '1',
+ category: 'linear',
+ },
+ );
+
+ console.log(
+ `Step 1: Order result (order ID: "${wsAPISubmitOrderResult.data.orderId}"): `,
+ wsAPISubmitOrderResult,
+ );
+ } catch (e) {
+ console.error('Step 1: Order submit exception: ', e);
+ }
+}
+
+// Start executing the example workflow
+main();
+
+```
+
+See the [examples/ws-api-promises.ts](./examples/ws-api-promises.ts) example for a more detailed explanation.
+
+---
+
+### Balancing load across multiple connections
+
+The WebsocketClient will automatically prepare one connection per API group, for all topics in that API group. Any topics that you subscribe to on that WebSocket client will automatically be added to the same connection.
+
+To spread your subscribed topics over multiple connections, e.g. to reduce the throughput of an individual connectionk, you can make one instance of the WebsocketClient per connection group.
+
+```typescript
+const wsClientGroup1 = new WebsocketClient();
+const wsClientGroup2 = new WebsocketClient();
+
+// Attach event listeners to each WS Client
+// Divide your desired topics into separate groups
+```
+
+Important: do not subscribe to the same topics on both clients or you will receive duplicate messages (once per WS client).
---
@@ -365,18 +512,18 @@ See [websocket-client.ts](./src/websocket-client.ts) for further information.
### Customise logging
-Pass a custom logger (or mutate the imported DefaultLogger class) which supports the log methods `silly`, `debug`, `notice`, `info`, `warning` and `error`, or override methods from the default logger as desired, as in the example below:
+Pass a custom logger (or mutate the imported DefaultLogger class) which supports the log methods `trace`, `info` and `error`, or override methods from the default logger as desired, as in the example below:
```javascript
const { WebsocketClient, DefaultLogger } = require('bybit-api');
-// Disable all logging on the silly level
+// Enable all logging on the trace level (disabled by default)
const customLogger = {
...DefaultLogger,
- silly: () => {},
+ trace: (...params) => console.log('trace', ...params),
};
-const ws = new WebsocketClient({ key: 'xxx', secret: 'yyy' }, customLogger);
+const wsClient = new WebsocketClient({ key: 'xxx', secret: 'yyy' }, customLogger);
```
### Debug HTTP requests
@@ -391,16 +538,13 @@ This is the "modern" way, allowing the package to be directly imported into fron
1. Install these dependencies
```sh
- npm install crypto-browserify stream-browserify
+ npm install stream-browserify
```
2. Add this to your `tsconfig.json`
```json
{
"compilerOptions": {
"paths": {
- "crypto": [
- "./node_modules/crypto-browserify"
- ],
"stream": [
"./node_modules/stream-browserify"
]
@@ -437,23 +581,8 @@ Have my projects helped you? Share the love, there are many ways you can show yo
- Or buy me all the coffee:
- ETH(ERC20): `0xA3Bda8BecaB4DCdA539Dc16F9C54a592553Be06C`
-
-#### pixtron
-
-An early generation of this library was started by @pixtron. If this library helps you to trade better on bybit, feel free to donate a coffee to @pixtron:
-
-- BTC `1Fh1158pXXudfM6ZrPJJMR7Y5SgZUz4EdF`
-- ETH `0x21aEdeC53ab7593b77C9558942f0c9E78131e8d7`
-- LTC `LNdHSVtG6UWsriMYLJR3qLdfVNKwJ6GSLF`
-
### Contributions & Pull Requests
Contributions are encouraged, I will review any incoming pull requests. See the issues tab for todo items.
diff --git a/examples/apidoc/V5/Earn/get-product-info.js b/examples/apidoc/V5/Earn/get-product-info.js
new file mode 100644
index 0000000..5421ea3
--- /dev/null
+++ b/examples/apidoc/V5/Earn/get-product-info.js
@@ -0,0 +1,19 @@
+const { RestClientV5 } = require('bybit-api');
+
+const client = new RestClientV5({
+ testnet: true,
+ key: 'apikey',
+ secret: 'apisecret',
+});
+
+client
+ .getEarnProduct({
+ category: 'FlexibleSaving',
+ coin: 'BTC',
+ })
+ .then((response) => {
+ console.log(response);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
diff --git a/examples/apidoc/V5/Earn/get-stake-redeem-order-history.js b/examples/apidoc/V5/Earn/get-stake-redeem-order-history.js
new file mode 100644
index 0000000..5f7200e
--- /dev/null
+++ b/examples/apidoc/V5/Earn/get-stake-redeem-order-history.js
@@ -0,0 +1,19 @@
+const { RestClientV5 } = require('bybit-api');
+
+const client = new RestClientV5({
+ testnet: true,
+ key: 'apikey',
+ secret: 'apisecret',
+});
+
+client
+ .getEarnOrderHistory({
+ category: 'FlexibleSaving',
+ orderId: '0572b030-6a0b-423f-88c4-b6ce31c0c82d',
+ })
+ .then((response) => {
+ console.log(response);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
diff --git a/examples/apidoc/V5/Earn/get-staked-position.js b/examples/apidoc/V5/Earn/get-staked-position.js
new file mode 100644
index 0000000..fd49487
--- /dev/null
+++ b/examples/apidoc/V5/Earn/get-staked-position.js
@@ -0,0 +1,19 @@
+const { RestClientV5 } = require('bybit-api');
+
+const client = new RestClientV5({
+ testnet: true,
+ key: 'apikey',
+ secret: 'apisecret',
+});
+
+client
+ .getEarnPosition({
+ category: 'FlexibleSaving',
+ coin: 'USDT',
+ })
+ .then((response) => {
+ console.log(response);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
diff --git a/examples/apidoc/V5/Earn/stake-redeem.js b/examples/apidoc/V5/Earn/stake-redeem.js
new file mode 100644
index 0000000..178d970
--- /dev/null
+++ b/examples/apidoc/V5/Earn/stake-redeem.js
@@ -0,0 +1,24 @@
+const { RestClientV5 } = require('bybit-api');
+
+const client = new RestClientV5({
+ testnet: true,
+ key: 'apikey',
+ secret: 'apisecret',
+});
+
+client
+ .submitStakeRedeem({
+ category: 'FlexibleSaving',
+ orderType: 'Stake',
+ accountType: 'FUND',
+ amount: '0.35',
+ coin: 'BTC',
+ productId: '430',
+ orderLinkId: 'btc-earn-001',
+ })
+ .then((response) => {
+ console.log(response);
+ })
+ .catch((error) => {
+ console.error(error);
+ });
diff --git a/examples/demo-trading.ts b/examples/demo-trading.ts
index 36a0aaa..951e22a 100644
--- a/examples/demo-trading.ts
+++ b/examples/demo-trading.ts
@@ -26,17 +26,17 @@ const restClient = new RestClientV5({
demoTrading: true,
});
-// Optional, uncomment the "silly" override to log a lot more info about what the WS client is doing
+// Optional, uncomment the "trace" override to log a lot more info about what the WS client is doing
const customLogger = {
...DefaultLogger,
- // silly: (...params) => console.log('trace', ...params),
+ // trace: (...params) => console.log('trace', ...params),
};
const wsClient = new WebsocketClient(
{
key: key,
secret: secret,
- market: 'v5',
+
/**
* Set this to true to enable demo trading for the private account data WS
* Topics: order,execution,position,wallet,greeks
@@ -91,7 +91,7 @@ function setWsClientEventListeners(
websocketClient.on('reconnected', (data) => {
console.log(new Date(), accountRef, 'ws has reconnected ', data?.wsKey);
});
- websocketClient.on('error', (data) => {
+ websocketClient.on('exception', (data) => {
console.error(new Date(), accountRef, 'ws exception: ', data);
});
});
diff --git a/examples/deprecated/rest-contract-private.ts b/examples/deprecated/rest-contract-private.ts
deleted file mode 100644
index 59e1484..0000000
--- a/examples/deprecated/rest-contract-private.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { ContractClient } from '../../src/index';
-
-// or
-// import { ContractClient } from 'bybit-api';
-
-const key = process.env.API_KEY_COM;
-const secret = process.env.API_SECRET_COM;
-
-const client = new ContractClient({
- key,
- secret,
- strict_param_validation: true,
-});
-
-(async () => {
- try {
- const getPositions = await client.getPositions({
- settleCoin: 'USDT',
- });
- console.log('getPositions:', getPositions);
- } catch (e) {
- console.error('request failed: ', e);
- }
-})();
diff --git a/examples/deprecated/rest-contract-public.js b/examples/deprecated/rest-contract-public.js
deleted file mode 100644
index d973b47..0000000
--- a/examples/deprecated/rest-contract-public.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * This is the pure javascript version of the `rest-contract-public.ts` sample
- */
-
-// To use a local build (testing with the repo directly), make sure to `npm run build` first from the repo root
-// const { ContractClient } = require('../dist');
-
-// or, use the version installed with npm
-const { ContractClient } = require('bybit-api');
-
-(async () => {
- const client = new ContractClient();
-
- try {
- const orderbookResult = await client.getOrderBook('BTCUSDT', 'linear');
- console.log('orderbook result: ', orderbookResult);
- } catch (e) {
- console.error('request failed: ', e);
- }
-
-})();
diff --git a/examples/deprecated/rest-contract-public.ts b/examples/deprecated/rest-contract-public.ts
deleted file mode 100644
index 1fecb0b..0000000
--- a/examples/deprecated/rest-contract-public.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * This is the TypeScript version of the `rest-contract-public.js` sample.
- */
-
-// For testing with the repo directly, import from the src folder
-import { ContractClient } from '../../src';
-
-// or, use the version installed with npm
-// import { ContractClient } from 'bybit-api';
-
-(async () => {
- const client = new ContractClient();
-
- try {
- const orderbookResult = await client.getOrderBook('BTCUSDT', 'linear');
- console.log('orderbook result: ', orderbookResult);
- } catch (e) {
- console.error('request failed: ', e);
- }
-})();
diff --git a/examples/deprecated/rest-copy-private.ts b/examples/deprecated/rest-copy-private.ts
deleted file mode 100644
index ebced30..0000000
--- a/examples/deprecated/rest-copy-private.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { CopyTradingClient } from '../../src/index';
-
-// or
-// import { CopyTradingClient } from 'bybit-api';
-
-const key = process.env.API_KEY_COM;
-const secret = process.env.API_SECRET_COM;
-
-const client = new CopyTradingClient({
- key,
- secret,
- strict_param_validation: true,
-});
-
-(async () => {
- try {
- const res = await client.closeOrder({
- symbol: 'BTCUSDT',
- parentOrderId: '419190fe-016c-469a-810e-936bef2f1234',
- });
- console.log('res:', res);
- } catch (e) {
- console.error('request failed: ', e);
- }
-})();
diff --git a/examples/deprecated/rest-linear-public.ts b/examples/deprecated/rest-linear-public.ts
deleted file mode 100644
index d241ee6..0000000
--- a/examples/deprecated/rest-linear-public.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { LinearClient } from '../../src/index';
-
-// or
-// import { LinearClient } from 'bybit-api';
-
-const client = new LinearClient();
-
-(async () => {
- try {
- // console.log('getSymbols: ', await client.getSymbols());
- // console.log('getOrderBook: ', await client.getOrderBook(symbol));
- console.log(
- 'getKline: ',
- await client.getKline({
- symbol: 'ETHUSDT',
- interval: 'D',
- from: 1,
- }),
- );
- } catch (e) {
- console.error('request failed: ', e);
- }
-})();
diff --git a/examples/deprecated/rest-raw-v3sign.ts b/examples/deprecated/rest-raw-v3sign.ts
deleted file mode 100644
index 35308a3..0000000
--- a/examples/deprecated/rest-raw-v3sign.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { ContractClient } from '../../src/index';
-
-// or
-// import { ContractClient } from 'bybit-api';
-
-const key = process.env.API_KEY_COM;
-const secret = process.env.API_SECRET_COM;
-
-const client = new ContractClient({
- key,
- secret,
- strict_param_validation: true,
-});
-
-(async () => {
- try {
- /**
- * You can make raw HTTP requests without the per-endpoint abstraction.
- *
- * The REST ContractClient uses bybit's v3 signature mechanism,
- * so it can be used for raw calls to any v3-supporting endpoints (incl the V5 APIs).
- * e.g. if an endpoint is missing and you desperately need it (but please raise an issue or PR if you're missing an endpoint)
- */
- const rawCall = await client.getPrivate('/v5/order/realtime', {
- category: 'linear',
- symbol: 'BTCUSDT',
- });
-
- console.log('rawCall:', rawCall);
- } catch (e) {
- console.error('request failed: ', e);
- }
-})();
diff --git a/examples/deprecated/rest-spot-public.ts b/examples/deprecated/rest-spot-public.ts
deleted file mode 100644
index 0574365..0000000
--- a/examples/deprecated/rest-spot-public.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { SpotClientV3 } from '../../src/index';
-
-// or
-// import { SpotClientV3 } from 'bybit-api';
-
-const client = new SpotClientV3();
-
-const symbol = 'BTCUSDT';
-
-(async () => {
- try {
- // console.log('getSymbols: ', await client.getSymbols());
- // console.log('getOrderBook: ', await client.getOrderBook(symbol));
- console.log('getOrderBook: ', await client.getOrderBook(symbol));
- } catch (e) {
- console.error('request failed: ', e);
- }
-})();
diff --git a/examples/deprecated/rest-spot-tpsl.ts b/examples/deprecated/rest-spot-tpsl.ts
deleted file mode 100644
index d296d6b..0000000
--- a/examples/deprecated/rest-spot-tpsl.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { SpotClientV3 } from '../../src/index';
-
-// or
-// import { SpotClientV3 } from 'bybit-api';
-
-const symbol = 'BTCUSDT';
-const key = process.env.API_KEY_COM;
-const secret = process.env.API_SECRET_COM;
-
-const client = new SpotClientV3({
- key,
- secret,
- strict_param_validation: true,
-});
-
-(async () => {
- try {
- const orderId = undefined;
- const ordersPerPage = undefined;
-
- const orders = await client.getOpenOrders(symbol);
- console.log('orders 1:', orders);
-
- const normalOrders = await client.getOpenOrders(
- symbol,
- orderId,
- ordersPerPage,
- 0,
- );
- console.log('normal orders:', normalOrders);
-
- const tpSlOrders = await client.getOpenOrders(
- symbol,
- orderId,
- ordersPerPage,
- 1,
- );
- console.log('tpSlOrders:', tpSlOrders);
- } catch (e) {
- console.error('request failed: ', e);
- }
-})();
diff --git a/examples/deprecated/rest-unified-margin-private-cursor.ts b/examples/deprecated/rest-unified-margin-private-cursor.ts
deleted file mode 100644
index 0bde7cb..0000000
--- a/examples/deprecated/rest-unified-margin-private-cursor.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { UnifiedMarginClient } from '../../src/index';
-
-// or
-// import { UnifiedMarginClient } from 'bybit-api';
-
-const key = process.env.API_KEY_COM;
-const secret = process.env.API_SECRET_COM;
-
-const client = new UnifiedMarginClient({
- key,
- secret,
- strict_param_validation: true,
-});
-
-(async () => {
- try {
- // page 1
- const historicOrders1 = await client.getHistoricOrders({
- category: 'linear',
- limit: 1,
- // cursor,
- });
- console.log('page 1:', JSON.stringify(historicOrders1, null, 2));
-
- // page 2
- const historicOrders2 = await client.getHistoricOrders({
- category: 'linear',
- limit: 1,
- cursor: historicOrders1.result.nextPageCursor,
- });
- console.log('page 2:', JSON.stringify(historicOrders2, null, 2));
-
- const historicOrdersBoth = await client.getHistoricOrders({
- category: 'linear',
- limit: 2,
- });
- console.log(
- 'both to compare:',
- JSON.stringify(historicOrdersBoth, null, 2),
- );
- } catch (e) {
- console.error('request failed: ', e);
- }
-})();
diff --git a/examples/deprecated/rest-unified-margin-public-cursor.ts b/examples/deprecated/rest-unified-margin-public-cursor.ts
deleted file mode 100644
index 224ed1a..0000000
--- a/examples/deprecated/rest-unified-margin-public-cursor.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { UnifiedMarginClient } from '../../src/index';
-
-// or
-// import { UnifiedMarginClient } from 'bybit-api';
-
-const client = new UnifiedMarginClient({
- strict_param_validation: true,
-});
-
-(async () => {
- try {
- // page 1
- const historicOrders1 = await client.getInstrumentInfo({
- category: 'linear',
- limit: '2',
- });
- console.log('page 1:', JSON.stringify(historicOrders1, null, 2));
-
- // page 2
- const historicOrders2 = await client.getInstrumentInfo({
- category: 'linear',
- limit: '2',
- cursor: historicOrders1.result.nextPageCursor,
- });
- console.log('page 2:', JSON.stringify(historicOrders2, null, 2));
-
- // page 1 & 2 in one request (for comparison)
- const historicOrdersBoth = await client.getInstrumentInfo({
- category: 'linear',
- limit: '4',
- });
- console.log('both pages', JSON.stringify(historicOrdersBoth, null, 2));
- } catch (e) {
- console.error('request failed: ', e);
- }
-})();
diff --git a/examples/deprecated/ws-private-copytrading-v3.ts b/examples/deprecated/ws-private-copytrading-v3.ts
deleted file mode 100644
index 17e445d..0000000
--- a/examples/deprecated/ws-private-copytrading-v3.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-/* eslint-disable no-unused-vars */
-/* eslint-disable @typescript-eslint/no-unused-vars */
-/* eslint-disable @typescript-eslint/no-empty-function */
-import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from '../../src';
-
-// or
-// import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from 'bybit-api';
-
-const logger = {
- ...DefaultLogger,
- silly: (...params) => {
- // console.log(params);
- },
-};
-
-const key = process.env.API_KEY;
-const secret = process.env.API_SECRET;
-
-/**
- * Copy trading api docs say that private topics should connect to: wss://stream.bybit.com/realtime_private
- *
- * Within this SDK, only the market `linear` uses this endpoint for private topics:
- */
-const market = 'linear';
-
-const wsClient = new WebsocketClient(
- {
- key: key,
- secret: secret,
- market: market,
- },
- logger,
-);
-
-wsClient.on('update', (data) => {
- console.log('raw message received ', JSON.stringify(data, null, 2));
-});
-
-wsClient.on('open', (data) => {
- console.log('connection opened open:', data.wsKey);
-});
-wsClient.on('response', (data) => {
- console.log('ws response: ', JSON.stringify(data, null, 2));
-});
-wsClient.on('reconnect', ({ wsKey }) => {
- console.log('ws automatically reconnecting.... ', wsKey);
-});
-wsClient.on('reconnected', (data) => {
- console.log('ws has reconnected ', data?.wsKey);
-});
-wsClient.on('error', (data) => {
- console.error('ws exception: ', data);
-});
-
-// copy trading topics from api docs: https://bybit-exchange.github.io/docs/copy-trade/ws-private/position
-wsClient.subscribe([
- 'copyTradePosition',
- 'copyTradeOrder',
- 'copyTradeExecution',
- 'copyTradeWallet',
-]);
diff --git a/examples/deprecated/ws-private.ts b/examples/deprecated/ws-private.ts
deleted file mode 100644
index 2ee6faf..0000000
--- a/examples/deprecated/ws-private.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-/* eslint-disable no-unused-vars */
-/* eslint-disable @typescript-eslint/no-unused-vars */
-/* eslint-disable @typescript-eslint/no-empty-function */
-import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from '../../src';
-
-// or
-// import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from 'bybit-api';
-
-const logger = {
- ...DefaultLogger,
- silly: () => {},
-};
-
-const key = process.env.API_KEY;
-const secret = process.env.API_SECRET;
-
-// USDT Perps:
-// const market = 'linear';
-// Inverse Perp
-// const market = 'inverse';
-// const market = 'spotv3';
-// Contract v3
-const market = 'contractUSDT';
-// const market = 'contractInverse';
-
-const wsClient = new WebsocketClient(
- {
- key: key,
- secret: secret,
- market: market,
- // testnet: true,
- restOptions: {
- // enable_time_sync: true,
- },
- },
- logger,
-);
-
-wsClient.on('update', (data) => {
- console.log('raw message received ', JSON.stringify(data, null, 2));
-});
-
-wsClient.on('open', (data) => {
- console.log('connection opened open:', data.wsKey);
-});
-wsClient.on('response', (data) => {
- console.log('ws response: ', JSON.stringify(data, null, 2));
-});
-wsClient.on('reconnect', ({ wsKey }) => {
- console.log('ws automatically reconnecting.... ', wsKey);
-});
-wsClient.on('reconnected', (data) => {
- console.log('ws has reconnected ', data?.wsKey);
-});
-wsClient.on('error', (data) => {
- console.error('ws exception: ', data);
-});
-
-// subscribe to private endpoints
-// check the api docs in your api category to see the available topics
-// wsClient.subscribe(['position', 'execution', 'order', 'wallet']);
-
-// Contract v3
-wsClient.subscribe([
- 'user.position.contractAccount',
- 'user.execution.contractAccount',
- 'user.order.contractAccount',
- 'user.wallet.contractAccount',
-]);
diff --git a/examples/deprecated/ws-public.ts b/examples/deprecated/ws-public.ts
deleted file mode 100644
index e1cdb0a..0000000
--- a/examples/deprecated/ws-public.ts
+++ /dev/null
@@ -1,172 +0,0 @@
-import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from '../../src';
-
-// or
-// import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from 'bybit-api';
-
-const logger = {
- ...DefaultLogger,
- silly: (...params) => console.log('silly', ...params),
-};
-
-const wsClient = new WebsocketClient(
- {
- // key: key,
- // secret: secret,
- // market: 'linear',
- // market: 'inverse',
- // market: 'spot',
- // market: 'spotv3',
- // market: 'usdcOption',
- // market: 'usdcPerp',
- // market: 'unifiedPerp',
- // market: 'unifiedOption',
- market: 'contractUSDT',
- },
- logger,
-);
-
-wsClient.on('update', (data) => {
- console.log('raw message received ', JSON.stringify(data));
- // console.log('raw message received ', JSON.stringify(data, null, 2));
-});
-
-wsClient.on('open', (data) => {
- console.log('connection opened open:', data.wsKey);
-
- // if (data.wsKey === WS_KEY_MAP.spotPublic) {
- // // Spot public, but not recommended - use spotv3 client instead
- // // The old spot websockets dont automatically resubscribe if they disconnect
- // // wsClient.subscribePublicSpotTrades('BTCUSDT');
- // // wsClient.subscribePublicSpotTradingPair('BTCUSDT');
- // // wsClient.subscribePublicSpotV1Kline('BTCUSDT', '1m');
- // // wsClient.subscribePublicSpotOrderbook('BTCUSDT', 'full');
- // }
-});
-wsClient.on('response', (data) => {
- console.log('log response: ', JSON.stringify(data, null, 2));
-});
-wsClient.on('reconnect', ({ wsKey }) => {
- console.log('ws automatically reconnecting.... ', wsKey);
-});
-wsClient.on('reconnected', (data) => {
- console.log('ws has reconnected ', data?.wsKey);
-});
-// wsClient.on('error', (data) => {
-// console.error('ws exception: ', data);
-// });
-
-// Inverse
-// wsClient.subscribe('trade');
-
-// Linear
-// wsClient.subscribe('trade.BTCUSDT');
-
-// Spot V3
-// wsClient.subscribe('trade.BTCUSDT');
-// Or an array of topics
-// wsClient.subscribe([
-// 'orderbook.40.BTCUSDT',
-// 'orderbook.40.BTCUSDC',
-// 'orderbook.40.USDCUSDT',
-// 'orderbook.40.BTCDAI',
-// 'orderbook.40.DAIUSDT',
-// 'orderbook.40.ETHUSDT',
-// 'orderbook.40.ETHUSDC',
-// 'orderbook.40.ETHDAI',
-// 'orderbook.40.XRPUSDT',
-// 'orderbook.40.XRPUSDC',
-// 'orderbook.40.EOSUSDT',
-// 'orderbook.40.EOSUSDC',
-// 'orderbook.40.DOTUSDT',
-// 'orderbook.40.DOTUSDC',
-// 'orderbook.40.XLMUSDT',
-// 'orderbook.40.XLMUSDC',
-// 'orderbook.40.LTCUSDT',
-// 'orderbook.40.LTCUSDC',
-// 'orderbook.40.DOGEUSDT',
-// 'orderbook.40.DOGEUSDC',
-// 'orderbook.40.BITUSDT',
-// 'orderbook.40.BITUSDC',
-// 'orderbook.40.BITDAI',
-// 'orderbook.40.CHZUSDT',
-// 'orderbook.40.CHZUSDC',
-// 'orderbook.40.MANAUSDT',
-// 'orderbook.40.MANAUSDC',
-// 'orderbook.40.LINKUSDT',
-// 'orderbook.40.LINKUSDC',
-// 'orderbook.40.ICPUSDT',
-// 'orderbook.40.ICPUSDC',
-// 'orderbook.40.ADAUSDT',
-// 'orderbook.40.ADAUSDC',
-// 'orderbook.40.SOLUSDC',
-// 'orderbook.40.SOLUSDT',
-// 'orderbook.40.MATICUSDC',
-// 'orderbook.40.MATICUSDT',
-// 'orderbook.40.SANDUSDC',
-// 'orderbook.40.SANDUSDT',
-// 'orderbook.40.LUNCUSDC',
-// 'orderbook.40.LUNCUSDT',
-// 'orderbook.40.SLGUSDC',
-// 'orderbook.40.SLGUSDT',
-// 'orderbook.40.AVAXUSDC',
-// 'orderbook.40.AVAXUSDT',
-// 'orderbook.40.OPUSDC',
-// 'orderbook.40.OPUSDT',
-// 'orderbook.40.OKSEUSDC',
-// 'orderbook.40.OKSEUSDT',
-// 'orderbook.40.APEXUSDC',
-// 'orderbook.40.APEXUSDT',
-// 'orderbook.40.TRXUSDC',
-// 'orderbook.40.TRXUSDT',
-// 'orderbook.40.GMTUSDC',
-// 'orderbook.40.GMTUSDT',
-// 'orderbook.40.SHIBUSDC',
-// 'orderbook.40.SHIBUSDT',
-// 'orderbook.40.LDOUSDC',
-// 'orderbook.40.LDOUSDT',
-// 'orderbook.40.APEUSDC',
-// 'orderbook.40.APEUSDT',
-// 'orderbook.40.FILUSDC',
-// 'orderbook.40.FILUSDT',
-// ]);
-
-// usdc options
-// wsClient.subscribe([
-// `recenttrades.BTC`,
-// `recenttrades.ETH`,
-// `recenttrades.SOL`,
-// ]);
-
-// usdc perps (note: the syntax is different for the unified perp market)
-// (market: 'usdcPerp')
-// wsClient.subscribe('trade.BTCUSDC');
-// wsClient.subscribe('instrument_info.100ms.BTCPERP');
-
-// unified perps
-// wsClient.subscribe('publicTrade.BTCUSDT');
-// wsClient.subscribe('publicTrade.BTCPERP');
-
-// For spot v1 (the old, deprecated client), request public connection first then send required topics on 'open'
-// Not necessary for spot v3
-// wsClient.connectPublic();
-
-// To unsubscribe from topics (after a 5 second delay, in this example):
-// setTimeout(() => {
-// console.log('unsubscribing');
-// wsClient.unsubscribe('trade.BTCUSDT');
-// }, 5 * 1000);
-
-// Topics are tracked per websocket type
-// Get a list of subscribed topics (e.g. for public v3 spot topics) (after a 5 second delay)
-setTimeout(() => {
- const publicSpotTopics = wsClient
- .getWsStore()
- .getTopics(WS_KEY_MAP.spotV3Public);
-
- console.log('public spot topics: ', publicSpotTopics);
-
- const privateSpotTopics = wsClient
- .getWsStore()
- .getTopics(WS_KEY_MAP.spotV3Private);
- console.log('private spot topics: ', privateSpotTopics);
-}, 5 * 1000);
diff --git a/examples/fasterHmacSign.ts b/examples/fasterHmacSign.ts
new file mode 100644
index 0000000..99b3f4f
--- /dev/null
+++ b/examples/fasterHmacSign.ts
@@ -0,0 +1,183 @@
+import { createHmac } from 'crypto';
+import { DefaultLogger, RestClientV5, WebsocketClient } from '../src/index';
+
+// or
+// import { createHmac } from 'crypto';
+// import { DefaultLogger, RestClientV5, WebsocketClient } from 'bybit-api';
+
+/**
+ * Injecting a custom signMessage function.
+ *
+ * As of version 4.0.0 of the bybit-api Node.js/TypeScript/JavaScript
+ * SDK for Bybit, the SDK uses the Web Crypto API for signing requests.
+ * While it is compatible with Node and Browser environments, it is
+ * slightly slower than using Node's native crypto module (only
+ * available in backend Node environments).
+ *
+ * For latency sensitive users, you can inject the previous node crypto sign
+ * method (or your own even faster-implementation), if this change affects you.
+ *
+ * This example demonstrates how to inject a custom sign function, to achieve
+ * the same peformance as seen before the Web Crypto API was introduced.
+ *
+ * For context on standard usage, the "signMessage" function is used:
+ * - During every single API call
+ * - After opening a new private WebSocket connection
+ *
+ */
+
+const key = process.env.API_KEY_COM;
+const secret = process.env.API_SECRET_COM;
+
+const restClient = new RestClientV5({
+ key: key,
+ secret: secret,
+ parseAPIRateLimits: true,
+ /**
+ * Set this to true to enable demo trading:
+ */
+ demoTrading: true,
+ /**
+ * Overkill in almost every case, but if you need any optimisation available,
+ * you can inject a faster sign mechanism such as node's native createHmac:
+ */
+ customSignMessageFn: async (message, secret) => {
+ return createHmac('sha256', secret).update(message).digest('hex');
+ },
+});
+
+// Optional, uncomment the "trace" override to log a lot more info about what the WS client is doing
+const customLogger = {
+ ...DefaultLogger,
+ // trace: (...params) => console.log('trace', ...params),
+};
+
+const wsClient = new WebsocketClient(
+ {
+ key: key,
+ secret: secret,
+ /**
+ * Set this to true to enable demo trading for the private account data WS
+ * Topics: order,execution,position,wallet,greeks
+ */
+ demoTrading: true,
+ /**
+ * Overkill in almost every case, but if you need any optimisation available,
+ * you can inject a faster sign mechanism such as node's native createHmac:
+ */
+ customSignMessageFn: async (message, secret) => {
+ return createHmac('sha256', secret).update(message).digest('hex');
+ },
+ },
+ customLogger,
+);
+
+function setWsClientEventListeners(
+ websocketClient: WebsocketClient,
+ accountRef: string,
+): Promise {
+ return new Promise((resolve) => {
+ websocketClient.on('update', (data) => {
+ console.log(new Date(), accountRef, 'data ', JSON.stringify(data));
+ // console.log('raw message received ', JSON.stringify(data, null, 2));
+ });
+
+ websocketClient.on('open', (data) => {
+ console.log(
+ new Date(),
+ accountRef,
+ 'connection opened open:',
+ data.wsKey,
+ );
+ });
+ websocketClient.on('response', (data) => {
+ console.log(
+ new Date(),
+ accountRef,
+ 'log response: ',
+ JSON.stringify(data, null, 2),
+ );
+
+ if (typeof data.req_id === 'string') {
+ const topics = data.req_id.split(',');
+ if (topics.length) {
+ console.log(new Date(), accountRef, 'Subscribed to topics: ', topics);
+ return resolve();
+ }
+ }
+ });
+ websocketClient.on('reconnect', ({ wsKey }) => {
+ console.log(
+ new Date(),
+ accountRef,
+ 'ws automatically reconnecting.... ',
+ wsKey,
+ );
+ });
+ websocketClient.on('reconnected', (data) => {
+ console.log(new Date(), accountRef, 'ws has reconnected ', data?.wsKey);
+ });
+ websocketClient.on('exception', (data) => {
+ console.error(new Date(), accountRef, 'ws exception: ', data);
+ });
+ });
+}
+
+(async () => {
+ try {
+ const onSubscribed = setWsClientEventListeners(wsClient, 'demoAcc');
+
+ wsClient.subscribeV5(['position', 'execution', 'wallet'], 'linear');
+
+ // Simple promise to ensure we're subscribed before trying anything else
+ await onSubscribed;
+
+ // Start trading
+ const balResponse1 = await restClient.getWalletBalance({
+ accountType: 'UNIFIED',
+ });
+ console.log('balResponse1: ', JSON.stringify(balResponse1, null, 2));
+
+ const demoFunds = await restClient.requestDemoTradingFunds();
+ console.log('requested demo funds: ', demoFunds);
+
+ const balResponse2 = await restClient.getWalletBalance({
+ accountType: 'UNIFIED',
+ });
+ console.log('balResponse2: ', JSON.stringify(balResponse2, null, 2));
+
+ /** Simple examples for private REST API calls with bybit's V5 REST APIs */
+ const response = await restClient.getPositionInfo({
+ category: 'linear',
+ symbol: 'BTCUSDT',
+ });
+
+ console.log('response:', response);
+
+ // Trade USDT linear perps
+ const buyOrderResult = await restClient.submitOrder({
+ category: 'linear',
+ symbol: 'BTCUSDT',
+ orderType: 'Market',
+ qty: '1',
+ side: 'Buy',
+ });
+ console.log('buyOrderResult:', buyOrderResult);
+
+ const sellOrderResult = await restClient.submitOrder({
+ category: 'linear',
+ symbol: 'BTCUSDT',
+ orderType: 'Market',
+ qty: '1',
+ side: 'Sell',
+ });
+ console.log('sellOrderResult:', sellOrderResult);
+
+ const balResponse3 = await restClient.getWalletBalance({
+ accountType: 'UNIFIED',
+ });
+ console.log('balResponse2: ', JSON.stringify(balResponse3, null, 2));
+ } catch (e) {
+ console.error('request failed: ', e);
+ }
+})();
diff --git a/examples/ws-api-events.ts b/examples/ws-api-events.ts
new file mode 100644
index 0000000..ce47005
--- /dev/null
+++ b/examples/ws-api-events.ts
@@ -0,0 +1,152 @@
+import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from '../src';
+
+// or
+// import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from 'bybit-api';
+
+const logger = {
+ ...DefaultLogger,
+ // For a more detailed view of the WebsocketClient, enable the `trace` level by uncommenting the below line:
+ // trace: (...params) => console.log('trace', ...params),
+};
+
+const key = process.env.API_KEY;
+const secret = process.env.API_SECRET;
+
+const wsClient = new WebsocketClient(
+ {
+ key: key,
+ secret: secret,
+ // testnet: true, // Whether to use the testnet environment: https://testnet.bybit.com/app/user/api-management
+ // demoTrading: false, // note: As of Jan 2025, demo trading does NOT support the WS API
+ },
+ logger, // Optional: inject a custom logger
+);
+
+/**
+ * General event handlers for monitoring the WebsocketClient
+ */
+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 function main() {
+ /**
+ *
+ * This SDK's WebSocket API integration is event-driven at its core. You can treat the sentWSAPIRquest(...) method as
+ * a fire-and-forget method, to submit commands (create/amend/cancel order) via a WebSocket Connection.
+ *
+ * Replies to commands will show in the `response` event from the WebsocketClient's EventEmitter. Exceptions, however,
+ * will show in the `error` event from the WebsocketClient's EventEmitter.
+ *
+ * - Fire-and-forget a command.
+ * - Handle command results in the `response` event handler asynchronously as desired.
+ * - Handle any exceptions in a catch block.
+ *
+ * This is a more "raw" workflow in how WebSockets behave. For a more convenient & REST-like approach, using the
+ * promise-driven interface is recommended. See the `ws-api-promises.ts` example for a demonstration you can compare.
+ *
+ * Note: even without using promises, you should still tie on a .catch handler to each sendWSAPIRequest call, to prevent
+ * any unnecessary "unhandled promise rejection" exceptions.
+ *
+ */
+
+ // To make it easier to watch, wait a few seconds before sending the amend order
+ const AMEND_AFTER_SECONDS = 3;
+
+ // Then wait a few more before sending the cancel order
+ const CANCEL_AFTER_SECONDS = 5;
+
+ // Exceptions including rejected commands will show here (as well as the catch handler used below)
+ wsClient.on('exception', (data) => {
+ console.error('ws exception: ', data);
+ });
+
+ // Replies to commands will show here
+ wsClient.on('response', (data) => {
+ console.log('received reply to command: ', JSON.stringify(data, null, 2));
+ });
+
+ /**
+ *
+ * If you haven't connected yet, the WebsocketClient will automatically connect and authenticate you as soon as you send
+ * your first command. That connection will then be reused for every command you send, unless the connection drops - then
+ * it will automatically be replaced with a healthy connection.
+ *
+ * This "not connected yet" scenario can add an initial delay to your first command. If you want to prepare a connection
+ * in advance, you can ask the WebsocketClient to prepare it before you start submitting commands. This is optional.
+ *
+ * Repeated note: even without using promises, you should still tie on a .catch handler to each sendWSAPIRequest call, to prevent
+ * any unnecessary "unhandled promise rejection" exceptions.
+ *
+ */
+
+ // Optional, see above. Can be used to prepare a connection before sending commands
+ await wsClient.connectWSAPI();
+
+ console.log('Step 1: Create an order');
+
+ // Fire and forget the create.order command
+ // Even without using promises, you should still "catch" exceptions (although no need to await anything you send)
+ wsClient
+ .sendWSAPIRequest(WS_KEY_MAP.v5PrivateTrade, 'order.create', {
+ symbol: 'BTCUSDT',
+ side: 'Buy',
+ orderType: 'Limit',
+ price: '50000',
+ qty: '1',
+ category: 'linear',
+ })
+ .catch((e) => console.error('Step 1: Order submit exception: ', e));
+
+ console.log('Step 1: Create order sent...');
+
+ //
+ setTimeout(() => {
+ console.log('Step 2: Amend an order');
+
+ // Fire and forget the order.amend command
+ // For simplicity, the orderId is hardcoded here (and will probably not work)
+ wsClient
+ .sendWSAPIRequest(WS_KEY_MAP.v5PrivateTrade, 'order.amend', {
+ symbol: 'BTCUSDT',
+ category: 'linear',
+ orderId: '1234567',
+ price: '55000',
+ })
+ .catch((e) => console.error('Step 2: Amend order exception: ', e));
+
+ console.log('Step 2: Amend order sent...');
+ }, AMEND_AFTER_SECONDS * 1000);
+
+ //
+ setTimeout(() => {
+ console.log('Step 3: Cancel an order');
+
+ // Fire and forget the order.cancel command
+ // For simplicity, the orderId is hardcoded here (and will probably not work)
+ wsClient
+ .sendWSAPIRequest(WS_KEY_MAP.v5PrivateTrade, 'order.cancel', {
+ category: 'linear',
+ symbol: 'BTCUSDT',
+ orderId: '1234567',
+ })
+ .catch((e) => console.error('Step 3: Cancel order exception: ', e));
+
+ console.log('Step 3: Cancel order sent...');
+ }, CANCEL_AFTER_SECONDS * 1000);
+}
+
+// Start executing the example workflow
+main();
diff --git a/examples/ws-api-promises.ts b/examples/ws-api-promises.ts
new file mode 100644
index 0000000..4ccf41e
--- /dev/null
+++ b/examples/ws-api-promises.ts
@@ -0,0 +1,176 @@
+import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from '../src';
+
+// or
+// import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from 'bybit-api';
+
+const logger = {
+ ...DefaultLogger,
+ // For a more detailed view of the WebsocketClient, enable the `trace` level by uncommenting the below line:
+ // trace: (...params) => console.log('trace', ...params),
+};
+
+const key = process.env.API_KEY;
+const secret = process.env.API_SECRET;
+
+const wsClient = new WebsocketClient(
+ {
+ key: key,
+ secret: secret,
+ // testnet: true, // Whether to use the testnet environment: https://testnet.bybit.com/app/user/api-management
+ // demoTrading: false, // note: As of Jan 2025, demo trading does NOT support the WS API
+ },
+ logger, // Optional: inject a custom logger
+);
+
+/**
+ * General event handlers for monitoring the WebsocketClient
+ */
+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);
+});
+wsClient.on('exception', (data) => {
+ console.error('ws exception: ', data);
+});
+
+async function main() {
+ /**
+ *
+ * This SDK's WebSocket API integration can connect WS API responses to the request that caused them. Each call
+ * to the `sendWSAPIRequest(...)` method returns a promise.
+ *
+ * This promise will resolve when the matching response is detected, and reject if an exception for that request
+ * is detected. This allows using Bybit's Websocket API in the same way that a REST API normally works.
+ *
+ * Send a command and immediately await the result. Handle any exceptions in a catch block.
+ *
+ * TypeScript users can benefit from smart type flowing for increased type safety & convenience:
+ * - Request parameters are fully typed, depending on the operation in the second parameter to the call. E.g.
+ * the `order.create` operation will automatically require the params to match the `OrderParamsV5` interface.
+ *
+ * - Response parameters are fully typed, depending on the operation in the second parameter. E.g the `order.create`
+ * operation will automatically map the returned value to `WSAPIResponse`.
+ *
+ */
+
+ // To make it easier to watch, wait a few seconds before sending the amend order
+ const AMEND_AFTER_SECONDS = 5;
+
+ // Then wait a few more before sending the cancel order
+ const CANCEL_AFTER_SECONDS = 10;
+
+ /**
+ *
+ * If you haven't connected yet, the WebsocketClient will automatically connect and authenticate you as soon as you send
+ * your first command. That connection will then be reused for every command you send, unless the connection drops - then
+ * it will automatically be replaced with a healthy connection.
+ *
+ * This "not connected yet" scenario can add an initial delay to your first command. If you want to prepare a connection
+ * in advance, you can ask the WebsocketClient to prepare it before you start submitting commands. This is optional.
+ *
+ */
+
+ // Optional, see above. Can be used to prepare a connection before sending commands
+ await wsClient.connectWSAPI();
+
+ /**
+ * Create a new order
+ */
+
+ let orderId: string | undefined;
+
+ try {
+ console.log('Step 1: Create an order');
+
+ // The type for `wsAPISubmitOrderResult` is automatically resolved to `WSAPIResponse`
+ const wsAPISubmitOrderResult = await wsClient.sendWSAPIRequest(
+ WS_KEY_MAP.v5PrivateTrade,
+ 'order.create',
+ {
+ symbol: 'BTCUSDT',
+ side: 'Buy',
+ orderType: 'Limit',
+ price: '50000',
+ qty: '1',
+ category: 'linear',
+ },
+ );
+
+ // Save the orderId for the next call
+ orderId = wsAPISubmitOrderResult.data.orderId;
+
+ console.log(
+ `Step 1: Order result (order ID: "${orderId}"): `,
+ wsAPISubmitOrderResult,
+ );
+ } catch (e) {
+ console.error('Step 1: Order submit exception: ', e);
+ return;
+ }
+
+ setTimeout(async () => {
+ try {
+ console.log('Step 2: Amend an order');
+
+ // The type for `wsAPIAmendOrderResult` is automatically resolved to `WSAPIResponse`
+ const wsAPIAmendOrderResult = await wsClient.sendWSAPIRequest(
+ WS_KEY_MAP.v5PrivateTrade,
+ 'order.amend',
+ {
+ symbol: 'BTCUSDT',
+ category: 'linear',
+ orderId,
+ price: '55000',
+ },
+ );
+
+ // Save the orderId for the next call
+ orderId = wsAPIAmendOrderResult.data.orderId;
+
+ console.log(
+ `Step 2: Amend result (order ID: "${orderId}"): `,
+ wsAPIAmendOrderResult,
+ );
+ } catch (e) {
+ console.error('Step 2: Amend order exception: ', e);
+ return;
+ }
+ }, AMEND_AFTER_SECONDS * 1000);
+
+ setTimeout(async () => {
+ try {
+ console.log('Step 3: Cancel an order');
+
+ // The type for `wsAPICancelOrderResult` is automatically resolved to `WSAPIResponse`
+ const wsAPICancelOrderResult = await wsClient.sendWSAPIRequest(
+ WS_KEY_MAP.v5PrivateTrade,
+ 'order.cancel',
+ {
+ category: 'linear',
+ symbol: 'BTCUSDT',
+ orderId,
+ },
+ );
+
+ console.log('Step 3: Cancel result:', wsAPICancelOrderResult);
+ } catch (e) {
+ console.error('Step 3: Cancel order exception: ', e);
+ }
+
+ process.exit(-1);
+ }, CANCEL_AFTER_SECONDS * 1000);
+}
+
+// Start executing the example workflow
+main();
diff --git a/examples/ws-private-v5.ts b/examples/ws-private-v5.ts
index 95f224b..f7d91e6 100644
--- a/examples/ws-private-v5.ts
+++ b/examples/ws-private-v5.ts
@@ -4,10 +4,10 @@ import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from '../src';
// or
// import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from 'bybit-api';
-// Create & inject a custom logger to disable the silly logging level (empty function)
+// Create & inject a custom logger to enable the trace logging level (empty function)
const logger = {
...DefaultLogger,
- silly: () => {},
+ // trace: (...params) => console.log('trace', ...params),
};
const key = process.env.API_KEY;
@@ -26,10 +26,10 @@ const wsClient = new WebsocketClient(
{
key: key,
secret: secret,
- market: 'v5',
- testnet: true,
+ // testnet: false,
+ // demoTrading: false, // set testnet to false, if you plan on using demo trading
},
- logger
+ logger,
);
wsClient.on('update', (data) => {
@@ -49,7 +49,7 @@ wsClient.on('reconnect', ({ wsKey }) => {
wsClient.on('reconnected', (data) => {
console.log('ws has reconnected ', data?.wsKey);
});
-// wsClient.on('error', (data) => {
+// wsClient.on('exception', (data) => {
// console.error('ws exception: ', data);
// });
diff --git a/examples/ws-public-allLiquidations.ts b/examples/ws-public-allLiquidations.ts
new file mode 100644
index 0000000..98983ed
--- /dev/null
+++ b/examples/ws-public-allLiquidations.ts
@@ -0,0 +1,92 @@
+import { RestClientV5, WebsocketClient, isWsAllLiquidationEvent } from '../src';
+
+// or
+// import {
+// RestClientV5,
+// WebsocketClient,
+// isWsAllLiquidationEvent,
+// } from 'bybit-api';
+
+function onAllLiquidationEvent(event) {
+ console.log(
+ new Date(),
+ 'allLiquidationEvent',
+ JSON.stringify(event, null, 2),
+ );
+}
+
+const wsClient = new WebsocketClient({});
+
+wsClient.on('update', (data) => {
+ if (isWsAllLiquidationEvent(data)) {
+ return onAllLiquidationEvent(data);
+ }
+
+ console.log('raw unahndled message received ', JSON.stringify(data));
+});
+
+wsClient.on('open', (data) => {
+ console.log('connection opened open:', data.wsKey);
+});
+wsClient.on('response', (data) => {
+ console.log('log response: ', JSON.stringify(data, null, 2));
+});
+wsClient.on('reconnect', ({ wsKey }) => {
+ console.log('ws automatically reconnecting.... ', wsKey);
+});
+wsClient.on('reconnected', (data) => {
+ console.log('ws has reconnected ', data?.wsKey);
+});
+
+wsClient.on('exception', (data) => {
+ console.error('ws exception: ', data);
+});
+
+/**
+ *
+ * If you want to receive data for all available symbols, this websocket topic
+ * requires you to subscribe to each symbol individually.
+ *
+ * This can be easily automated by fetching a list of symbols via the REST client,
+ * generating a list of topics (one per symbol), before simply passing an
+ * array of topics to the websocket client per product group (linear & inverse perps).
+ *
+ */
+async function start() {
+ const restClientV5 = new RestClientV5();
+
+ const allSymbolsV5ResultLinear = await restClientV5.getTickers({
+ category: 'linear',
+ });
+ const allSymbolsV5ResultInverse = await restClientV5.getTickers({
+ category: 'inverse',
+ });
+
+ const allLinearSymbols = allSymbolsV5ResultLinear.result.list.map(
+ (ticker) => ticker.symbol,
+ );
+ const allInverseSymbols = allSymbolsV5ResultInverse.result.list.map(
+ (ticker) => ticker.symbol,
+ );
+
+ console.log('all v5 linear symbols: ', JSON.stringify(allLinearSymbols));
+ console.log('all v5 inverse symbols: ', JSON.stringify(allInverseSymbols));
+
+ const TOPIC_NAME = 'allLiquidation';
+
+ // Make an array of topics ready for submission
+ const allLinearTopics = allLinearSymbols.map(
+ (symbol) => `${TOPIC_NAME}.${symbol}`,
+ );
+ const inverseTopics = allInverseSymbols.map(
+ (symbol) => `${TOPIC_NAME}.${symbol}`,
+ );
+
+ // subscribe to all linear symbols
+ wsClient.subscribeV5(allLinearTopics, 'linear');
+
+ // subscribe to all inverse symbols
+ wsClient.subscribeV5(inverseTopics, 'inverse');
+}
+
+start().catch((e) => console.error('exception in main logic: ', e));
diff --git a/examples/ws-public-v5.ts b/examples/ws-public-v5.ts
index e7b08e4..99d37db 100644
--- a/examples/ws-public-v5.ts
+++ b/examples/ws-public-v5.ts
@@ -5,7 +5,7 @@ import { DefaultLogger, WS_KEY_MAP, WebsocketClient } from '../src';
const logger = {
...DefaultLogger,
- silly: (...params) => console.log('silly', ...params),
+ trace: (...params) => console.log('trace', ...params),
};
/**
@@ -17,13 +17,8 @@ const logger = {
* - Heartbeats/ping/pong/reconnects are all handled automatically.
* If a connection drops, the client will clean it up, respawn a fresh connection and resubscribe for you.
*/
-const wsClient = new WebsocketClient(
- {
- market: 'v5',
- // demoTrading: true,
- },
- logger,
-);
+
+const wsClient = new WebsocketClient({}, logger);
wsClient.on('update', (data) => {
console.log('raw message received ', JSON.stringify(data));
@@ -41,9 +36,10 @@ wsClient.on('reconnect', ({ wsKey }) => {
wsClient.on('reconnected', (data) => {
console.log('ws has reconnected ', data?.wsKey);
});
-// wsClient.on('error', (data) => {
-// console.error('ws exception: ', data);
-// });
+
+wsClient.on('exception', (data) => {
+ console.error('ws exception: ', data);
+});
/**
* For public V5 topics, use the subscribeV5 method and include the API category this topic is for.
@@ -69,6 +65,17 @@ wsClient.on('reconnected', (data) => {
// Option v5
// wsClient.subscribeV5('publicTrade.BTC', 'option');
+const topics = ['kline.5.XRPUSDT', 'kline.5.BTCUSDT', 'kline.5.ETHUSDT'];
+
+// Use the subscribeV5() call for most subscribe calls with v5 websockets
+wsClient.subscribeV5(topics, 'spot');
+
+// Alternatively, you can also use objects in the wsClient.subscribe() call
+// wsClient.subscribe({
+// topic: 'orderook.50.BTCUSDT',
+// category: 'spot',
+// });
+
/**
* For private V5 topics, just call the same subscribeV5() method on the ws client or use the original subscribe() method.
*
@@ -80,10 +87,6 @@ wsClient.on('reconnected', (data) => {
// wsClient.subscribeV5('execution', 'linear');
// wsClient.subscribeV5(['order', 'wallet', 'greek'], 'linear');
-const topics = ['kline.5.XRPUSDT', 'kline.5.BTCUSDT', 'kline.5.ETHUSDT'];
-
-wsClient.subscribeV5(topics, 'spot');
-
// To unsubscribe from topics (after a 5 second delay, in this example):
setTimeout(() => {
console.log('unsubscribing');
diff --git a/jsconfig.json b/jsconfig.json
index 5816065..9253e24 100644
--- a/jsconfig.json
+++ b/jsconfig.json
@@ -1,12 +1,13 @@
{
"compilerOptions": {
- "target": "ES6",
- "module": "commonjs"
+ "target": "ES6",
+ "module": "commonjs"
},
"exclude": [
- "node_modules",
- "**/node_modules/*",
- "coverage",
- "doc"
+ "node_modules",
+ "**/node_modules/*",
+ "coverage",
+ "doc",
+ "examples/ignored/*"
]
-}
\ No newline at end of file
+}
diff --git a/package-lock.json b/package-lock.json
index a0091a9..1f99ff1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,21 +1,21 @@
{
"name": "bybit-api",
- "version": "3.11.0",
+ "version": "4.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "bybit-api",
- "version": "3.11.0",
+ "version": "4.0.0",
"license": "MIT",
"dependencies": {
- "axios": "^1.6.6",
+ "axios": "^1.7.9",
"isomorphic-ws": "^4.0.1",
"ws": "^7.4.0"
},
"devDependencies": {
"@types/jest": "^29.5.11",
- "@types/node": "^20.11.6",
+ "@types/node": "^22.10.7",
"@typescript-eslint/eslint-plugin": "^7.1.0",
"@typescript-eslint/parser": "^7.1.0",
"eslint": "^8.29.0",
@@ -25,7 +25,7 @@
"jest": "^29.7.0",
"ts-jest": "^29.1.2",
"ts-node": "^10.9.2",
- "typescript": "^5.3.3"
+ "typescript": "^5.7.3"
},
"funding": {
"type": "individual",
@@ -1695,12 +1695,13 @@
"optional": true
},
"node_modules/@types/node": {
- "version": "20.11.6",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz",
- "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==",
+ "version": "22.10.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz",
+ "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==",
"devOptional": true,
+ "license": "MIT",
"dependencies": {
- "undici-types": "~5.26.4"
+ "undici-types": "~6.20.0"
}
},
"node_modules/@types/stack-utils": {
@@ -2293,9 +2294,10 @@
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"node_modules/axios": {
- "version": "1.7.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
@@ -6574,10 +6576,11 @@
}
},
"node_modules/typescript": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
- "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"devOptional": true,
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -6587,10 +6590,11 @@
}
},
"node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
- "devOptional": true
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "devOptional": true,
+ "license": "MIT"
},
"node_modules/update-browserslist-db": {
"version": "1.1.0",
@@ -8331,12 +8335,12 @@
"optional": true
},
"@types/node": {
- "version": "20.11.6",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz",
- "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==",
+ "version": "22.10.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz",
+ "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==",
"devOptional": true,
"requires": {
- "undici-types": "~5.26.4"
+ "undici-types": "~6.20.0"
}
},
"@types/stack-utils": {
@@ -8782,9 +8786,9 @@
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"axios": {
- "version": "1.7.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
"requires": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
@@ -11926,15 +11930,15 @@
"dev": true
},
"typescript": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
- "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"devOptional": true
},
"undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
"devOptional": true
},
"update-browserslist-db": {
diff --git a/package.json b/package.json
index 507cc0b..a4af036 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "bybit-api",
- "version": "3.11.0",
+ "version": "4.0.0",
"description": "Complete & robust Node.js SDK for Bybit's REST APIs and WebSockets, with TypeScript & strong end to end tests.",
"main": "lib/index.js",
"types": "lib/index.d.ts",
@@ -20,17 +20,15 @@
"betapublish": "npm publish --tag beta"
},
"author": "Tiago Siebler (https://github.com/tiagosiebler)",
- "contributors": [
- "Stefan Aebischer (https://pixtron.ch)"
- ],
+ "contributors": [],
"dependencies": {
- "axios": "^1.6.6",
+ "axios": "^1.7.9",
"isomorphic-ws": "^4.0.1",
"ws": "^7.4.0"
},
"devDependencies": {
"@types/jest": "^29.5.11",
- "@types/node": "^20.11.6",
+ "@types/node": "^22.10.7",
"@typescript-eslint/eslint-plugin": "^7.1.0",
"@typescript-eslint/parser": "^7.1.0",
"eslint": "^8.29.0",
@@ -40,7 +38,7 @@
"jest": "^29.7.0",
"ts-jest": "^29.1.2",
"ts-node": "^10.9.2",
- "typescript": "^5.3.3"
+ "typescript": "^5.7.3"
},
"optionalDependencies": {
"source-map-loader": "^2.0.0",
diff --git a/src/account-asset-client-v3.ts b/src/account-asset-client-v3.ts
deleted file mode 100644
index 9b1adb1..0000000
--- a/src/account-asset-client-v3.ts
+++ /dev/null
@@ -1,314 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-import {
- APIKeyInfoV3,
- APIResponseV3WithTime,
- APIResponseWithTime,
- AccountCoinBalanceResponseV3,
- AccountCoinBalancesRequestV3,
- AccountCoinBalancesResponseV3,
- AssetInfoRequestV3,
- AssetInfoResponseV3,
- CoinInfoQueryResponseV3,
- CreateSubAPIKeyRequestV3,
- CreateSubAPIKeyResponseV3,
- CreateSubMemberRequestV3,
- CreateSubMemberResponseV3,
- DepositAddressResponseV3,
- DepositRecordQueryRequestV3,
- DepositRecordQueryResponseV3,
- InternalTransferRequestV3,
- ModifyAPIKeyRequestV3,
- QueryDepositAddressRequestV3,
- QueryInternalTransferSResponseV3,
- QueryInternalTransfersRequestV3,
- QuerySubAccountDepositAddressRequestV3,
- SingleAccountCoinBalanceRequestV3,
- SubAccountTransferRequestV3,
- SubAccountTransferResponseV3,
- SubDepositRecordQueryRequestV3,
- SubMemberResponseV3,
- SupportedDepositListRequestV3,
- SupportedDepositListResponseV3,
- TransferCoinListRequestV3,
- UniversalTransferCreateResponse,
- UniversalTransferListRequestV3,
- UniversalTransferListResponseV3,
- UniversalTransferRequestV3,
- WithdrawCreateRequestV3,
- WithdrawRecordQueryRequestV3,
- WithdrawRecordsQueryResponseV3,
-} from './types';
-import { REST_CLIENT_TYPE_ENUM } from './util';
-import BaseRestClient from './util/BaseRestClient';
-
-/**
- * REST API client for Account Asset V3 APIs
- * @deprecated WARNING
- * These endpoints are being switched off gradually and are expected to be completely turned off by the end of 2024.
- * They may stop working at any point before then.
- * Please update your code as soon as possible to use the V5 APIs instead.
- */
-export class AccountAssetClientV3 extends BaseRestClient {
- getClientType() {
- return REST_CLIENT_TYPE_ENUM.v3;
- }
-
- async fetchServerTime(): Promise {
- const res = await this.getServerTime();
- return Number(res.time);
- }
-
- getServerTime(): Promise<
- APIResponseV3WithTime<{ timeSecond: string; timeNano: string }>
- > {
- return this.get('/v3/public/time');
- }
-
- /**
- *
- * Transfer Data Endpoints
- *
- */
-
- createInternalTransfer(
- params: InternalTransferRequestV3,
- ): Promise> {
- return this.postPrivate(
- '/asset/v3/private/transfer/inter-transfer',
- params,
- );
- }
-
- getInternalTransfers(
- params: QueryInternalTransfersRequestV3,
- ): Promise> {
- return this.getPrivate(
- '/asset/v3/private/transfer/inter-transfer/list/query',
- params,
- );
- }
-
- createSubAccountTransfer(params: {
- transferId: string;
- coin: string;
- amount: string;
- subMemberId: number;
- type: 'IN' | 'OUT';
- }): Promise> {
- return this.postPrivate(
- '/asset/v3/private/transfer/sub-member-transfer',
- params,
- );
- }
-
- getSubAccountTransfers(
- params?: SubAccountTransferRequestV3,
- ): Promise> {
- return this.getPrivate(
- '/asset/v3/private/transfer/sub-member-transfer/list/query',
- params,
- );
- }
-
- getSubAccounts(): Promise<
- APIResponseWithTime<{
- subMemberIds: string[];
- transferableSubMemberIds: string[];
- }>
- > {
- return this.getPrivate('/asset/v3/private/transfer/sub-member/list/query');
- }
-
- enableUniversalTransfer(params?: {
- subMemberIds?: string;
- }): Promise> {
- return this.postPrivate(
- '/asset/v3/private/transfer/transfer-sub-member-save',
- params,
- );
- }
-
- createUniversalTransfer(
- params: UniversalTransferRequestV3,
- ): Promise> {
- return this.postPrivate(
- '/asset/v3/private/transfer/universal-transfer',
- params,
- );
- }
-
- getUniversalTransfers(
- params: UniversalTransferListRequestV3,
- ): Promise> {
- return this.getPrivate(
- '/asset/v3/private/transfer/universal-transfer/list/query',
- params,
- );
- }
-
- getTransferableCoinList(
- params: TransferCoinListRequestV3,
- ): Promise> {
- return this.getPrivate(
- '/asset/v3/private/transfer/transfer-coin/list/query',
- params,
- );
- }
-
- getAccountCoinBalance(
- params: SingleAccountCoinBalanceRequestV3,
- ): Promise> {
- return this.getPrivate(
- '/asset/v3/private/transfer/account-coin/balance/query',
- params,
- );
- }
-
- getAccountCoinBalances(
- params: AccountCoinBalancesRequestV3,
- ): Promise> {
- return this.getPrivate(
- '/asset/v3/private/transfer/account-coins/balance/query',
- params,
- );
- }
-
- getAssetInfo(
- params?: AssetInfoRequestV3,
- ): Promise> {
- return this.getPrivate(
- '/asset/v3/private/transfer/asset-info/query',
- params,
- );
- }
-
- /**
- *
- * Wallet & Deposit Endpoints
- *
- */
-
- /** Get Deposit Spec */
- getSupportedDepositList(
- params?: SupportedDepositListRequestV3,
- ): Promise> {
- return this.get(
- '/asset/v3/public/deposit/allowed-deposit-list/query',
- params,
- );
- }
-
- getDepositRecords(
- params?: DepositRecordQueryRequestV3,
- ): Promise> {
- return this.getPrivate('/asset/v3/private/deposit/record/query', params);
- }
-
- getSubDepositRecords(
- params: SubDepositRecordQueryRequestV3,
- ): Promise> {
- return this.getPrivate(
- '/asset/v3/private/deposit/sub-member-record/query',
- params,
- );
- }
-
- getWithdrawRecords(
- params?: WithdrawRecordQueryRequestV3,
- ): Promise> {
- return this.getPrivate('/asset/v3/private/withdraw/record/query', params);
- }
-
- getCoinInformation(
- coin?: string,
- ): Promise> {
- return this.getPrivate('/asset/v3/private/coin-info/query', { coin });
- }
-
- submitWithdrawal(
- params: WithdrawCreateRequestV3,
- ): Promise> {
- return this.postPrivate('/asset/v3/private/withdraw/create', params);
- }
-
- cancelWithdrawal(
- withdrawalId: number,
- ): Promise> {
- return this.postPrivate('/asset/v3/private/withdraw/create', {
- withdrawalId,
- });
- }
-
- getMasterAccountDepositAddress(
- params?: QueryDepositAddressRequestV3,
- ): Promise> {
- return this.getPrivate('/asset/v3/private/deposit/address/query', params);
- }
-
- getSubAccountDepositAddress(
- params: QuerySubAccountDepositAddressRequestV3,
- ): Promise> {
- return this.getPrivate(
- '/asset/v3/private/deposit/sub-member-address/query',
- params,
- );
- }
-
- createSubMember(
- params: CreateSubMemberRequestV3,
- ): Promise> {
- return this.postPrivate('/user/v3/private/create-sub-member', params);
- }
-
- createSubAPIKey(
- params: CreateSubAPIKeyRequestV3,
- ): Promise> {
- return this.postPrivate('/user/v3/private/create-sub-api', params);
- }
-
- /**
- * Get Sub UID List
- */
- getSubMembers(): Promise> {
- return this.getPrivate('/user/v3/private/query-sub-members');
- }
-
- /**
- * Froze Sub UID
- */
- freezeSubMember(
- subuid: number,
- frozenStatus: 0 | 1,
- ): Promise> {
- return this.postPrivate('/user/v3/private/frozen-sub-member', {
- subuid,
- frozen: frozenStatus,
- });
- }
-
- getAPIKeyInformation(): Promise> {
- return this.getPrivate('/user/v3/private/query-api');
- }
-
- modifyMasterAPIKey(
- params: ModifyAPIKeyRequestV3,
- ): Promise> {
- return this.postPrivate('/user/v3/private/update-api', params);
- }
-
- modifySubAPIKey(
- params: ModifyAPIKeyRequestV3,
- ): Promise> {
- return this.postPrivate('/user/v3/private/update-sub-api', params);
- }
-
- /** WARNING: BE CAREFUL! The API key used to call this interface will be invalid immediately. */
- deleteMasterAPIKey(): Promise> {
- return this.postPrivate('/user/v3/private/delete-api');
- }
-
- /** WARNING: BE CAREFUL! The API key used to call this interface will be invalid immediately. */
- deleteSubAPIKey(): Promise> {
- return this.postPrivate('/user/v3/private/delete-sub-api');
- }
-}
diff --git a/src/account-asset-client.ts b/src/account-asset-client.ts
deleted file mode 100644
index cd30af0..0000000
--- a/src/account-asset-client.ts
+++ /dev/null
@@ -1,153 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-import {
- APIResponseWithTime,
- AccountAssetInformationRequest,
- DepositRecordsRequest,
- EnableUniversalTransferRequest,
- InternalTransferRequest,
- SubAccountTransferRequest,
- SupportedDepositListRequest,
- TransferQueryRequest,
- UniversalTransferRequest,
- WithdrawalRecordsRequest,
- WithdrawalRequest,
-} from './types';
-import { REST_CLIENT_TYPE_ENUM } from './util';
-import BaseRestClient from './util/BaseRestClient';
-
-/**
- * REST API client for Account Asset APIs
- *
- * @deprecated WARNING: V1/V2 private endpoints (Rest API & Websocket Stream) for mainnet
- * will be switched off gradually from 30 Oct 2023 UTC, so they are not promised a stability.
- * Please note that you are at your own risk of using old endpoints going forward, and please move to V5 ASAP.
- */
-export class AccountAssetClient extends BaseRestClient {
- getClientType() {
- return REST_CLIENT_TYPE_ENUM.accountAsset;
- }
-
- async fetchServerTime(): Promise {
- const res = await this.getServerTime();
- return Number(res.time_now);
- }
-
- /**
- *
- * Transfer Data Endpoints
- *
- */
-
- createInternalTransfer(
- params: InternalTransferRequest,
- ): Promise> {
- return this.postPrivate('/asset/v1/private/transfer', params);
- }
-
- createSubAccountTransfer(
- params: SubAccountTransferRequest,
- ): Promise> {
- return this.postPrivate('/asset/v1/private/sub-member/transfer', params);
- }
-
- getInternalTransfers(
- params?: TransferQueryRequest,
- ): Promise> {
- return this.getPrivate('/asset/v1/private/transfer/list', params);
- }
-
- getSubAccountTransfers(
- params?: TransferQueryRequest,
- ): Promise> {
- return this.getPrivate(
- '/asset/v1/private/sub-member/transfer/list',
- params,
- );
- }
-
- getSubAccounts(): Promise> {
- return this.getPrivate('/asset/v1/private/sub-member/member-ids');
- }
-
- enableUniversalTransfer(
- params?: EnableUniversalTransferRequest,
- ): Promise> {
- return this.postPrivate('/asset/v1/private/transferable-subs/save', params);
- }
-
- createUniversalTransfer(
- params: UniversalTransferRequest,
- ): Promise> {
- return this.postPrivate('/asset/v1/private/universal/transfer', params);
- }
-
- getUniversalTransfers(
- params?: TransferQueryRequest,
- ): Promise> {
- return this.getPrivate('/asset/v1/private/universal/transfer/list', params);
- }
-
- /**
- *
- * Wallet & Deposit Endpoints
- *
- */
-
- getSupportedDepositList(
- params?: SupportedDepositListRequest,
- ): Promise> {
- return this.get('/asset/v1/public/deposit/allowed-deposit-list', params);
- }
-
- getDepositRecords(
- params?: DepositRecordsRequest,
- ): Promise> {
- return this.getPrivate('/asset/v1/private/deposit/record/query', params);
- }
-
- getWithdrawRecords(
- params?: WithdrawalRecordsRequest,
- ): Promise> {
- return this.getPrivate('/asset/v1/private/withdraw/record/query', params);
- }
-
- getCoinInformation(coin?: string): Promise> {
- return this.getPrivate('/asset/v1/private/coin-info/query', { coin });
- }
-
- getAssetInformation(
- params?: AccountAssetInformationRequest,
- ): Promise> {
- return this.getPrivate('/asset/v1/private/asset-info/query', params);
- }
-
- submitWithdrawal(
- params: WithdrawalRequest,
- ): Promise> {
- return this.postPrivate('/asset/v1/private/withdraw', params);
- }
-
- cancelWithdrawal(withdrawalId: number): Promise> {
- return this.postPrivate('/asset/v1/private/withdraw/cancel', {
- id: withdrawalId,
- });
- }
-
- getDepositAddress(coin: string): Promise> {
- return this.getPrivate('/asset/v1/private/deposit/address', { coin });
- }
-
- /**
- *
- * API Data Endpoints
- *
- */
-
- getServerTime(): Promise {
- return this.get('/v2/public/time');
- }
-
- getApiAnnouncements(): Promise> {
- return this.get('/v2/public/announcement');
- }
-}
diff --git a/src/contract-client.ts b/src/contract-client.ts
deleted file mode 100644
index fb31fbd..0000000
--- a/src/contract-client.ts
+++ /dev/null
@@ -1,364 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-import {
- APIResponseV3,
- APIResponseWithTime,
- ContractActiveOrdersRequest,
- ContractCancelOrderRequest,
- ContractClosedPNLRequest,
- ContractHistoricOrder,
- ContractHistoricOrdersRequest,
- ContractListResult,
- ContractModifyOrderRequest,
- ContractOrderRequest,
- ContractPositionsRequest,
- ContractSetAutoAddMarginRequest,
- ContractSetMarginSwitchRequest,
- ContractSetPositionModeRequest,
- ContractSetTPSLRequest,
- ContractSymbolTicker,
- ContractUserExecutionHistoryRequest,
- ContractWalletFundRecordRequest,
- PaginatedResult,
- UMCandlesRequest,
- UMCategory,
- UMFundingRateHistoryRequest,
- UMInstrumentInfoRequest,
- UMOpenInterestRequest,
- UMOptionDeliveryPriceRequest,
- UMPublicTradesRequest,
-} from './types';
-import { REST_CLIENT_TYPE_ENUM } from './util';
-import BaseRestClient from './util/BaseRestClient';
-
-/**
- * REST API client for Derivatives V3 Contract APIs
- * @deprecated WARNING
- * These endpoints are being switched off gradually and are expected to be completely turned off by the end of 2024.
- * They may stop working at any point before then.
- * Please update your code as soon as possible to use the V5 APIs instead.
- */
-export class ContractClient extends BaseRestClient {
- getClientType() {
- // Follows the same authentication mechanism as other v3 APIs (e.g. USDC)
- return REST_CLIENT_TYPE_ENUM.v3;
- }
-
- async fetchServerTime(): Promise {
- const res = await this.getServerTime();
- return Number(res.time_now);
- }
-
- /**
- *
- * Market Data Endpoints : these seem exactly the same as the unified margin market data endpoints
- *
- */
-
- /** Query order book info. Each side has a depth of 25 orders. */
- getOrderBook(
- symbol: string,
- category?: string,
- limit?: number,
- ): Promise> {
- return this.get('/derivatives/v3/public/order-book/L2', {
- category,
- symbol,
- limit,
- });
- }
-
- /** Get candles/klines */
- getCandles(params: UMCandlesRequest): Promise> {
- return this.get('/derivatives/v3/public/kline', params);
- }
-
- /** Get a symbol price/statistics ticker */
- getSymbolTicker(
- category: UMCategory | '',
- symbol?: string,
- ): Promise>> {
- return this.get('/derivatives/v3/public/tickers', { category, symbol });
- }
-
- /** Get trading rules per symbol/contract, incl price/amount/value/leverage filters */
- getInstrumentInfo(
- params: UMInstrumentInfoRequest,
- ): Promise> {
- return this.get('/derivatives/v3/public/instruments-info', params);
- }
-
- /** Query mark price kline (like getCandles() but for mark price). */
- getMarkPriceCandles(params: UMCandlesRequest): Promise> {
- return this.get('/derivatives/v3/public/mark-price-kline', params);
- }
-
- /** Query Index Price Kline */
- getIndexPriceCandles(params: UMCandlesRequest): Promise> {
- return this.get('/derivatives/v3/public/index-price-kline', params);
- }
-
- /**
- * The funding rate is generated every 8 hours at 00:00 UTC, 08:00 UTC and 16:00 UTC.
- * For example, if a request is sent at 12:00 UTC, the funding rate generated earlier that day at 08:00 UTC will be sent.
- */
- getFundingRateHistory(
- params: UMFundingRateHistoryRequest,
- ): Promise> {
- return this.get(
- '/derivatives/v3/public/funding/history-funding-rate',
- params,
- );
- }
-
- /** Get Risk Limit */
- getRiskLimit(
- category: UMCategory,
- symbol: string,
- ): Promise> {
- return this.get('/derivatives/v3/public/risk-limit/list', {
- category,
- symbol,
- });
- }
-
- /** Get option delivery price */
- getOptionDeliveryPrice(
- params: UMOptionDeliveryPriceRequest,
- ): Promise> {
- return this.get('/derivatives/v3/public/delivery-price', params);
- }
-
- /** Get public trading history */
- getTrades(params: UMPublicTradesRequest): Promise> {
- return this.get('/derivatives/v3/public/recent-trade', params);
- }
-
- /**
- * Gets the total amount of unsettled contracts.
- * In other words, the total number of contracts held in open positions.
- */
- getOpenInterest(params: UMOpenInterestRequest): Promise> {
- return this.get('/derivatives/v3/public/open-interest', params);
- }
-
- /**
- *
- * Contract Account Endpoints
- *
- */
-
- /** -> Order API */
-
- /** Place an order */
- submitOrder(params: ContractOrderRequest): Promise> {
- return this.postPrivate('/contract/v3/private/order/create', params);
- }
-
- /**
- * Query order history.
- *
- * As order creation/cancellation is asynchronous, the data returned from the interface may be delayed.
- * To access order information in real-time, call getActiveOrders().
- */
- getHistoricOrders(
- params: ContractHistoricOrdersRequest,
- ): Promise>> {
- return this.getPrivate('/contract/v3/private/order/list', params);
- }
-
- /** Cancel order */
- cancelOrder(params: ContractCancelOrderRequest): Promise> {
- return this.postPrivate('/contract/v3/private/order/cancel', params);
- }
-
- /** Cancel all orders */
- cancelAllOrders(symbol: string): Promise> {
- return this.postPrivate('/contract/v3/private/order/cancel-all', {
- symbol,
- });
- }
-
- /**
- * Replace order
- *
- * Active order parameters (such as quantity, price) and stop order parameters
- * cannot be modified in one request at the same time.
- *
- * Please request modification separately.
- */
- modifyOrder(params: ContractModifyOrderRequest): Promise> {
- return this.postPrivate('/contract/v3/private/order/replace', params);
- }
-
- /** Query Open Order(s) (real-time) */
- getActiveOrders(
- params: ContractActiveOrdersRequest,
- ): Promise> {
- return this.getPrivate(
- '/contract/v3/private/order/unfilled-orders',
- params,
- );
- }
-
- /** -> Positions API */
-
- /**
- * Query my positions real-time. Accessing personal list of positions.
- * Either symbol or settleCoin is required.
- * Users can access their position holding information through this interface, such as the number of position holdings and wallet balance.
- */
- getPositions(params?: ContractPositionsRequest): Promise> {
- return this.getPrivate('/contract/v3/private/position/list', params);
- }
-
- /** Set auto add margin, or Auto-Margin Replenishment. */
- setAutoAddMargin(
- params: ContractSetAutoAddMarginRequest,
- ): Promise> {
- return this.postPrivate(
- '/contract/v3/private/position/set-auto-add-margin',
- params,
- );
- }
-
- /** Switch cross margin mode/isolated margin mode */
- setMarginSwitch(
- params: ContractSetMarginSwitchRequest,
- ): Promise> {
- return this.postPrivate(
- '/contract/v3/private/position/switch-isolated',
- params,
- );
- }
-
- /** Supports switching between One-Way Mode and Hedge Mode at the coin level. */
- setPositionMode(
- params: ContractSetPositionModeRequest,
- ): Promise> {
- return this.postPrivate(
- '/contract/v3/private/position/switch-mode',
- params,
- );
- }
-
- /**
- * Switch mode between Full or Partial
- */
- setTPSLMode(
- symbol: string,
- tpSlMode: 'Full' | 'Partial',
- ): Promise> {
- return this.postPrivate('/contract/v3/private/position/switch-tpsl-mode', {
- symbol,
- tpSlMode,
- });
- }
-
- /** Leverage setting. */
- setLeverage(
- symbol: string,
- buyLeverage: string,
- sellLeverage: string,
- ): Promise> {
- return this.postPrivate('/contract/v3/private/position/set-leverage', {
- symbol,
- buyLeverage,
- sellLeverage,
- });
- }
-
- /**
- * Set take profit, stop loss, and trailing stop for your open position.
- * If using partial mode, TP/SL/TS orders will not close your entire position.
- */
- setTPSL(params: ContractSetTPSLRequest): Promise> {
- return this.postPrivate(
- '/contract/v3/private/position/trading-stop',
- params,
- );
- }
-
- /** Set risk limit */
- setRiskLimit(
- symbol: string,
- riskId: number,
- /** 0-one-way, 1-buy side, 2-sell side */
- positionIdx: 0 | 1 | 2,
- ): Promise> {
- return this.postPrivate('/contract/v3/private/position/set-risk-limit', {
- symbol,
- riskId,
- positionIdx,
- });
- }
-
- /**
- * Get user's trading records.
- * The results are ordered in descending order (the first item is the latest). Returns records up to 2 years old.
- */
- getUserExecutionHistory(
- params: ContractUserExecutionHistoryRequest,
- ): Promise> {
- return this.getPrivate('/contract/v3/private/execution/list', params);
- }
-
- /**
- * Get user's closed profit and loss records.
- * The results are ordered in descending order (the first item is the latest).
- */
- getClosedProfitAndLoss(
- params: ContractClosedPNLRequest,
- ): Promise> {
- return this.getPrivate('/contract/v3/private/position/closed-pnl', params);
- }
-
- /** Get the information of open interest limit. */
- getOpenInterestLimitInfo(symbol: string): Promise> {
- return this.getPrivate('/contract/v3/private/position/limit-info', {
- symbol,
- });
- }
-
- /** -> Account API */
-
- /** Query wallet balance */
- getBalances(coin?: string): Promise> {
- return this.getPrivate('/contract/v3/private/account/wallet/balance', {
- coin,
- });
- }
-
- /** Get user trading fee rate */
- getTradingFeeRate(symbol?: string): Promise> {
- return this.getPrivate('/contract/v3/private/account/fee-rate', {
- symbol,
- });
- }
-
- /**
- * Get wallet fund records.
- * This endpoint also shows exchanges from the Asset Exchange,
- * where the types for the exchange are ExchangeOrderWithdraw and ExchangeOrderDeposit.
- *
- * This endpoint returns incomplete information for transfers involving the derivatives wallet.
- * Use the account asset API for creating and querying internal transfers.
- */
- getWalletFundRecords(
- params?: ContractWalletFundRecordRequest,
- ): Promise> {
- return this.getPrivate(
- '/contract/v3/private/account/wallet/fund-records',
- params,
- );
- }
-
- /**
- *
- * API Data Endpoints
- *
- */
-
- getServerTime(): Promise {
- return this.get('/v2/public/time');
- }
-}
diff --git a/src/copy-trading-client.ts b/src/copy-trading-client.ts
deleted file mode 100644
index 1fa226f..0000000
--- a/src/copy-trading-client.ts
+++ /dev/null
@@ -1,162 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-import {
- APIResponseV3,
- APIResponseWithTime,
- CopyTradingCancelOrderRequest,
- CopyTradingCloseOrderRequest,
- CopyTradingOrderListRequest,
- CopyTradingOrderRequest,
- CopyTradingTradingStopRequest,
- CopyTradingTransferRequest,
-} from './types';
-import { REST_CLIENT_TYPE_ENUM } from './util';
-import BaseRestClient from './util/BaseRestClient';
-
-/**
- * REST API client for USDC Perpetual APIs
- * @deprecated WARNING
- * These endpoints are being switched off gradually and are expected to be completely turned off by the end of 2024.
- * They may stop working at any point before then.
- * Please update your code as soon as possible to use the V5 APIs instead.
- */
-export class CopyTradingClient extends BaseRestClient {
- getClientType() {
- // Follows the same authentication mechanism as USDC APIs
- return REST_CLIENT_TYPE_ENUM.v3;
- }
-
- async fetchServerTime(): Promise {
- const res = await this.getServerTime();
- return Number(res.time_now);
- }
-
- /**
- *
- * Market Data Endpoints
- *
- */
-
- getSymbols(): Promise> {
- return this.get('/contract/v3/public/copytrading/symbol/list');
- }
-
- /**
- *
- * Account Data Endpoints
- *
- */
-
- /** -> Order API */
-
- /** Create order */
- submitOrder(params: CopyTradingOrderRequest): Promise> {
- return this.postPrivate(
- '/contract/v3/private/copytrading/order/create',
- params,
- );
- }
-
- /** Set Trading Stop */
- setTradingStop(
- params: CopyTradingTradingStopRequest,
- ): Promise> {
- return this.postPrivate(
- '/contract/v3/private/copytrading/order/trading-stop',
- params,
- );
- }
-
- /** Query Order List */
- getActiveOrders(
- params?: CopyTradingOrderListRequest,
- ): Promise> {
- return this.getPrivate(
- '/contract/v3/private/copytrading/order/list',
- params,
- );
- }
-
- /** Cancel order */
- cancelOrder(
- params: CopyTradingCancelOrderRequest,
- ): Promise> {
- return this.postPrivate(
- '/contract/v3/private/copytrading/order/cancel',
- params,
- );
- }
-
- /** Close Order.
- * This endpoint's rate_limit will decrease by 10 per request;
- * ie, one request to this endpoint consumes 10 from the limit allowed per minute.
- */
- closeOrder(
- params: CopyTradingCloseOrderRequest,
- ): Promise> {
- return this.postPrivate(
- '/contract/v3/private/copytrading/order/close',
- params,
- );
- }
-
- /** -> Positions API */
-
- /** Position List */
- getPositions(symbol?: string): Promise> {
- return this.getPrivate('/contract/v3/private/copytrading/position/list', {
- symbol,
- });
- }
-
- /** Close Position */
- closePosition(
- symbol: string,
- positionIdx: string,
- ): Promise> {
- return this.postPrivate('/contract/v3/private/copytrading/position/close', {
- symbol,
- positionIdx,
- });
- }
-
- /** Only integers can be set to set the leverage */
- setLeverage(
- symbol: string,
- buyLeverage: string,
- sellLeverage: string,
- ): Promise> {
- return this.postPrivate(
- '/contract/v3/private/copytrading/position/set-leverage',
- { symbol, buyLeverage, sellLeverage },
- );
- }
-
- /**
- *
- * Wallet Data Endpoints
- *
- */
-
- /** Get Wallet Balance */
- getBalances(): Promise> {
- return this.getPrivate('/contract/v3/private/copytrading/wallet/balance');
- }
-
- /** Transfer */
- transfer(params: CopyTradingTransferRequest): Promise> {
- return this.postPrivate(
- '/contract/v3/private/copytrading/wallet/transfer',
- params,
- );
- }
-
- /**
- *
- * API Data Endpoints
- *
- */
-
- getServerTime(): Promise {
- return this.get('/v2/public/time');
- }
-}
diff --git a/src/index.ts b/src/index.ts
index c93f1d3..2a85c6d 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,16 +1,5 @@
-export * from './account-asset-client';
-export * from './account-asset-client-v3';
-export * from './copy-trading-client';
-export * from './inverse-client';
-export * from './inverse-futures-client';
-export * from './linear-client';
export * from './rest-client-v5';
-export * from './spot-client';
export * from './spot-client-v3';
-export * from './usdc-option-client';
-export * from './usdc-perpetual-client';
-export * from './unified-margin-client';
-export * from './contract-client';
export * from './websocket-client';
export * from './util/logger';
export * from './util';
diff --git a/src/inverse-client.ts b/src/inverse-client.ts
deleted file mode 100644
index b860e17..0000000
--- a/src/inverse-client.ts
+++ /dev/null
@@ -1,341 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-import { REST_CLIENT_TYPE_ENUM } from './util';
-import {
- APIResponseWithTime,
- AssetExchangeRecordsReq,
- CoinParam,
- InverseActiveConditionalOrderRequest,
- InverseActiveOrdersRequest,
- InverseCancelConditionalOrderRequest,
- InverseCancelOrderRequest,
- InverseChangePositionMarginRequest,
- InverseConditionalOrderRequest,
- InverseGetClosedPnlRequest,
- InverseGetOrderRequest,
- InverseGetTradeRecordsRequest,
- InverseOrderRequest,
- InverseReplaceConditionalOrderRequest,
- InverseReplaceOrderRequest,
- InverseSetLeverageRequest,
- InverseSetMarginTypeRequest,
- InverseSetSlTpPositionModeRequest,
- InverseSetTradingStopRequest,
- SymbolInfo,
- SymbolIntervalFromLimitParam,
- SymbolLimitParam,
- SymbolParam,
- SymbolPeriodLimitParam,
- WalletFundRecordsReq,
- WithdrawRecordsReq,
-} from './types';
-import BaseRestClient from './util/BaseRestClient';
-
-/**
- * REST API client for Inverse Perpetual Futures APIs (v2)
- *
- * @deprecated WARNING: V1/V2 private endpoints (Rest API & Websocket Stream) for mainnet
- * will be switched off gradually from 30 Oct 2023 UTC, so they are not promised a stability.
- * Please note that you are at your own risk of using old endpoints going forward, and please move to V5 ASAP.
- */
-export class InverseClient extends BaseRestClient {
- getClientType() {
- return REST_CLIENT_TYPE_ENUM.inverse;
- }
-
- async fetchServerTime(): Promise {
- const res = await this.getServerTime();
- return Number(res.time_now);
- }
-
- /**
- *
- * Market Data Endpoints
- *
- */
-
- getOrderBook(params: SymbolParam): Promise> {
- return this.get('v2/public/orderBook/L2', params);
- }
-
- getKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('v2/public/kline/list', params);
- }
-
- /**
- * Get latest information for symbol
- */
- getTickers(
- params?: Partial,
- ): Promise> {
- return this.get('v2/public/tickers', params);
- }
-
- getTrades(params: SymbolLimitParam): Promise> {
- return this.get('v2/public/trading-records', params);
- }
-
- getSymbols(): Promise> {
- return this.get('v2/public/symbols');
- }
-
- getMarkPriceKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('v2/public/mark-price-kline', params);
- }
-
- getIndexPriceKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('v2/public/index-price-kline', params);
- }
-
- getPremiumIndexKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('v2/public/premium-index-kline', params);
- }
-
- /**
- *
- * Market Data : Advanced
- *
- */
-
- getOpenInterest(
- params: SymbolPeriodLimitParam,
- ): Promise> {
- return this.get('v2/public/open-interest', params);
- }
-
- getLatestBigDeal(
- params: SymbolLimitParam,
- ): Promise> {
- return this.get('v2/public/big-deal', params);
- }
-
- getLongShortRatio(
- params: SymbolPeriodLimitParam,
- ): Promise> {
- return this.get('v2/public/account-ratio', params);
- }
-
- /**
- *
- * Account Data Endpoints
- *
- */
-
- getApiKeyInfo(): Promise> {
- return this.getPrivate('v2/private/account/api-key');
- }
-
- /**
- *
- * Wallet Data Endpoints
- *
- */
-
- getWalletBalance(
- params?: Partial,
- ): Promise> {
- return this.getPrivate('v2/private/wallet/balance', params);
- }
-
- getWalletFundRecords(
- params?: WalletFundRecordsReq,
- ): Promise> {
- return this.getPrivate('v2/private/wallet/fund/records', params);
- }
-
- getWithdrawRecords(
- params?: WithdrawRecordsReq,
- ): Promise> {
- return this.getPrivate('v2/private/wallet/withdraw/list', params);
- }
-
- getAssetExchangeRecords(
- params?: AssetExchangeRecordsReq,
- ): Promise> {
- return this.getPrivate('v2/private/exchange-order/list', params);
- }
-
- /**
- *
- * API Data Endpoints
- *
- */
-
- getServerTime(): Promise> {
- return this.get('v2/public/time');
- }
-
- getApiAnnouncements(): Promise> {
- return this.get('v2/public/announcement');
- }
-
- /**
- *
- * Account Data Endpoints
- *
- */
-
- /**
- * Active orders
- */
-
- placeActiveOrder(
- orderRequest: InverseOrderRequest,
- ): Promise> {
- return this.postPrivate('v2/private/order/create', orderRequest);
- }
-
- getActiveOrderList(
- params: InverseActiveOrdersRequest,
- ): Promise> {
- return this.getPrivate('v2/private/order/list', params);
- }
-
- cancelActiveOrder(
- params: InverseCancelOrderRequest,
- ): Promise> {
- return this.postPrivate('v2/private/order/cancel', params);
- }
-
- cancelAllActiveOrders(
- params: SymbolParam,
- ): Promise> {
- return this.postPrivate('v2/private/order/cancelAll', params);
- }
-
- replaceActiveOrder(
- params: InverseReplaceOrderRequest,
- ): Promise> {
- return this.postPrivate('v2/private/order/replace', params);
- }
-
- queryActiveOrder(
- params: InverseGetOrderRequest,
- ): Promise> {
- return this.getPrivate('v2/private/order', params);
- }
-
- /**
- * Conditional orders
- */
-
- placeConditionalOrder(
- params: InverseConditionalOrderRequest,
- ): Promise> {
- return this.postPrivate('v2/private/stop-order/create', params);
- }
-
- /** get conditional order list. This may see delays, use queryConditionalOrder() for real-time queries */
- getConditionalOrder(
- params: InverseActiveConditionalOrderRequest,
- ): Promise> {
- return this.getPrivate('v2/private/stop-order/list', params);
- }
-
- cancelConditionalOrder(
- params: InverseCancelConditionalOrderRequest,
- ): Promise> {
- return this.postPrivate('v2/private/stop-order/cancel', params);
- }
-
- cancelAllConditionalOrders(
- params: SymbolParam,
- ): Promise> {
- return this.postPrivate('v2/private/stop-order/cancelAll', params);
- }
-
- replaceConditionalOrder(
- params: InverseReplaceConditionalOrderRequest,
- ): Promise> {
- return this.postPrivate('v2/private/stop-order/replace', params);
- }
-
- queryConditionalOrder(
- params: InverseGetOrderRequest,
- ): Promise> {
- return this.getPrivate('v2/private/stop-order', params);
- }
-
- /**
- * Position
- */
-
- getPosition(
- params?: Partial,
- ): Promise> {
- return this.getPrivate('v2/private/position/list', params);
- }
-
- changePositionMargin(
- params: InverseChangePositionMarginRequest,
- ): Promise> {
- return this.postPrivate('position/change-position-margin', params);
- }
-
- setTradingStop(
- params: InverseSetTradingStopRequest,
- ): Promise> {
- return this.postPrivate('v2/private/position/trading-stop', params);
- }
-
- setUserLeverage(
- params: InverseSetLeverageRequest,
- ): Promise> {
- return this.postPrivate('v2/private/position/leverage/save', params);
- }
-
- getTradeRecords(
- params: InverseGetTradeRecordsRequest,
- ): Promise> {
- return this.getPrivate('v2/private/execution/list', params);
- }
-
- getClosedPnl(
- params: InverseGetClosedPnlRequest,
- ): Promise> {
- return this.getPrivate('v2/private/trade/closed-pnl/list', params);
- }
-
- setSlTpPositionMode(
- params: InverseSetSlTpPositionModeRequest,
- ): Promise> {
- return this.postPrivate('v2/private/tpsl/switch-mode', params);
- }
-
- setMarginType(
- params: InverseSetMarginTypeRequest,
- ): Promise> {
- return this.postPrivate('v2/private/position/switch-isolated', params);
- }
-
- /**
- * Funding
- */
-
- getLastFundingRate(params: SymbolParam): Promise> {
- return this.get('v2/public/funding/prev-funding-rate', params);
- }
-
- getMyLastFundingFee(params: SymbolParam): Promise> {
- return this.getPrivate('v2/private/funding/prev-funding', params);
- }
-
- getPredictedFunding(params: SymbolParam): Promise> {
- return this.getPrivate('v2/private/funding/predicted-funding', params);
- }
-
- /**
- * LCP Info
- */
-
- getLcpInfo(params: SymbolParam): Promise> {
- return this.getPrivate('v2/private/account/lcp', params);
- }
-}
diff --git a/src/inverse-futures-client.ts b/src/inverse-futures-client.ts
deleted file mode 100644
index eb8646b..0000000
--- a/src/inverse-futures-client.ts
+++ /dev/null
@@ -1,407 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-import { REST_CLIENT_TYPE_ENUM } from './util/requestUtils';
-import {
- APIResponseWithTime,
- AssetExchangeRecordsReq,
- CoinParam,
- SymbolInfo,
- SymbolIntervalFromLimitParam,
- SymbolLimitParam,
- SymbolParam,
- SymbolPeriodLimitParam,
- WalletFundRecordsReq,
- WithdrawRecordsReq,
-} from './types/shared';
-import BaseRestClient from './util/BaseRestClient';
-
-/**
- * REST API client for Inverse Futures APIs (e.g. quarterly futures) (v2)
- *
- * @deprecated WARNING: V1/V2 private endpoints (Rest API & Websocket Stream) for mainnet
- * will be switched off gradually from 30 Oct 2023 UTC, so they are not promised a stability.
- * Please note that you are at your own risk of using old endpoints going forward, and please move to V5 ASAP.
- */
-export class InverseFuturesClient extends BaseRestClient {
- getClientType() {
- return REST_CLIENT_TYPE_ENUM.inverseFutures;
- }
-
- async fetchServerTime(): Promise {
- const res = await this.getServerTime();
- return Number(res.time_now);
- }
-
- /**
- *
- * Market Data Endpoints
- *
- */
-
- getOrderBook(params: SymbolParam): Promise> {
- return this.get('v2/public/orderBook/L2', params);
- }
-
- getKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('v2/public/kline/list', params);
- }
-
- /**
- * Get latest information for symbol
- */
- getTickers(
- params?: Partial,
- ): Promise> {
- return this.get('v2/public/tickers', params);
- }
-
- /**
- * Public trading records
- */
- getTrades(params: SymbolLimitParam): Promise> {
- return this.get('v2/public/trading-records', params);
- }
-
- getSymbols(): Promise> {
- return this.get('v2/public/symbols');
- }
-
- getMarkPriceKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('v2/public/mark-price-kline', params);
- }
-
- getIndexPriceKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('v2/public/index-price-kline', params);
- }
-
- getPremiumIndexKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('v2/public/premium-index-kline', params);
- }
-
- /**
- *
- * Market Data : Advanced
- *
- */
-
- getOpenInterest(
- params: SymbolPeriodLimitParam,
- ): Promise> {
- return this.get('v2/public/open-interest', params);
- }
-
- getLatestBigDeal(
- params: SymbolLimitParam,
- ): Promise> {
- return this.get('v2/public/big-deal', params);
- }
-
- getLongShortRatio(
- params: SymbolPeriodLimitParam,
- ): Promise> {
- return this.get('v2/public/account-ratio', params);
- }
-
- /**
- *
- * Account Data Endpoints
- *
- */
-
- getApiKeyInfo(): Promise> {
- return this.getPrivate('v2/private/account/api-key');
- }
-
- /**
- *
- * Wallet Data Endpoints
- *
- */
-
- getWalletBalance(
- params?: Partial,
- ): Promise> {
- return this.getPrivate('v2/private/wallet/balance', params);
- }
-
- getWalletFundRecords(
- params?: WalletFundRecordsReq,
- ): Promise> {
- return this.getPrivate('v2/private/wallet/fund/records', params);
- }
-
- getWithdrawRecords(
- params?: WithdrawRecordsReq,
- ): Promise> {
- return this.getPrivate('v2/private/wallet/withdraw/list', params);
- }
-
- getAssetExchangeRecords(
- params?: AssetExchangeRecordsReq,
- ): Promise> {
- return this.getPrivate('v2/private/exchange-order/list', params);
- }
-
- /**
- *
- * API Data Endpoints
- *
- */
-
- getServerTime(): Promise> {
- return this.get('v2/public/time');
- }
-
- getApiAnnouncements(): Promise> {
- return this.get('v2/public/announcement');
- }
-
- /**
- *
- * Account Data Endpoints
- *
- */
-
- /**
- * Active orders
- */
-
- placeActiveOrder(orderRequest: {
- side: string;
- symbol: string;
- order_type: string;
- qty: number;
- price?: number;
- time_in_force: string;
- take_profit?: number;
- stop_loss?: number;
- reduce_only?: boolean;
- close_on_trigger?: boolean;
- order_link_id?: string;
- }): Promise> {
- return this.postPrivate('futures/private/order/create', orderRequest);
- }
-
- getActiveOrderList(params: {
- symbol: string;
- order_status?: string;
- direction?: string;
- limit?: number;
- cursor?: string;
- }): Promise> {
- return this.getPrivate('futures/private/order/list', params);
- }
-
- cancelActiveOrder(params: {
- symbol: string;
- order_id?: string;
- order_link_id?: string;
- }): Promise> {
- return this.postPrivate('futures/private/order/cancel', params);
- }
-
- cancelAllActiveOrders(
- params: SymbolParam,
- ): Promise> {
- return this.postPrivate('futures/private/order/cancelAll', params);
- }
-
- replaceActiveOrder(params: {
- order_id?: string;
- order_link_id?: string;
- symbol: string;
- p_r_qty?: string;
- p_r_price?: string;
- }): Promise> {
- return this.postPrivate('futures/private/order/replace', params);
- }
-
- queryActiveOrder(params: {
- order_id?: string;
- order_link_id?: string;
- symbol: string;
- }): Promise> {
- return this.getPrivate('futures/private/order', params);
- }
-
- /**
- * Conditional orders
- */
-
- placeConditionalOrder(params: {
- side: string;
- symbol: string;
- order_type: string;
- qty: string;
- price?: string;
- base_price: string;
- stop_px: string;
- time_in_force: string;
- trigger_by?: string;
- close_on_trigger?: boolean;
- order_link_id?: string;
- }): Promise> {
- return this.postPrivate('futures/private/stop-order/create', params);
- }
-
- getConditionalOrder(params: {
- symbol: string;
- stop_order_status?: string;
- direction?: string;
- limit?: number;
- cursor?: string;
- }): Promise> {
- return this.getPrivate('futures/private/stop-order/list', params);
- }
-
- cancelConditionalOrder(params: {
- symbol: string;
- stop_order_id?: string;
- order_link_id?: string;
- }): Promise> {
- return this.postPrivate('futures/private/stop-order/cancel', params);
- }
-
- cancelAllConditionalOrders(
- params: SymbolParam,
- ): Promise> {
- return this.postPrivate('futures/private/stop-order/cancelAll', params);
- }
-
- replaceConditionalOrder(params: {
- stop_order_id?: string;
- order_link_id?: string;
- symbol: string;
- p_r_qty?: number;
- p_r_price?: string;
- p_r_trigger_price?: string;
- }): Promise> {
- return this.postPrivate('futures/private/stop-order/replace', params);
- }
-
- queryConditionalOrder(params: {
- symbol: string;
- stop_order_id?: string;
- order_link_id?: string;
- }): Promise> {
- return this.getPrivate('futures/private/stop-order', params);
- }
-
- /**
- * Position
- */
-
- /**
- * Get position list
- */
- getPosition(
- params?: Partial,
- ): Promise> {
- return this.getPrivate('futures/private/position/list', params);
- }
-
- changePositionMargin(params: {
- symbol: string;
- margin: string;
- }): Promise> {
- return this.postPrivate(
- 'futures/private/position/change-position-margin',
- params,
- );
- }
-
- setTradingStop(params: {
- symbol: string;
- take_profit?: number;
- stop_loss?: number;
- trailing_stop?: number;
- tp_trigger_by?: string;
- sl_trigger_by?: string;
- new_trailing_active?: number;
- }): Promise> {
- return this.postPrivate('futures/private/position/trading-stop', params);
- }
-
- setUserLeverage(params: {
- symbol: string;
- buy_leverage: number;
- sell_leverage: number;
- }): Promise> {
- return this.postPrivate('futures/private/position/leverage/save', params);
- }
-
- /**
- * Position mode switch
- */
- setPositionMode(params: {
- symbol: string;
- mode: number;
- }): Promise> {
- return this.postPrivate('futures/private/position/switch-mode', params);
- }
-
- /**
- * Cross/Isolated margin switch. Must set leverage value when switching.
- */
- setMarginType(params: {
- symbol: string;
- is_isolated: boolean;
- buy_leverage: number;
- sell_leverage: number;
- }): Promise> {
- return this.postPrivate('futures/private/position/switch-isolated', params);
- }
-
- getTradeRecords(params: {
- order_id?: string;
- symbol: string;
- start_time?: number;
- page?: number;
- limit?: number;
- order?: string;
- }): Promise> {
- return this.getPrivate('futures/private/execution/list', params);
- }
-
- getClosedPnl(params: {
- symbol: string;
- start_time?: number;
- end_time?: number;
- exec_type?: string;
- page?: number;
- limit?: number;
- }): Promise> {
- return this.getPrivate('futures/private/trade/closed-pnl/list', params);
- }
-
- /**
- * Funding
- */
-
- getLastFundingRate(params: SymbolParam): Promise> {
- return this.get('v2/public/funding/prev-funding-rate', params);
- }
-
- getMyLastFundingFee(params: SymbolParam): Promise> {
- return this.getPrivate('v2/private/funding/prev-funding', params);
- }
-
- getPredictedFunding(params: SymbolParam): Promise> {
- return this.getPrivate('v2/private/funding/predicted-funding', params);
- }
-
- /**
- * LCP Info
- */
-
- getLcpInfo(params: SymbolParam): Promise> {
- return this.getPrivate('v2/private/account/lcp', params);
- }
-}
diff --git a/src/linear-client.ts b/src/linear-client.ts
deleted file mode 100644
index 2e6a637..0000000
--- a/src/linear-client.ts
+++ /dev/null
@@ -1,391 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-import { REST_CLIENT_TYPE_ENUM } from './util/requestUtils';
-import {
- APIResponse,
- APIResponseWithTime,
- AssetExchangeRecordsReq,
- CoinParam,
- LinearCancelConditionalOrderRequest,
- LinearCancelOrderRequest,
- LinearConditionalOrderRequest,
- LinearGetClosedPnlRequest,
- LinearGetConditionalOrderRequest,
- LinearGetHistoryTradeRecordsRequest,
- LinearGetOrderRequest,
- LinearGetOrdersRequest,
- LinearGetTradeRecordsRequest,
- LinearOrder,
- LinearQueryConditionalOrderRequest,
- LinearReplaceConditionalOrderRequest,
- LinearReplaceOrderRequest,
- LinearSetAddReduceMarginRequest,
- LinearSetAutoAddMarginRequest,
- LinearSetMarginSwitchRequest,
- LinearSetPositionModeRequest,
- LinearSetPositionTpSlModeRequest,
- LinearSetRiskLimitRequest,
- LinearSetTradingStopRequest,
- LinearSetUserLeverageRequest,
- NewLinearOrder,
- PerpPosition,
- PerpPositionRoot,
- SymbolInfo,
- SymbolIntervalFromLimitParam,
- SymbolLimitParam,
- SymbolParam,
- SymbolPeriodLimitParam,
- WalletBalances,
- WalletFundRecordsReq,
- WithdrawRecordsReq,
-} from './types';
-import BaseRestClient from './util/BaseRestClient';
-
-/**
- * REST API client for linear/USD perpetual futures APIs (v2)
- *
- * @deprecated WARNING: V1/V2 private endpoints (Rest API & Websocket Stream) for mainnet
- * will be switched off gradually from 30 Oct 2023 UTC, so they are not promised a stability.
- * Please note that you are at your own risk of using old endpoints going forward, and please move to V5 ASAP.
- */
-export class LinearClient extends BaseRestClient {
- getClientType() {
- return REST_CLIENT_TYPE_ENUM.linear;
- }
-
- async fetchServerTime(): Promise {
- const timeRes = await this.getServerTime();
- return Number(timeRes.time_now);
- }
-
- /**
- *
- * Market Data Endpoints
- *
- */
-
- getOrderBook(params: SymbolParam): Promise> {
- return this.get('v2/public/orderBook/L2', params);
- }
-
- getKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('public/linear/kline', params);
- }
-
- /**
- * Get latest information for symbol
- */
- getTickers(
- params?: Partial,
- ): Promise> {
- return this.get('v2/public/tickers', params);
- }
-
- getTrades(params: SymbolLimitParam): Promise> {
- return this.get('public/linear/recent-trading-records', params);
- }
-
- getSymbols(): Promise> {
- return this.get('v2/public/symbols');
- }
-
- getLastFundingRate(params: SymbolParam): Promise> {
- return this.get('public/linear/funding/prev-funding-rate', params);
- }
-
- getMarkPriceKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('public/linear/mark-price-kline', params);
- }
-
- getIndexPriceKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('public/linear/index-price-kline', params);
- }
-
- getPremiumIndexKline(
- params: SymbolIntervalFromLimitParam,
- ): Promise> {
- return this.get('public/linear/premium-index-kline', params);
- }
-
- /**
- *
- * Market Data : Advanced
- *
- */
-
- getOpenInterest(
- params: SymbolPeriodLimitParam,
- ): Promise> {
- return this.get('v2/public/open-interest', params);
- }
-
- getLatestBigDeal(
- params: SymbolLimitParam,
- ): Promise> {
- return this.get('v2/public/big-deal', params);
- }
-
- getLongShortRatio(
- params: SymbolPeriodLimitParam,
- ): Promise> {
- return this.get('v2/public/account-ratio', params);
- }
-
- /**
- *
- * Account Data Endpoints
- *
- */
-
- getApiKeyInfo(): Promise> {
- return this.getPrivate('v2/private/account/api-key');
- }
-
- /**
- *
- * Wallet Data Endpoints
- *
- */
-
- getWalletBalance(
- params?: Partial,
- ): Promise> {
- return this.getPrivate('v2/private/wallet/balance', params);
- }
-
- getWalletFundRecords(
- params?: WalletFundRecordsReq,
- ): Promise> {
- return this.getPrivate('v2/private/wallet/fund/records', params);
- }
-
- getWithdrawRecords(
- params?: WithdrawRecordsReq,
- ): Promise> {
- return this.getPrivate('v2/private/wallet/withdraw/list', params);
- }
-
- getAssetExchangeRecords(
- params?: AssetExchangeRecordsReq,
- ): Promise> {
- return this.getPrivate('v2/private/exchange-order/list', params);
- }
-
- /**
- *
- * API Data Endpoints
- *
- */
-
- getServerTime(): Promise> {
- return this.get('v2/public/time');
- }
-
- getApiAnnouncements(): Promise> {
- return this.get('v2/public/announcement');
- }
-
- /**
- *
- * Account Data Endpoints
- *
- */
-
- placeActiveOrder(
- params: NewLinearOrder,
- ): Promise> {
- return this.postPrivate('private/linear/order/create', params);
- }
-
- getActiveOrderList(
- params: LinearGetOrdersRequest,
- ): Promise> {
- return this.getPrivate('private/linear/order/list', params);
- }
-
- cancelActiveOrder(
- params: LinearCancelOrderRequest,
- ): Promise> {
- return this.postPrivate('private/linear/order/cancel', params);
- }
-
- cancelAllActiveOrders(
- params: SymbolParam,
- ): Promise> {
- return this.postPrivate('private/linear/order/cancel-all', params);
- }
-
- replaceActiveOrder(
- params: LinearReplaceOrderRequest,
- ): Promise> {
- return this.postPrivate('private/linear/order/replace', params);
- }
-
- queryActiveOrder(
- params: LinearGetOrderRequest,
- ): Promise> {
- return this.getPrivate('private/linear/order/search', params);
- }
-
- /**
- * Conditional orders
- */
-
- placeConditionalOrder(
- params: LinearConditionalOrderRequest,
- ): Promise> {
- return this.postPrivate('private/linear/stop-order/create', params);
- }
-
- getConditionalOrder(
- params: LinearGetConditionalOrderRequest,
- ): Promise> {
- return this.getPrivate('private/linear/stop-order/list', params);
- }
-
- cancelConditionalOrder(
- params: LinearCancelConditionalOrderRequest,
- ): Promise> {
- return this.postPrivate('private/linear/stop-order/cancel', params);
- }
-
- cancelAllConditionalOrders(
- params: SymbolParam,
- ): Promise> {
- return this.postPrivate('private/linear/stop-order/cancel-all', params);
- }
-
- replaceConditionalOrder(
- params: LinearReplaceConditionalOrderRequest,
- ): Promise> {
- return this.postPrivate('private/linear/stop-order/replace', params);
- }
-
- queryConditionalOrder(
- params: LinearQueryConditionalOrderRequest,
- ): Promise> {
- return this.getPrivate('private/linear/stop-order/search', params);
- }
-
- /**
- * Position
- */
-
- getPosition(): Promise>;
-
- getPosition(
- params: Partial,
- ): Promise>;
-
- getPosition(
- params?: Partial,
- ): Promise> {
- return this.getPrivate('private/linear/position/list', params);
- }
-
- setAutoAddMargin(
- params?: LinearSetAutoAddMarginRequest,
- ): Promise> {
- return this.postPrivate(
- 'private/linear/position/set-auto-add-margin',
- params,
- );
- }
-
- setMarginSwitch(
- params?: LinearSetMarginSwitchRequest,
- ): Promise> {
- return this.postPrivate('private/linear/position/switch-isolated', params);
- }
-
- /**
- * Switch between one-way vs hedge mode. Use `linearPositionModeEnum` for the mode parameter.
- */
- setPositionMode(
- params: LinearSetPositionModeRequest,
- ): Promise> {
- return this.postPrivate('private/linear/position/switch-mode', params);
- }
-
- /**
- * Switch TP/SL mode between full or partial. When set to Partial, TP/SL orders may have a quantity less than the position size.
- * This is set with the setTradingStop() method. Use `positionTpSlModeEnum` for the tp_sl_mode parameter.
- */
- setPositionTpSlMode(
- params: LinearSetPositionTpSlModeRequest,
- ): Promise> {
- return this.postPrivate('private/linear/tpsl/switch-mode', params);
- }
-
- setAddReduceMargin(
- params?: LinearSetAddReduceMarginRequest,
- ): Promise> {
- return this.postPrivate('private/linear/position/add-margin', params);
- }
-
- setUserLeverage(
- params: LinearSetUserLeverageRequest,
- ): Promise> {
- return this.postPrivate('private/linear/position/set-leverage', params);
- }
-
- setTradingStop(
- params: LinearSetTradingStopRequest,
- ): Promise> {
- return this.postPrivate('private/linear/position/trading-stop', params);
- }
-
- getTradeRecords(
- params: LinearGetTradeRecordsRequest,
- ): Promise> {
- return this.getPrivate('private/linear/trade/execution/list', params);
- }
-
- getHistoryTradeRecords(
- params: LinearGetHistoryTradeRecordsRequest,
- ): Promise> {
- return this.getPrivate(
- '/private/linear/trade/execution/history-list',
- params,
- );
- }
-
- getClosedPnl(
- params: LinearGetClosedPnlRequest,
- ): Promise> {
- return this.getPrivate('private/linear/trade/closed-pnl/list', params);
- }
-
- /**
- * Risk Limit
- */
-
- getRiskLimitList(params: SymbolParam): Promise> {
- return this.getPrivate('public/linear/risk-limit', params);
- }
-
- setRiskLimit(
- params: LinearSetRiskLimitRequest,
- ): Promise> {
- return this.postPrivate('private/linear/position/set-risk', params);
- }
-
- /**
- * Funding
- */
-
- getPredictedFundingFee(
- params: SymbolParam,
- ): Promise> {
- return this.getPrivate('private/linear/funding/predicted-funding', params);
- }
-
- getLastFundingFee(params: SymbolParam): Promise> {
- return this.getPrivate('private/linear/funding/prev-funding', params);
- }
-}
diff --git a/src/rest-client-v5.ts b/src/rest-client-v5.ts
index 89531ae..7a84e1a 100644
--- a/src/rest-client-v5.ts
+++ b/src/rest-client-v5.ts
@@ -170,7 +170,6 @@ import {
SpotBorrowCheckResultV5,
SpotLeveragedTokenOrderHistoryV5,
SpotMarginStateV5,
- SubAccountAllApiKeysResultV5,
SubMemberV5,
SwitchIsolatedMarginParamsV5,
SwitchPositionModeParamsV5,
@@ -191,8 +190,19 @@ import {
VipCollateralCoinsV5,
WalletBalanceV5,
WithdrawParamsV5,
+ WithdrawableAmountV5,
WithdrawalRecordV5,
} from './types';
+import {
+ GetEarnOrderHistoryParams,
+ GetEarnPositionParams,
+ SubmitStakeRedeemParams,
+} from './types/request/v5-earn';
+import {
+ EarnOrderHistory,
+ EarnPosition,
+ EarnProduct,
+} from './types/response/v5-earn';
import { REST_CLIENT_TYPE_ENUM } from './util';
import BaseRestClient from './util/BaseRestClient';
@@ -272,7 +282,7 @@ export class RestClientV5 extends BaseRestClient {
*/
getClientType() {
- return REST_CLIENT_TYPE_ENUM.v3;
+ return REST_CLIENT_TYPE_ENUM.v5;
}
async fetchServerTime(): Promise {
@@ -551,7 +561,9 @@ export class RestClientV5 extends BaseRestClient {
cancelAllOrders(
params: CancelAllOrdersParamsV5,
- ): Promise> {
+ ): Promise<
+ APIResponseV3WithTime<{ list: OrderResultV5[]; success: string }>
+ > {
return this.postPrivate('/v5/order/cancel-all', params);
}
@@ -566,6 +578,18 @@ export class RestClientV5 extends BaseRestClient {
return this.getPrivate('/v5/order/history', params);
}
+ /**
+ * Query users' execution records, sorted by execTime in descending order
+ *
+ * Unified account covers: Spot / Linear contract / Options
+ * Normal account covers: USDT perpetual / Inverse perpetual / Inverse futures
+ */
+ getExecutionList(
+ params: GetExecutionListParamsV5,
+ ): Promise>> {
+ return this.getPrivate('/v5/execution/list', params);
+ }
+
/**
* This endpoint allows you to place more than one order in a single request.
* Covers: Option (UTA, UTA Pro) / USDT Perpetual, UDSC Perpetual, USDC Futures (UTA Pro)
@@ -675,7 +699,7 @@ export class RestClientV5 extends BaseRestClient {
* Only for institutional clients!
*/
setDisconnectCancelAllWindowV2(params: {
- product: 'OPTION' | 'SPOT' | 'DERIVATIVES';
+ product?: 'OPTION' | 'SPOT' | 'DERIVATIVES';
timeWindow: number;
}): Promise> {
return this.postPrivate('/v5/order/disconnected-cancel-all', params);
@@ -733,6 +757,7 @@ export class RestClientV5 extends BaseRestClient {
}
/**
+ * @deprecated
* This endpoint sets the take profit/stop loss (TP/SL) mode to full or partial.
*
* Unified account covers: Linear contract; normal account covers: USDT perpetual, inverse perpetual, inverse futures.
@@ -761,6 +786,7 @@ export class RestClientV5 extends BaseRestClient {
}
/**
+ * @deprecated
* The risk limit will limit the maximum position value you can hold under different margin requirements.
* If you want to hold a bigger position size, you need more margin.
*
@@ -811,18 +837,6 @@ export class RestClientV5 extends BaseRestClient {
return this.postPrivate('/v5/position/add-margin', params);
}
- /**
- * Query users' execution records, sorted by execTime in descending order
- *
- * Unified account covers: Spot / Linear contract / Options
- * Normal account covers: USDT perpetual / Inverse perpetual / Inverse futures
- */
- getExecutionList(
- params: GetExecutionListParamsV5,
- ): Promise>> {
- return this.getPrivate('/v5/execution/list', params);
- }
-
/**
* Query user's closed profit and loss records. The results are sorted by createdTime in descending order.
*
@@ -1099,6 +1113,19 @@ export class RestClientV5 extends BaseRestClient {
return this.getPrivate('/v5/account/info');
}
+ /**
+ * Query the DCP configuration of the account's contracts (USDT perpetual, USDC perpetual and USDC Futures) / spot / options.
+ *
+ * Only the configured main / sub account can query information from this API. Calling this API by an account always returns empty.
+ *
+ * INFO
+ * support linear contract (USDT, USDC Perp & USDC Futures) / Spot / Options only
+ * Unified account only
+ */
+ getDCPInfo(): Promise