Skip to content
Update Trading authored by Victor Sorokolet's avatar Victor Sorokolet
# Menu
- [HTTP Protocol API](#http-protocol-api)
- [HTTP Authorization](#http-authorization)
- [Return Codes of Errors](#return-codes-of-errors)
- [Public Data Methods](#public-data-methods)
- [List of Public Pairs](#list-of-public-pairs)
- [Specific Public Ticker Data](#specific-public-ticker-data)
- [List of Order Book](#list-of-order-book)
- [Market History Data](#market-history-data)
- [Public Pair List](#public-pair-list)
- [Depth List](#depth-list)
- [List of Graphic Data KLine](#list-of-graphic-data-kline)
- [Private Data Methods](#private-data-methods)
- [Create new Limit Order](#create-new-limit-order)
- [Create new Market Order](#create-new-market-order)
- [Cancel Order](#cancel-order)
- [My Active Orders](#my-active-orders)
- [My All Trade Balances](#my-all-trade-balances)
- [My Specific Trade Balance](#my-specific-trade-balance)
- [Get My Order Info](#get-my-order-info)
- [My Order History](#my-order-history)
- [WebSoket Protocol API](#websoket-protocol-api)
- [Web-Soket Authorization](#web-soket-authorization)
- [Basic WS structure](#basic-ws-structure)
- [PING-PONG Method](#ping-pong-method)
- [System Time Method](#system-time-method)
- [KLine methods for Graph](#kline-methods-for-graph)
- [KLine Query Method](#kline-query-method)
- [KLine Subscribe Method](#kline-subscribe-method)
- [KLine Unsubscribe Method](#kline-unsubscribe-method)
- [Market Price Methods](#market-price-methods)
- [Market Price Query Method](#market-price-query-method)
- [Market Price Subscribe Method](#market-price-subscribe-method)
- [Market Price Unsubscribe Method](#market-price-unsubscribe-method)
- [Market Status Methods](#market-status-methods)
- [Market Status Query Method](#market-status-query-method)
- [Market Status Subscribe Method](#market-status-subscribe-method)
- [Market Status Unsubscribe Method](#market-status-unsubscribe-method)
- [Deals Methods](#deals-methods)
- [Deals Query Method](#deals-query-method)
- [Deals Subscribe Method](#deals-subscribe-method)
- [Deals Unsubscribe Method](#deals-unsubscribe-method)
- [Depth Methods](#depth-methods)
- [Depth Query Method](#depth-query-method)
- [Depth Subscribe Method](#depth-subscribe-method)
- [Depth Unsubscribe Method](#depth-unsubscribe-method)
- [Trade User Balances Methods](#trade-user-balances-methods)
- [Asset Query Method](#asset-query-method)
- [Asset Subscribe Method](#asset-subscribe-method)
- [Asset Unsubscribe Method](#asset-unsubscribe-method)
- [Active Orders and Orders History Methods](#active-orders-and-orders-history-methods)
- [Order Query Method](#order-query-method)
- [Order History Method](#order-history-method)
- [Order Subscribe Method](#order-subscribe-method)
- [Order Unsubscribe Method](#order-unsubscribe-method)
# HTTP Protocol API
## HTTP Protocol API
<details open>
<summary>
</summary>
### Detailed information
<details open>
<summary> </summary>
**Public Methods:**
This method provides information via `GET`. The response will return all the information that was posted by the platform. To obtain private information, use the same methods via `POST` as an authorized user using api keys.
- [List of Public Pairs](#list-of-public-pairs) - returns the history of trades for all public pairs - used for tracking to compare prices in the market, control positions for many markets at once.
- [Specific Public Ticker Data](#specific-public-ticker-data) - returns the trading history for a specific selected pair - used to track a specific pair and track its key characteristics.
- [List of Order Book](#list-of-order-book) - Returns all positions for a specific market for all orders of the order book in the selected direction with pagination - used for full monitoring of the order book status, its changes, evaluation of its placed orders and their priority.
......@@ -89,9 +32,6 @@ This method provides information via `GET`. The response will return all the inf
- [Depth List](#depth-list) - returns data on the order book with pagination for a specific pair - used to track the depth of the order book, control placed orders, monitor the market in light mode.
- [List of Graphic Data KLine](#list-of-graphic-data-kline) - returns data on charts - is used to create personal charts, control market trends.
**Public Methods Via `POST`:**
First of all to use `POST` methods check how to made [HTTP Authorization](#http-authorization)
......@@ -105,32 +45,24 @@ Use next methods via `POST` and obtain full information:
- [Depth List](#depth-list)
- [List of Graphic Data KLine](#list-of-graphic-data-kline)
**Private Methods:**
All of this methods can be use only with `POST`. Before using check [HTTP Authorization](#http-authorization)
- [Create new Limit Order](#create-new-limit-order) - used to create a Limit Order with the specified parameters, if successful, returns information about the placed order.
- [Create new Market Order](#create-new-market-order) - is used to create a Market Order with the specified parameters; if successful, it returns information about the placed order.
- [Cancel Order](#cancel-order) - used to close the placed Limit Order with the ID of the placed order, if successful, returns information about the closed order.
- [My Active Orders](#my-active-orders) - used to obtain information on the user's active orders, if successful, it returns a list of active orders.
- [My All Trade Balances](#my-all-trade-balances) - returns the entire list of user balances - used to control all balances.
- [My Specific Trade Balance](#my-specific-trade-balance) - returns the balance for the specified coin - used to control a specific coin, as a faster alternative to the first method.
- [Get My Order Info](#get-my-order-info) - returns information about a specific order of a specific user - used to track the status of an order.
- [My Order History](#my-order-history)- returns the history of orders, it is used to generate reports, control orders and executed orders.
</details>
## HTTP Authorization
### HTTP Authorization
<details open>
<summary> </summary>
Follow 5 simple steps to use private methods:
* Before authorization, you need to log in to https://qmall.io/login or register if the user has not yet been created https://qmall.io/register.
......@@ -141,28 +73,28 @@ Follow 5 simple steps to use private methods:
Each package will contain 3 keys:
apiKey - public key
apiSecret - private key
weKey - key for websockets
- ***apiKey*** - public key
- ***apiSecret*** - private key
**Important!**
- ***weKey*** - key for websockets
`nonce` - used as a parameter to protect against DDoS attacks and an excessive number of API requests. This parameter is most often used through a timestamp with a minimum step per second. Each next request must be greater than the next one in the `nonce` parameters.
You need to fill in the header parameters, see examples.
```
Important!
nonce - used as a parameter to protect against DDoS attacks and an excessive number of API requests. This parameter is most often used through a timestamp with a minimum step per second. Each next request must be greater than the next one in the 'nonce' parameters.
```
Let's look at a few examples of authorization in different development languages:
**PHP**
#### PHP
<details open>
<summary>
</summary>
<summary> </summary>
```php
```javascript
use GuzzleHttp\Client;
public function callApi()
......@@ -200,18 +132,12 @@ public function callApi()
return response()->json(['result' => json_decode($res->getBody()->getContents())]);
}
```
</details>
**Nest.js or Node.js**
<details open>
<summary>
</summary>
#### Nest.js (or Node.js)
<details open> <summary> </summary>
```javascript
import { HttpService, Injectable } from '@nestjs/common';
import * as crypto from 'crypto';
import { AxiosResponse } from 'axios';
......@@ -271,14 +197,11 @@ export class PaymentService {
```
</details>
**JAVA**
#### JAVA
<details open>
<summary>
</summary>
<summary> </summary>
```java
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.specification.RequestSpecification;
......@@ -296,8 +219,8 @@ public class AuthencationRA {
private static final String REQUEST_URL = "https://api.qmall.io";
private static final String API_PATH = "/api/v1/account/balance";
private static final String API_KEY = " ";
private static final String API_SECRET = " ";
private static final String API_KEY = "xxxxxxxxx";
private static final String API_SECRET = "xxxxxxxxxxxx";
public static void main(String[] args) throws Exception {
......@@ -369,21 +292,22 @@ public class AuthencationRA {
```
</details>
</details>
## Return Codes of Errors
### Return Codes of Errors
<details open>
<summary>
</summary>
<summary> </summary>
#### Return Codes
* HTTP `200` return code is used when the Succesful responce;
* HTTP `401` return code is used when the request made by Unauthorized user;
* HTTP `403` return code is used when the request made to Forbidden data from user without necessary permissions;
* HTTP `404` return code is used when the request made with undefined data and service can Not Found data for response.
***
### Errors messages:
```java
HTTP `200` return code is used when the Succesful responce;
HTTP `401` return code is used when the request made by Unauthorized user;
HTTP `403` return code is used when the request made to Forbidden data from user without necessary permissions;
HTTP `404` return code is used when the request made with undefined data and service can Not Found data for response.
```
#### Errors messages:
**"Invalid payload"** - this error occurs when the data that was provided in the body of the request doesn't match the base64-decoded payload.
```java
{
......@@ -458,23 +382,29 @@ public class AuthencationRA {
```
</details>
---
### Public Methods
<details open>
<summary>
These methods provide information via GET.
The response will return all the information that was posted by the platform.
To obtain private information, use the same methods via POST as an authorized user using api keys.
</summary>
## Public Data Methods
All public methods requested with `GET` and consist only publick data.
### List of Public Pairs
#### List of Public Pairs
<details open>
<summary>
This method provides information via GET
</summary>
```
`GET` /api/v1/public/markets
```java
GET /api/v1/public/markets
```
```java
curl -X GET "https://api.qmall.io/api/v1/public/markets" -H "accept: application/json"
```
**Response Parameters:**
......@@ -488,9 +418,7 @@ stockPrec | NUMERIC |
feePrec | NUMERIC |
minAmount | STRING |
**Response:**
**Response samples:**
```javascript
{
"code": 0,
......@@ -512,24 +440,26 @@ minAmount | STRING |
],
}
```
</details>
### List of Public Tickers
#### List of Public Tickers
<details open>
<summary>
This method provides information via GET
</summary>
```
`GET` /api/v1/public/tickers
```java
GET /api/v1/public/tickers
```
```java
curl -X GET "https://api.qmall.io/api/v1/public/tickers" -H "accept: application/json"
```
**Response Parameters:**
Name | Type |
------------ | ------------
---- | ---- |
name | STRING |
bid | STRING |
ask | STRING |
......@@ -541,72 +471,59 @@ volume | STRING |
deal | STRING |
change | STRING |
**Response samples:**
**Response:**
```javascript
{
"code": 0,
"message": {},
"result":
[
{
"name":"ETH_BTC",
"bid":"0.05075249",
"ask":"0.05075451",
"open":"0.04799996",
"high":"0.05086171",
"low":"0.047891",
"last":"0.05068996",
"volume":"71.7808779340174791",
"deal":"1446.73007651",
"change":"5"
},
{
...
},
],
"code": 200,
"success": true,
"message": "",
"result": {
"ETH_UAH": {
"at": 1650542464,
"ticker": {
"name": "ETH_UAH",
"bid": "101275.50569145",
"ask": "101564.13835842",
"open": "100285.81312762",
"high": "101579.95341111",
"low": "97265.91569436",
"last": "101335.47031808",
"vol": "13.78367282",
"deal": "1365777.629861316184",
"change": "1"
}
}
}
}
```
</details>
### Specific Public Ticker Data
#### Specific Public Ticker Data
<details open>
<summary>
This method provides information via GET
</summary>
```java
GET /api/v1/public/ticker
```
`GET` /api/v1/public/ticker
```java
curl -X GET "https://api.qmall.io/api/v1/public/ticker?market=BTC_USDT" -H "accept: application/json"
```
**Request Parameters:**
Name | Type | Mandatory | Description
------------ | ------------ | ------------ | ------------
Name | Type | Mandatory | Description |
------------ | ------------ | ------------ | ------------ |
market | STRING | YES | Any Public Market
**Request:**
```javascript
{
market: ETH_BTC
}
```
*url exapmle
```
/api/v1/public/ticker?market=ETH_BTC
```
**Response Parameters:**
Name | Type |
------------ | ------------
---- | ---- |
name | STRING |
bid | STRING |
ask | STRING |
......@@ -618,9 +535,7 @@ volume | STRING |
deal | STRING |
change | STRING |
**Response:**
**Response samples:**
```javascript
{
"code": 0,
......@@ -642,48 +557,44 @@ change | STRING |
],
}
```
</details>
### List of Order Book
#### List of Order Book
<details open>
<summary>
This method provides information via GET and POST
</summary>
```java
GET /api/v1/public/book
```
`GET` /api/v1/public/book
```java
curl -X GET "https://api.qmall.io/api/v1/public/book?market=BTC_USDT&side=sell&offset=0&limit=1" -H "accept: application/json"
```
**Request Parameters:**
Name | Type | Mandatory | Description
------------ | ------------ | ------------ | ------------
Name | Type | Mandatory | Description |
------------ | ------------ | ------------ | ------------ |
market | STRING | YES | Any Public Market
side | STRING | YES | buy / sell
offset | NUMERIC | NO | Default 0
limit | NUMERIC | NO | Default 50; min 1; max 1000
**Request:**
**Request in body POST method:**
```javascript
```java
{
market: "ETH_BTC"
side: "sell"
offset: 0
limit: 100
"market": "ETH_BTC"
"side": "sell"
"offset": 0
"limit": 100
"request": "/api/v1/public/book",
"nonce": 1636733702330
}
```
url exapmle
```
/api/v1/public/book?market=ETH_BTC&side=sell&offset=0&limit=1
```
**Response Parameters:**
......@@ -702,7 +613,7 @@ takerFee | STRING |
dealStock | STRING |
dealMoney | STRING |
**Response:**
**Response samples:**
```javascript
{
"code":200,
......@@ -737,48 +648,103 @@ dealMoney | STRING |
},
}
```
</details>
### Market History Data
#### Market History
<details open>
<summary>
This method provides information via GET and POST
</summary>
```java
GET /api/v1/public/history
```
`GET` /api/v1/public/history/result
```java
curl -X GET "https://api.qmall.io/api/v1/public/history?market=BTC_USDT&lastId=1&limit=10'" -H "accept: application/json"
```
**Request Parameters:**
Name | Type | Mandatory | Description
------------ | ------------ | ------------ | ------------
market | STRING | YES | Any Public Market
since | NUMERIC | YES | Min 1; Market History Since Selected `tid`
lastId | NUMERIC | YES | last Id
limit | NUMERIC | NO | Default 50; min 1; max 1000
**Request:**
**Request in body POST method:**
```javascript
{
"market":"BTC_USDT",
"lastId":1,
"limit":10,
"request":"/api/v1/public/history",
"nonce":1650541053626
}
```
**Response samples:**
```javascript
"response": {
"success": true,
"message": "",
"result": [
{
"id": 265,
"time": 1533292963.202649,
"price": "2",
"type": "sell",
"amount": "1"
},
{
market: "ETH_BTC"
since: 1
limit: 100
"id": 263,
"time": 1533292880.088096,
"price": "2",
"type": "sell",
"amount": "1"
},
{...}
]
}
```
url exapmle
</details>
#### Market History Data
<details open>
<summary>
This method provides information via GET and POST
</summary>
```java
GET /api/v1/public/history/result
```
```java
curl -X GET 'https://api.qmall.io/api/v1/public/history/result?market=BTC_USDT&since=1&limit=20' -H "accept: application/json"
```
/api/v1/public/history/result?market=ETH_BTC&since=1&limit=20
**Request Parameters:**
Name | Type | Mandatory | Description |
------------ | ------------ | ------------ | ------------ |
market | STRING | YES | Any Public Market
since | NUMERIC | YES | Min 1; Market History Since Selected `tid`
limit | NUMERIC | NO | Default 50; min 1; max 1000
**Request in body POST method:**
```java
{
"market":"LTC_ETH",
"since":1,
"limit":20,
"request":"/api/v1/public/history/result",
"nonce":1650541233074
}
```
**Response Parameters:**
Name | Type |
------------ | ------------
------------ | ------------ |
tid | NUMERIC |
date | NUMERIC |
price | STRING |
......@@ -786,7 +752,6 @@ type | STRING |
amount | STRING |
total | STRING |
**Response:**
```javascript
[
......@@ -806,25 +771,66 @@ total | STRING |
</details>
#### Public Products List
<details open>
<summary>
This method provides information via GET
</summary>
### Public Pair List
```java
GET /api/v1/public/products
```
```java
curl -X GET "https://api.qmall.io/api/v1/public/products" -H "accept: application/json"
```
**Response:**
```javascript
response: {
success: true,
message: "",
result: [
{
"id": "ETH_BTC",
"fromSymbol": "ETH",
"toSymbol": "BTC"
},
{
"id": "OCC_BTC",
"fromSymbol": "OCC",
"toSymbol": "BTC"
},
{...}
]
}
```
</details>
#### Public Symbols List
<details open>
<summary>
This method provides information via GET and POST
</summary>
```java
GET /api/v1/public/symbols
```
`GET` /api/v1/public/symbols
```java
curl -X GET "https://api.qmall.io/api/v1/public/symbols" -H "accept: application/json"
```
**Response Parameters:**
Name | Type |
------------ | ------------
----- | ----- |
Pair | STRING |
Request in body POST method:
```java
{
"request":"/api/v1/public/symbols",
"nonce":1650541438785
}
```
**Response:**
```javascript
......@@ -844,44 +850,38 @@ Pair | STRING |
]
}
```
</details>
### Depth List
#### Depth List
<details open>
<summary>
This method provides information via GET and POST
</summary>
```java
GET /api/v1/public/depth/result
```
`GET` /api/v1/public/depth/result
```java
curl -X GET "https://api.qmall.io/api/v1/public/depth/result?market=BTC_USDT&limit=5" -H "accept: application/json"
```
**Request Parameters:**
Name | Type | Mandatory | Description
------------ | ------------ | ------------ | ------------
Name | Type | Mandatory | Description |
------------ | ------------ | ------------ | ------------ |
market | STRING | YES | Any Public Market
limit | NUMERIC | NO | Default 50; min 1; max 1000
**Request:**
```javascript
**Request in body POST method:**
```JSON
{
market: "ETH_BTC"
limit: 100
"market": "ETH_BTC",
"limit": 100,
"request": "/api/v1/public/depth/result",
"nonce": 1650541438785
}
```
url exapmle
```
/api/v1/public/depth/result?market=ETH_BTC&limit=2
```
**Response Parameters:**
......@@ -891,9 +891,8 @@ type | STRING | asks (sell) / bids (buy)
price | STRING | 1st parametr - in left side currency
amount | STRING |2st parametr - in left side currency
**Response:**
```javascript
```java
{
"asks":
[
......@@ -922,21 +921,20 @@ amount | STRING |2st parametr - in left side currency
</details>
### List of Graphic Data KLine
#### List of Graphic Data KLine
<details open>
<summary>
This method provides information via GET and POST
</summary>
```java
GET /api/v1/public/kline
```
`GET` /api/v1/public/kline
```java
curl -X GET "https://api.qmall.io/api/v1/public/kline?market=BTC_USDT&start=1650210446&end=1650390446&interval=60" -H "accept: application/json"
```
**Request Parameters:**
Name | Type | Mandatory | Description
------------ | ------------ | ------------ | ------------
market | STRING | YES | Any Public Market
......@@ -944,22 +942,18 @@ start | NUMERIC | YES | unixtime from
end | NUMERIC | YES | unixtime to
interval | NUMERIC | NO | Default 60; min 60; max 604800 sec
**Request:**
**Request in body POST method:**
```javascript
{
market: "ETH_BTC"
start: 1601359005
end: 1601389005
interval: 60
"market": "ETH_BTC",
"start": 1601359005,
"end": 1601389005,
"interval": 60,
"request": "/api/v1/public/kline",
"nonce": 1650541438785
}
```
url exapmle
```
/api/v1/public/kline?market=ETH_BTC&start=1619695680&end=1619699280&interval=60
```
**Response Parameters:**
......@@ -1005,24 +999,42 @@ market | STRING |
}
}
```
</details>
</details>
## Private Data Methods
---
### Private Data Methods
<details open>
<summary>
First of all to use POST methods check how to made [HTTP Authorization](#http-authorization)
Use next methods via POST and obtain full information
All of this methods can be use only with POST. Before using check [HTTP Authorization](#http-authorization)
</summary>
### Create new Limit Order
#### 1. Market API
<details open>
<summary> </summary>
#### Create new Limit Order
<details open>
<summary>
This method provides information via POST
</summary>
```java
POST /api/v1/order/new
```
`POST` /api/v1/order/new
```java
curl --location --request POST 'https://api.qmall.io/api/v1/order/new' \
--header 'Content-Type': 'application/json' \
--header 'X-TXC-APIKEY': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-PAYLOAD': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-SIGNATURE': '0000000000XXXXXXXXXXXXXXXXX' \
--data-raw '{"market":"BTC_USDT","lastId":1,"limit":10,"request":"/api/v1/public/history","nonce":1650473825200}'
```
**Request Parameters:**
Name | Type | Mandatory | Description
......@@ -1043,13 +1055,12 @@ nonce | STRING | YES | A number that is always greater than the previous request
"side" : "sell",
"amount" : "0.1",
"price" : "0.1",
"nonce": "1636733702330"
"nonce": 1636733702330
}
```
**Response Parameters:**
Name | Type | Description
------------ | ------------ | ------------
orderId | STRING | ID of placed order
......@@ -1092,18 +1103,24 @@ dealFee | STRING | Deal Fee of Order
</details>
### Cancel Order
#### Cancel Order
<details open>
<summary>
This method provides information via POST
</summary>
```java
POST /api/v1/order/cancel
```
`POST` /api/v1/order/cancel
```java
curl --location --request POST 'https://api.qmall.io/api/v1/order/cancel' \
--header 'Content-Type': 'application/json' \
--header 'X-TXC-APIKEY': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-PAYLOAD': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-SIGNATURE': '0000000000XXXXXXXXXXXXXXXXX' \
--data-raw '{"market":"BTC_USDT","lastId":1,"limit":10,"request":"/api/v1/public/history","nonce":1650473825200}'
```
**Request Parameters:**
Name | Type | Mandatory | Description
......@@ -1120,13 +1137,12 @@ nonce | STRING | YES | A number that is always greater than the previous request
"request": "/api/v1/order/cancel",
"market": "ETH_BTC",
"orderId": 25749,
"nonce": "1636733702330"
"nonce": 1636733702330
}
```
**Response Parameters:**
Name | Type | Description
------------ | ------------ | ------------
orderId | STRING | ID of placed order
......@@ -1169,20 +1185,24 @@ dealFee | STRING | Deal Fee of Order
</details>
### My Active Orders
#### My Active Orders
<details open>
<summary>
This method provides information via POST
</summary>
```java
POST /api/v1/orders
```
`POST` /api/v1/orders
```java
curl --location --request POST 'https://api.qmall.io/api/v1/orders' \
--header 'X-TXC-APIKEY': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-PAYLOAD': '0000000000XXXXXXXXXXXXXXXXX==' \
--header 'X-TXC-SIGNATURE': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'Content-Type': 'application/json' \
--data-raw '{"market":"BTC_USDT","lastId":1,"limit":10,"request":"/api/v1/public/history","nonce":1650473825200}'
```
**Request Parameters:**
Name | Type | Mandatory | Description
......@@ -1201,13 +1221,12 @@ nonce | STRING | YES | A number that is always greater than the previous request
"market": "ETH_BTC",
"offset": 10,
"limit": 100,
"nonce": "1636733702330"
"nonce": 1636733702330
}
```
**Response Parameters:**
Name | Type | Description
------------ | ------------ | ------------
orderId | STRING | ID of placed order
......@@ -1224,7 +1243,6 @@ makerFee | STRING | Order Maker Fee
left | STRING | Order left amount - shows how much left in order; if = 0 - order finished
dealFee | STRING | Deal Fee of Order
**Response:**
```javascript
{
......@@ -1259,45 +1277,54 @@ dealFee | STRING | Deal Fee of Order
}
}
```
</details>
</details>
#### 2. Account API
<details open>
<summary>
</summary>
### My All Trade Balances
#### My All Trade Balances
<details open>
<summary>
This method provides information via POST
</summary>
```java
POST /api/v1/account/balances
```
`POST` /api/v1/account/balances
```java
curl --location --request POST 'https://api.qmall.io/api/v1/account/balances' \
--header 'X-TXC-APIKEY': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-PAYLOAD': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-SIGNATURE': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'Content-Type': 'application/json' \
--data-raw '{"market":"BTC_USDT","lastId":1,"limit":10,"request":"/api/v1/public/history","nonce":1650473825200}'
```
**Request Parameters:**
**Request Parameters:**
Name | Type | Mandatory | Description
------------ | ------------ | ------------ | ------------
request | STRING | YES | A request path without the domain name
nonce | STRING | YES | A number that is always greater than the previous request’s nonce number
**Request:**
```javascript
{
"request": "/api/v1/account/balances",
"nonce": "1636733702330"
"nonce": 1636733702330
}
```
**Response Parameters:**
Name | Type | Description
------------ | ------------ | ------------
available | NUMERIC | Amount without active orders
freeze | STRING | active orders amount
**Response:**
```javascript
{
......@@ -1321,36 +1348,97 @@ freeze | STRING | active orders amount
}
}
```
</details>
### My Specific Trade Balance
#### My Specific Trade Balance
<details open>
<summary>
This method provides information via POST
</summary>
```java
POST /api/v1/account/balance
```
`POST` /api/v1/account/balance
```java
curl --location --request POST 'https://api.qmall.io/api/v1/account/balance' \
--header 'X-TXC-APIKEY': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-PAYLOAD': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-SIGNATURE': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'Content-Type': 'application/json' \
--data-raw '{"market":"BTC_USDT","lastId":1,"limit":10,"request":"/api/v1/public/history","nonce":1650473825200}'
```
**Request Parameters:**
Name | Type |
------------ | ------------
request | STRING | YES | A request path without the domain name
currency | STRING
nonce | STRING | YES | A number that is always greater than the previous request’s nonce number
**Request:**
```javascript
{
"request": "/api/v1/account/balance",
"currency": "ETH",
"nonce": "1636733702330"
"nonce": 1636733702330
}
```
**Response Parameters:**
Name | Type | Description
------------ | ------------ | ------------
available | NUMERIC | Amount without active orders
freeze | STRING | active orders amount
**Response:**
```javascript
{
"success": true,
"message": "",
"result":
{
"available": "8990",
"freeze": "0"
}
}
```
</details>
#### Get My Order Info
<details open>
<summary>
This method provides information via POST
</summary>
```java
POST /api/v1/account/order
```
```java
curl --location --request POST 'https://api.qmall.io/api/v1/account/order' \
--header 'X-TXC-APIKEY': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-PAYLOAD': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-SIGNATURE': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'Content-Type': 'application/json' \
--data-raw '{"market":"BTC_USDT","lastId":1,"limit":10,"request":"/api/v1/public/history","nonce":1650473825200}'
```
**Request Parameters:**
Name | Type | Mandatory | Description
------------ | ------------ | ------------ | ------------
request | STRING | YES | A request path without the domain name
market | STRING | YES | Any Market
offset | STRING | NO | Default: 0
limit | NUMERIC | NO | Default: 50
nonce | STRING | YES | A number that is always greater than the previous request’s nonce number
**Request:**
```javascript
{
"request": "/api/v1/account/order",
"market": "ETH_BTC",
"offset": 10,
"limit": 100,
"nonce": 1636733702330
}
```
......@@ -1358,8 +1446,15 @@ nonce | STRING | YES | A number that is always greater than the previous request
Name | Type | Description
------------ | ------------ | ------------
available | NUMERIC | Amount without active orders
freeze | STRING | active orders amount
time | NUMERIC | Trade Time
fee | STRING | Trade Fee
price | STRING | Trade Price
amount | STRING | Trade amount in 1st Ticker of Pair
Id | NUMERIC | User ID
dealOrderId | NUMERIC | Trade ID
role | NUMERIC | Trade Role: Taker or Maker
deal | STRING | Trade amount in 2st Ticker of Pair.
**Response:**
```javascript
......@@ -1368,28 +1463,43 @@ freeze | STRING | active orders amount
"message": "",
"result":
{
"available": "8990",
"freeze": "0"
"offset": 0,
"limit": 50,
"records":
{
"time": 1533310924.935978,
"fee": "0",
"price": "80.22761599",
"amount": "2.12687945",
"id": 548,
"dealOrderId": 1237,
"role": 1,
"deal": "170.6344677716224055"
}
}
}
```
</details>
### Get My Order Info
#### Get My Trades Info
<details open>
<summary>
This method provides information via POST
</summary>
```java
POST /api/v1/account/trades
```
`POST` /api/v1/account/order
```java
curl --location --request POST 'https://api.qmall.io/api/v1/account/trades' \
--header 'X-TXC-APIKEY': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-PAYLOAD': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-SIGNATURE': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'Content-Type': 'application/json' \
--data-raw '{"market":"BTC_USDT","lastId":1,"limit":10,"request":"/api/v1/public/history","nonce":1650473825200}'
```
**Request Parameters:**
Name | Type | Mandatory | Description
------------ | ------------ | ------------ | ------------
request | STRING | YES | A request path without the domain name
......@@ -1399,14 +1509,13 @@ limit | NUMERIC | NO | Default: 50
nonce | STRING | YES | A number that is always greater than the previous request’s nonce number
**Request:**
```javascript
{
"request": "/api/v1/account/order",
"market": "ETH_BTC",
"offset": 10,
"limit": 100,
"nonce": "1636733702330"
"nonce": 1636733702330
}
```
......@@ -1426,7 +1535,6 @@ deal | STRING | Trade amount in 2st Ticker of Pair.
**Response:**
```javascript
{
{
"success": true,
"message": "",
......@@ -1448,24 +1556,29 @@ deal | STRING | Trade amount in 2st Ticker of Pair.
}
}
```
</details>
### My Order History
#### My Order History
<details open>
<summary>
This method provides information via POST
</summary>
```java
POST /api/v1/account/order_history_list
```
`POST` /api/v1/account/order_history_list
```java
curl --location --request POST 'https://api.qmall.io/api/v1/account/order_history' \
--header 'X-TXC-APIKEY': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-PAYLOAD': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'X-TXC-SIGNATURE': '0000000000XXXXXXXXXXXXXXXXX' \
--header 'Content-Type': 'application/json' \
--header 'Cookie': 'JSESSIONID=280523DF04A70E6B5' \
--data-raw '{"request":"/api/v1/account/order_history","offset":0,"limit":100,"nonce":1650536118818}'
```
**Request Parameters:**
Name | Type | Mandatory | Description
------------ | ------------ | ------------ | ------------
request | STRING | YES | A request path without the domain name
......@@ -1482,7 +1595,7 @@ nonce | STRING | YES | A number that is always greater than the previous request
"market": "ETH_BTC",
"offset": 10,
"limit": 100,
"nonce": "1636733702330"
"nonce": 1636733702330
}
```
......@@ -1505,7 +1618,6 @@ dealStock | STRING | Order Amount in 1st Ticker of Pair
dealMoney | STRING | Order Amount in 2st Ticker of Pair
marketName | STRING | Market of placed order
**Response:**
```javascript
{
......@@ -1540,13 +1652,24 @@ marketName | STRING | Market of placed order
}
```
</details>
</details>
</details>
</details>
# WebSoket Protocol API
---
## WebSoket Protocol API
<details open>
<summary>
The API is based on JSON RPC of Websocket protocol.
Repeated subscription will be cancelled for the same data type.
</summary>
### Detailed information
<details open>
<summary> </summary>
**System Methods**
......@@ -1567,48 +1690,43 @@ Repeated subscription will be cancelled for the same data type.
* [Trade Users Balances Methods](#trade-user-balances-methods) - used to get the balances of the user from which the request is made (the change comes after updating the value of any balance)
* [Active Orders and Orders History Methods](#active-orders-and-orders-history-methods) - used to get active orders and their history for a specific user from which the request is made (the change comes after placing, canceling, executing, changing an order)
**Private Methods:**
This method provides information via `POST`. The response will return all the information that was posted by the platform. To obtain private information, use the same methods via `POST` as an authorized user using api keys.
- [List of Public Pairs](#list-of-public-pairs) - returns the history of trades for all public pairs - used for tracking to compare prices in the market, control positions for many markets at once.
- [Specific Public Ticker Data](#specific-public-ticker-data) - returns the trading history for a specific selected pair - used to track a specific pair and track its key characteristics.
- [List of Order Book](#list-of-order-book) - Returns all positions for a specific market for all orders of the order book in the selected direction with pagination - used for full monitoring of the order book status, its changes, evaluation of its placed orders and their priority.
- [Market History Data](#market-history-data) - returns the history of trading on the market - used to track your own or someone else's executed orders, trading dynamics, control over buying / selling.
- [Market History Data](#market-history-data) - returns the history of trading on the market - used to track your own or someone else is executed orders, trading dynamics, control over buying / selling.
- [Public Pair List](#public-pair-list) - returns all public pairs - used to track new pairs, monitor pairs for MM.
- [Depth List](#depth-list) - returns data on the order book with pagination for a specific pair - used to track the depth of the order book, control placed orders, monitor the market in light mode.
- [List of Graphic Data KLine](#list-of-graphic-data-kline) - returns data on charts - is used to create personal charts, control market trends.
</details>
---
## Web-Soket Authorization
### Common methods
<details open>
<summary>
</summary>
<summary> </summary>
#### Web-Soket Authorization
<details open>
<summary> </summary>
**Request:**
**Method**
```
```java
server.auth
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
Token | STRING | Personal user token ( check [HTTP Authorization](#http-authorization) )
Source | STRING | Defoult: web; Max: 30 bytes; Custom configuration for understendong source of web-soket info
**Request**
```javascript
{
......@@ -1622,16 +1740,12 @@ Source | STRING | Defoult: web; Max: 30 bytes; Custom configuration for underste
}
```
**Response Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
Status | STRING | Success - auth compleated
**Response:**
```javascript
{
......@@ -1646,16 +1760,16 @@ Status | STRING | Success - auth compleated
error: null
}
```
</details>
## Basic WS structure
#### Basic WS structure
<details open>
<summary> </summary>
**Request**
* Endpoint
```
```java
wss://qmall.io/ws
```
......@@ -1665,17 +1779,14 @@ method | STRING |
params | ARRAY |
id | INTEGER |
**Response**
Name | Type | Success | Error
------------ | ------------ | ------------ | ------------
result | JSON Object | Response | Failure
Error | JSON Object | NULL | Failure
id | Integer | Integer | Integer
**Notify**
Name | Type |
......@@ -1684,7 +1795,6 @@ method | STRING |
params | ARRAY |
id | NULL |
**General error code:**
* invalid argument
......@@ -1694,13 +1804,13 @@ id | NULL |
* service timeout
* require authentication
</details>
## PING-PONG Method
#### PING-PONG Method
<details open>
<summary>
</summary>
**Method**
```
server.ping
......@@ -1715,7 +1825,6 @@ server.ping
}
```
**Response Parameters:**
Name | Type |
......@@ -1724,8 +1833,6 @@ result | STRING |
ID | NUMERIC |
Error | NULL |
**Response:**
```javascript
{
......@@ -1734,15 +1841,13 @@ Error | NULL |
"id": 1000
}
```
</details>
## System Time Method
#### System Time Method
<details open>
<summary>
</summary>
**Request:**
**Method**
......@@ -1759,7 +1864,6 @@ server.time
}
```
**Response Parameters:**
Name | Type |
......@@ -1768,8 +1872,6 @@ result | TimeStamp, INTEGER |
ID | NUMERIC |
Error | NULL |
**Response:**
```javascript
{
......@@ -1778,19 +1880,19 @@ Error | NULL |
"id": 1000
}
```
</details>
</details>
# KLine methods for Graph
### KLine Query Method
### KLine methods for Graph
<details open>
<summary>
</summary>
#### KLine Query Method
<details open>
<summary>
</summary>
**Method**
```
......@@ -1817,7 +1919,6 @@ interval | NUMERIC |
}
```
**Response Parameters:**
Name | Type |
......@@ -1831,8 +1932,6 @@ volume | STRING |
amount | STRING |
market | STRING |
**Response:**
```javascript
{
......@@ -1853,10 +1952,9 @@ market | STRING |
"id": 1000
}
```
</details>
### KLine Subscribe Method
#### KLine Subscribe Method
<details open>
<summary>
</summary>
......@@ -1886,15 +1984,12 @@ interval | NUMERIC |
}
```
**Response Parameters:**
```
kline.update
```
Name | Type |
------------ | ------------
time | TimeStamp, INTEGER |
......@@ -1906,8 +2001,6 @@ volume | STRING |
amount | STRING |
market | STRING |
**Response:**
```javascript
......@@ -1929,19 +2022,14 @@ market | STRING |
"id": null
}
```
</details>
### KLine Unsubscribe Method
#### KLine Unsubscribe Method
<details open>
<summary>
</summary>
**Method**
```
kline.unsubscribe
```
......@@ -1955,16 +2043,17 @@ kline.unsubscribe
}
```
</details>
</details>
## Market Price Methods
### Market Price Query Method
### Market Price Methods
<details open>
<summary>
</summary>
#### Market Price Query Method
<details open>
<summary>
</summary>
**Method**
```
......@@ -1977,7 +2066,6 @@ Name | Type | Descriprion |
------------ | ------------ | ------------
market | STRING | Can be few markets per request
**Request:**
```javascript
{
......@@ -1990,16 +2078,12 @@ market | STRING | Can be few markets per request
}
```
**Response Parameters:**
Name | Type |
------------ | ------------
market | STRING |
price | STRING |
**Response:**
```javascript
{
......@@ -2012,10 +2096,9 @@ price | STRING |
"id":111
}
```
</details>
### Market Price Subscribe Method
#### Market Price Subscribe Method
<details open>
<summary>
</summary>
......@@ -2025,14 +2108,11 @@ price | STRING |
price.subscribe
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | Can be few markets per request
**Request:**
```javascript
{
......@@ -2046,20 +2126,15 @@ market | STRING | Can be few markets per request
```
**Response Parameters:**
```
price.update
```
Name | Type |
------------ | ------------
market | STRING |
price | STRING |
**Response:**
```javascript
{
......@@ -2072,19 +2147,14 @@ price | STRING |
"id":null
}
```
</details>
### Market Price Unsubscribe Method
#### Market Price Unsubscribe Method
<details open>
<summary>
</summary>
**Method**
```
price.unsubscribe
```
......@@ -2098,16 +2168,17 @@ price.unsubscribe
}
```
</details>
</details>
## Market Status Methods
### Market status Query Method
### Market Status Methods
<details open>
<summary>
</summary>
#### Market status Query Method
<details open>
<summary>
</summary>
**Method**
```
......@@ -2115,14 +2186,11 @@ state.query
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | Any exchange market
period | NUMERIC | Default: 86400
**Request:**
```javascript
{
......@@ -2136,9 +2204,7 @@ period | NUMERIC | Default: 86400
}
```
**Response Parameters:**
Name | Type |
------------ | ------------
period | NUMERIC |
......@@ -2150,7 +2216,6 @@ close | STRING |
high | STRING |
deal | STRING |
**Response:**
```javascript
{
......@@ -2169,10 +2234,9 @@ deal | STRING |
"id": 111
}
```
</details>
### Market Status Subscribe Method
#### Market Status Subscribe Method
<details open>
<summary>
</summary>
......@@ -2182,16 +2246,12 @@ deal | STRING |
state.subscribe
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | Any exchange market
period | NUMERIC | Default: 86400
**Request:**
```javascript
{
......@@ -2206,14 +2266,11 @@ period | NUMERIC | Default: 86400
```
**Response Parameters:**
```
state.update
```
**Response Parameters:**
Name | Type |
------------ | ------------
period | NUMERIC |
......@@ -2225,7 +2282,6 @@ close | STRING |
high | STRING |
deal | STRING |
**Response:**
```javascript
{
......@@ -2244,19 +2300,14 @@ deal | STRING |
"id": null
}
```
</details>
### Market Status Unsubscribe Method
#### Market Status Unsubscribe Method
<details open>
<summary>
</summary>
**Method**
```
state.unsubscribe
```
......@@ -2270,11 +2321,15 @@ state.unsubscribe
}
```
</details>
</details>
## Deals Methods
### Deals Methods
<details open>
<summary>
</summary>
### Deals Query Method
#### Deals Query Method
<details open>
<summary>
</summary>
......@@ -2286,12 +2341,10 @@ deals.query
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | Can be few markets per request
**Request:**
```javascript
{
......@@ -2305,9 +2358,7 @@ market | STRING | Can be few markets per request
}
```
**Response Parameters:**
Name | Type |
------------ | ------------
type | NUMERIC |
......@@ -2343,10 +2394,9 @@ price | STRING |
"id": 111
}
```
</details>
### Deals Subscribe Method
#### Deals Subscribe Method
<details open>
<summary>
</summary>
......@@ -2357,13 +2407,10 @@ deals.subscribe
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | Can be few markets per request
**Request:**
```javascript
{
......@@ -2378,14 +2425,11 @@ market | STRING | Can be few markets per request
```
**Response Parameters:**
```
deals.update
```
**Response Parameters:**
Name | Type |
------------ | ------------
type | NUMERIC |
......@@ -2394,7 +2438,6 @@ id | NUMERIC |
amount | STRING |
price | STRING |
**Response:**
```javascript
{
......@@ -2421,19 +2464,15 @@ price | STRING |
"id": null
}
```
</details>
### Deals Unsubscribe Method
#### Deals Unsubscribe Method
<details open>
<summary>
</summary>
**Method**
```
deals.unsubscribe
```
......@@ -2447,16 +2486,17 @@ deals.unsubscribe
}
```
</details>
</details>
## Depth Methods
### Depth Query Method
### Depth Methods
<details open>
<summary>
</summary>
#### Depth Query Method
<details open>
<summary>
</summary>
**Method**
```
......@@ -2464,7 +2504,6 @@ depth.query
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | Any market pair
......@@ -2485,9 +2524,7 @@ interval | STRING | Defoult: 1, No interval: 0, Step: 1
}
```
**Response Parameters:**
Name | Type |
------------ | ------------
type | STRING |
......@@ -2519,10 +2556,9 @@ price | STRING |
"id": 111,
}
```
</details>
### Depth Subscribe Method
#### Depth Subscribe Method
<details open>
<summary>
</summary>
......@@ -2533,7 +2569,6 @@ depth.subscribe
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | Any market pair
......@@ -2555,14 +2590,11 @@ interval | STRING | Defoult: 1, No interval: 0, Step: 1
```
**Response Parameters:**
```
depth.update
```
**Response Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
clean | BOOLEAN | FALSE: returned latest result, TRUE - no updates
......@@ -2573,8 +2605,6 @@ Type | String | Order type
Amount | String | order amount in 1st Ticker
Price | String | order price in 1st Ticker
**Response:**
```javascript
{
......@@ -2603,19 +2633,14 @@ Price | String | order price in 1st Ticker
"id": null
}
```
</details>
### Depth Unsubscribe Method
#### Depth Unsubscribe Method
<details open>
<summary>
</summary>
**Method**
```
depth.unsubscribe
```
......@@ -2629,18 +2654,18 @@ depth.unsubscribe
}
```
</details>
</details>
## Trade User Balances Methods
Need to authorize first [Web-Soket Authorization](#web-soket-authorization)
### Asset Query Method
### Trade User Balances Methods
<details open>
<summary>
Need to authorize first
</summary>
#### Asset Query Method
<details open>
<summary>
</summary>
**Method**
```
......@@ -2648,12 +2673,10 @@ asset.query
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
asset list | STRING | Null: for all; Asset List: for choosed
**Request:**
```javascript
{
......@@ -2666,17 +2689,13 @@ asset list | STRING | Null: for all; Asset List: for choosed
}
```
**Response Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | Asset name
available | NUMERIC | Amount without active orders
freeze | STRING | active orders amount
**Response:**
```javascript
{
......@@ -2688,10 +2707,9 @@ freeze | STRING | active orders amount
}
```
</details>
### Asset Subscribe Method
#### Asset Subscribe Method
<details open>
<summary>
</summary>
......@@ -2702,7 +2720,6 @@ asset.subscribe
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
asset list | STRING | Null: for all; Asset List: for choosed
......@@ -2721,12 +2738,10 @@ asset list | STRING | Null: for all; Asset List: for choosed
```
**Response Parameters:**
```
asset.update
```
**Response Parameters:**
Name | Type | Description |
......@@ -2735,8 +2750,6 @@ market | STRING | Asset name
available | NUMERIC | Amount without active orders
freeze | STRING | active orders amount
**Response:**
```javascript
[
......@@ -2753,19 +2766,14 @@ freeze | STRING | active orders amount
]
```
</details>
### Asset Unsubscribe Method
#### Asset Unsubscribe Method
<details open>
<summary>
</summary>
**Method**
```
asset.unsubscribe
```
......@@ -2780,18 +2788,17 @@ asset.unsubscribe
```
</details>
---
## Active Orders and Orders History Methods
Need to authorize first [Web-Soket Authorization](#web-soket-authorization)
### Order Query Method
### Active Orders and Orders History Methods
<details open>
<summary>
Need to authorize first
</summary>
#### Order Query Method
<details open>
<summary> </summary>
**Method**
```
......@@ -2799,7 +2806,6 @@ order.query
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | For all pairs: ""; Special: Choosed Pair
......@@ -2820,9 +2826,7 @@ limit | INTEGER | Defoult: 1, No interval: 0, Step: 1
}
```
**Response Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
algorithm | INTEGER | Spot: 0; Margin: 1
......@@ -2846,7 +2850,6 @@ user | INTEGER | - User ID
**Response:**
```javascript
{
id: 6,
params:
......@@ -2886,13 +2889,10 @@ user | INTEGER | - User ID
}
}
```
</details>
### Order History Method
#### Order History Method
<details open>
<summary>
</summary>
......@@ -3004,7 +3004,7 @@ user | INTEGER | - User ID
```
</details>
### Order Subscribe Method
#### Order Subscribe Method
<details open>
<summary>
</summary>
......@@ -3015,7 +3015,6 @@ order.subscribe
```
**Request Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
market | STRING | For all pairs: ""; Special: Choosed Pair
......@@ -3033,15 +3032,11 @@ limit | INTEGER | Defoult: 1, No interval: 0, Step: 1
"id":6
}
```
</details>
```
order.update
```
**Response Parameters:**
Name | Type | Description |
------------ | ------------ | ------------
algorithm | INTEGER | Spot: 0; Margin: 1
......@@ -3092,16 +3087,12 @@ result:
```
</details>
### Order Unsubscribe Method
#### Order Unsubscribe Method
<details open>
<summary>
</summary>
**Method**
```
order.unsubscribe
```
......@@ -3115,3 +3106,4 @@ order.unsubscribe
}
```
</details>
</details>