Skip to content
Bogdan Khanbekov edited this page Apr 8, 2022 · 1 revision

Особенности работы с KuCoin API

Здесь описаны особенности, которых нет в документации KuCoin API, или которые плохо раскрыты в ней.

[TOC]

Замечание по запросам к REST API

Если Вы отправляете запрос, имеющий тело (например, выставляете ордер), то не забудьте указать заголовок Content-Length, в который нужно вписать размер тела запроса в байтах. Если пропустить этот заголовок, то KuCoin будет думать, что тела запроса нет. Но, т.к. тело запроса нужно для подписи KC-API-SIGN, то KuCoin будет возвращать ошибку, что у Вас неправильный KC-API-SIGN.

Аккаунты

У KuCoin есть разделение на несколько аккаунтов (счётов), под разные цели.

  • Основной счет (Main Accout, main в API) - используется для депозита криптовалюты, снятия средств со счета, покупок с помощью кредита/дебита и маржинального кредитования.
  • Торговый счет (Trading Account, trade в API) - используется для торговли криптовалютой.
  • Маржинальный счет (Cross Margin Account) - используется для маржинального заимствования и торговли.
  • Фьючерсный счет (Isolated Margin Account) - используется для торговли фьючерсами.
  • Финансовый счет (Financial Account) - используется для ставок и финансового управления, с годовой доходностью до 20 %.

Получение баланса

Для получения баланса удобно использовать два эндпоинта: [List Accounts](List Accounts - Список аккаунтов) и [Get an Account](Get an Account - информация об аккаунте)

List Accounts - Список аккаунтов

Получить список баланса всех валют по всем аккаунтам, вместе с их id.

HTTP REQUEST

GET /api/v1/accounts

Параметры запроса:

Параметр Тип Описание
currency String Тикер криптовалюты (примеры: BTC, USDT, MANA ...)
type String Тип аккаунта (main, trade, margin)
Responce JSON
{
  "code": "200000",
  "data": [
    {
      "id": "5bd6e9286d99522a52e458de", // id аккаунта (счёта)
      "currency": "BTC",		// Тикер криптовалюты
      "type": "main",			// Тип аккаунта
      "balance": "0.02023349",  	// Полный баланс (avalible + holds)
      "available": "0.02023349",	// Доступные средства (на них можно выставить ордер)
      "holds": "0"			// Заблокированные средства (например, в ордере)
    },
    {
      "id": "5bd6e9286d99522a52e458df",
      "currency": "USDT",
      "type": "main",
      "balance": "611.72436265",
      "available": "611.72436265",
      "holds": "0"
    },
    {
      "id": "5bd6e9286d99522a52e487a4",
      "currency": "BTC",
      "type": "trade",
      "balance": "0.004588",
      "available": "0",
      "holds": "0.004588"
    },
    {
      "id": "5bd6e9286d99522a52e454b",
      "currency": "USDT",
      "type": "trade",
      "balance": "0.28357853",
      "available": "0.28357853",
      "holds": "0"
    }
  ]
}

Get an Account - информация об аккаунте

Получить баланс аккаунта по его id.

HTTP REQUEST

GET /api/v1/accounts/{accountId}

Пример

GET /api/v1/accounts/5bd6e9286d99522a52e458de

Параметры запроса:

Параметр Тип Описание
accountId String id аккаунта (счёта)
Responce JSON
{
  "code": "200000",
  "data": {
    "currency": "BTC",		// Тикер криптовалюты
    "balance": "0.02023349",  	// Полный баланс (avalible + holds)
    "available": "0.02023349",	// Доступные средства (на них можно выставить ордер)
    "holds": "0"		// Заблокированные средства (например, в ордере)
  }
}

Websockets

У KuCoin есть веб-сокеты с несколькими особенностями, которые не встречались на других биржах. А именно:

  1. Динамический эндпоинт веб-сокетов
  2. Токен, нужный для подключения к веб-сокету
  3. Клиент должен пинговать веб-сокет

Получение данных для подключения к Websocket

Для подключения к публичному и к приватному веб-сокету нужно запросить данные через эндпоинт.

Для публичных веб-сокетов это /api/v1/bullet-public.

Для приватных веб-сокетов это /api/v1/bullet-private.

Responce JSON (одинаковый для публичных и приватных веб-сокетов)

{
  "code": "200000",
  "data": {
    "token": "2neAiuYvAU61ZDXANAGAsiL4-iAExhsBXZxftpOeh_55i3Ysy2q2LEsEWU64mdzUOPusi34M_wGoSf7iNyEWJ5Es6hC8cW1uNyUdELSkUKlNtT8FV-7ZmNiYB9J6i9GjsxUuhPw3BlrzazF6ghq4L9AYYIi9KubB5bcOOJFpfsI=.4B_50gn3tpPBinEg8J45lw==",
    "instanceServers": [
      {
        "endpoint": "wss://ws-api.kucoin.com/endpoint",
        "encrypt": true,
        "protocol": "websocket",
        "pingInterval": 18000,
        "pingTimeout": 10000
      }
    ]
  }
}

Динамичный эндпоинт

Эндпоинт вебсокетов меняется время от времени (это не влияет на уже активные соединения), поэтому его нужно получать через REST API KuCoin.

Токен для подключения к веб-сокету

Для подключения к веб-сокету нужно получить token - это строка символов, которую выдает KuCoin. Её нужно запросить через REST API KuCoin. Если нужно подключаться и к публичным, и к приватным веб-сокетам, то нужно получить только приватный token , и создать подключение к приватному веб-сокету. Через него можно подписываться как на публичные, так и на приватные потоки.

Непосредственно подключение

URL для подключения образуется по такому шаблону, он одинаковый для публичных и приватных веб-сокетов:

wss://{endpoint}?token={token} 

{endpoint} - вставить эндпоинт, полученный из bullet

{token} - вставить токен, полученный из bullet

Для подписки на поток нужно послать JSON по веб-сокету :

{
    "id": 1545910660739,                          // Уникальный id потока (задается Вами, можно просто 1, 2, 3, или использовать timestamp)
    "type": "subscribe",
    "topic": "/market/ticker:BTC-USDT,ETH-USDT",  // Поток, на который подписываеся
    "privateChannel": false,                      // Приватный канал или нет (если указать  false для приватного, то сообщения не будут приходить, ошибки также не будет!)
    "response": true                              // Должен ли сервер прислать информацию об успешной подписке
}

Ping

KuCoin требует, чтобы клиент пинговал его. То есть если Вы собираетесь подключиться к веб-сокету, нужно будет пинговать его раз в 10-20 секунд, иначе соединение будет разорвано. Рекомендуемое время между пингом смотрите в поле pingInterval. Если pingInterval будет превышен в два раза, KuCoin разорвет соединение.

Пинговать нужно вне зависимости от того, пересылаются данные по веб-сокету или нет.