简介
欢迎使用LBANK API! 你可以使用此 API 获得合约市场行情数据,进行交易,并且管理你的账户。此文档是v1版本的,会持续更新。
接口是提供服务的基础,API分为账户、交易和行情三类。开发者在网站创建账号后,可以根据自身需求建立不同权限的API,并利用API进行自动交易或者提现。
账户和交易API需要身份验证,提供下单、撤单,查询订单和帐户信息等功能。行情API提供市场的行情数据,所有行情接口都是公开的。
流程
开发者如需使用API ,请先申请API key,并勾选合约权限等信息 点击申请API Key,然后根据此文档详情进行开发,使用过程中如有问题或者建议请及时反馈。
API Key包括以下两个部分
API Key
API访问密钥Secret Key
签名认证加密所使用的密钥(仅申请时可见)
LBank支持RSA和HmacSHA256两种签名方式
- RSA方案是基于数学困难问题的数字签名方案,是非对称密码的身份认证方案。发送方对消息报文、用户私钥等进行约定的编码与运算得到数字签名。接收方通过数字签名、用户注册公钥来确定身份与消息报文的完整性。相对地,由于在RSA方案的验证过程中,接收方无需发送者的私钥信息,可以保证有且只有发送方能发送合法消息。由于使用非对称加密技术,RSA安全性较高,但加解密速度较慢。
- HMAC方案是基于hash函数的消息认证方案,是对称模式的密码方案。发送方对消息报文、共享密钥等进行约定的编码与运算后得出消息认证码。接收方通过该消息认证码来确定发送方身份与消息报文的完整性。HMAC方案基于hash函数具有高安全性和高效性等特点,其加解密速度较快,但由于其密钥需要在客户端和服务端之间共享,因此安全性没有RSA高。
用户可根据自己的实际使用需求,选择不同的签名认证方式。
接入说明
接入URL
rest
https://lbkperp.lbank.com/
Websocket
wss://lbkperpws.lbank.com/ws
接口分类
公共接口:/cfd/openApi/v1/pub
私有接口:/cfd/openApi/v1/prv (需要认证访问)
签名认证
API 请求在通过 internet 传输的过程中极有可能被篡改,为了确保请求未被更改,除公共接口(基础信息,行情数据)外的私有接口均必须使用您的 API Key 做签名认证,以校验参数或参数值在传输途中是否发生了更改。每一个API Key需要有适当的权限才能访问相应的接口。每个新创建的API Key都需要分配权限。权限类型分为:交易,只读,和提现。在使用接口前,请查看每个接口的权限类型,并确认你的API Key有相应的权限。
请求头设置
post请求,请求头信息中 contentType 需要统一设置为: 'application/json'。
contentType:'application/json'
请求头增加timestamp
参数,您发出请求的时间戳(毫秒),如:1567833674095。在查询请求中包含此值有助于防止第三方截取您的请求。建议通过 /cfd/openApi/v1/pub/getTime API接口获取。
请求头增加signature_method
参数,RSA/HmacSHA256,目前两种都支持。
请求头增加echostr
参数,该参数为字母和数字字符串,长度30到40间。
签名流程(如何生成API请求参数中的sign
)
1. 准备待签名字符串:
每个API中所需的请求参数,去除sign
,再加上signature_method
,timestamp
,echostr
三个参数(这三个参数需要和header中的保持一致),组成了需要参与签名的字符串。同时,待签名字符串要求按照参数名进行排序(首先比较所有参数名的第一个字母,按abcd顺序排列,若遇到相同首字母,则看第二个字母, 以此类推。)以下使用prv/account接口,并以Java代码作为举例,所需签名的字符串为
string parameters="api_key=fb4e39e5-6a06-4291-9f80-d10176a0badd&asset=USDT&echostr=echostr123456789012345678901234567890&productGroup=SwapU&signature_method=HmacSHA256×tamp=1665990154559"
2. 待签名字符串转成所有字符大写的MD5摘要:
将parameters
转成MD5摘要,并将所有字符转换成大写
string preparedStr = DigestUtils.md5Hex(parameters).toUpperCase()
3. 签名:
使用RSA或者HmacSHA256方式,以及api_key对应的secret key,对preparedStr
进行签名,得到最终的sign
。
RSA方式(signature_method = RSA):
使用api_key对应的secret key,通过RSA使用SHA256算法对preparedStr
做一次签名(用Base64编码),并将最终的签名结果赋值于参数sign
。可参考shell中的Java代码。
RSA示例:
public static String RSA_Sign(String preparedStr, String secretKey) {
try {
PrivateKey priKey = getPrivateKey(secretKey);
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(priKey);
signature.update(content.getBytes(CharEncoding.UTF_8));
byte[] signed = signature.sign();
return new String(Base64.getEncoder().encode(signed));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static PrivateKey getPrivateKey(String key) {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(key));
PrivateKey privateKey = null;
try {
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
privateKey = keyFactory.generatePrivate(keySpec);
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
}
return privateKey;
}
HmacSHA256方式(signature_method = HmacSHA256):
使用api_key对应的secret key,对preparedStr
进行哈希运算,并将最终的签名结果赋值于参数sign
。可参考shell中的Java代码。
HmacSHA256示例:
public static String HmacSHA256_Sign(String preparedStr, String secretKey) {
String hash = "";
try {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
hash = byteArrayToHexString(bytes);
} catch (Exception e) {
e.printStackTrace();
}
return hash;
}
提交
将签名后的得到的sign
,以及其他所需参数提交。以prv/account
接口举例,需要提交的参数为:
api_key=fb4e39e5-6a06-4291-9f80-d10176a0badd&asset=USDT&echostr=echostr123456789012345678901234567890&productGroup=SwapU&signature_method=HmacSHA256×tamp=1665990154559
sign=809133cb69a17beba0be076b99b4d90de872476e36da87978ab2889970ccd06d
请求格式
所有的API请求都以GET或者POST形式发出。
并且所有请求头都包含设置三个参数Content-Type:application/json、timestamp:1665990154559、signature_method:RSA、echostr:echostr123456789012345678901234567890。
所有get请求的参数都在路径参数里,RSA方式需要urlencode一下,避免签名后字符串中特殊字符被转义为空格。post 以json提交
返回格式
参数名称 | 数据类型 | 描述 |
---|---|---|
result | boolean | API接口返回结果,true/false |
error_code | string | 接口返回错误码 |
msg | string | 接口返回消息 |
data | object | 接口返回数据主体 |
测试账号
String privateKey = "093F44F700FC48F17DDB67390C895CE5";
String apikey = "fb4e39e5-6a06-4291-9f80-d10176a0badd"
String signature_method = "HmacSHA256";
错误码
错误代码 | 详情描述 |
---|---|
-99 | 系统异常,请稍后再试 |
0 | 成功 |
2 | 未找到记录 |
3 | 记录已存在 |
4 | 无效动作 |
5 | 无效值 |
7 | 无效Session |
8 | 合约产品不存在 |
9 | 用户不存在 |
11 | 未找到市场数据 |
12 | 字段错误 |
14 | 重复动作 |
18 | 市价订单不能排队 |
20 | 订单到期 |
21 | 订单超过容量 |
22 | 订单已存在 |
24 | 订单不存在 |
25 | 报价不存在 |
26 | 无效的合约产品状态 |
27 | 无效的合约产品状态 |
30 | 没有足够的数量修改 |
31 | 没有足够的持仓,无法平仓 |
32 | 持仓限制 |
33 | 平仓后资产小于零 |
34 | 用户持仓限制 |
35 | 余额不足 |
36 | 资金不足 |
37 | 无效数量 |
44 | 数量不合法 |
48 | 价格不合法 |
49 | 价格超出上限 |
50 | 价格超出下限 |
51 | 没有交易权限 |
52 | 只能平仓 |
54 | 用户没有登陆 |
56 | 没有交易权限 |
58 | 用户不匹配 |
59 | 用户重新登录 |
60 | 无效的用户名或密码 |
62 | 用户无法激活 |
65 | 无效的登陆IP地址 |
71 | 不能操作该订单 |
76 | 订单已经挂起 |
77 | 订单已经激活 |
78 | 订单日期丢失 |
79 | 不支持订单类型 |
80 | 用户无权限 |
88 | 用户不存在 |
99 | 无法为其他用户执行操作 |
100 | 保证金不足 |
118 | 单仪表组合 |
139 | Otc 类型错误 |
172 | 杠杆不足 |
175 | 价格必须大于零 |
176 | 无效的API KEY |
177 | API密钥已过期 |
178 | API密钥限制超出 |
179 | Key Is Null |
180 | 找不到保证金率 |
181 | 重复API Key |
182 | 没有限制价格 |
183 | 超过每秒最大查询计数 |
184 | 订单限额超过 |
185 | 没有足够的开放订单 |
186 | Session 不存在 |
187 | 价格超出卖一价 |
188 | 价格超出买一价 |
189 | 持仓已存在 |
190 | 标记价格误差 |
191 | 记录分析错误 |
192 | 记录重复 |
193 | 超出最大成交量 |
194 | 小于最小成交量 |
195 | 持仓小于最小成交量 |
196 | 禁止交易 |
197 | 费用不存在 |
198 | 持仓数量超出限制 |
199 | 杠杆过高 |
200 | 持仓不足 |
201 | 无法更改Pos类型 |
10001 | 身份认证同步失败 |
10002 | 身份验证参数失去 |
10003 | 身份认证验签失败 |
10004 | 请求超时 |
10005 | 非法参数 |
10006 | 不开放的路径 |
10007 | 认证失败 |
10008 | 秘钥不存在 |
10009 | 没有权限 |
10010 | 无效签名 |
10011 | 重复请求 |
10012 | 请求过于频繁 |
基础数据
获取当前时间
接口地址:/cfd/openApi/v1/pub/getTime
请求方式:GET
请求数据类型:application/x-www-form-urlencoded
响应数据类型:*/*
接口描述:
获取当前时间
请求参数:
暂无
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
data | object | ||
error_code | integer(int32) | integer(int32) | |
msg | string | ||
result | string | ||
success | boolean |
响应示例:
{
"data": {},
"error_code": 0,
"msg": "",
"result": "",
"success": true
}
查询合约信息列表
接口地址:/cfd/openApi/v1/pub/instrument
请求方式:GET
请求数据类型:application/x-www-form-urlencoded
响应数据类型:*/*
接口描述:
查询合约信息列表
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
productGroup | 产品组 | query | true | string |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
baseCurrency | 标的基础货币 | string | |
clearCurrency | 清算币种 | string | |
defaultLeverage | 默认杠杆倍数 | number | |
exchangeID | 交易所代码 | string | |
maxOrderVolume | 最大下单量 | string | |
minOrderCost | 最小下单额 | string | |
minOrderVolume | 最小下单量 | string | |
priceCurrency | 计价币种 | string | |
priceLimitLowerValue | 价格下限 | number | |
priceLimitUpperValue | 价格上限 | number | |
priceTick | 最小变动价位 | number | |
symbol | 交易对 | string | |
symbolName | 交易对名称 | string | |
volumeMultiple | 数量乘数 | number | |
volumeTick | 最小变动量 | number |
响应示例:
[
{
"baseCurrency": "",
"clearCurrency": "",
"defaultLeverage": 0,
"exchangeID": "",
"maxOrderVolume": "",
"minOrderCost": "",
"minOrderVolume": "",
"priceCurrency": "",
"priceLimitLowerValue": 0,
"priceLimitUpperValue": 0,
"priceTick": 0,
"symbol": "",
"symbolName": "",
"volumeMultiple": 0,
"volumeTick": 0
}
]
查询合约行情列表
接口地址:/cfd/openApi/v1/pub/marketData
请求方式:GET
请求数据类型:application/x-www-form-urlencoded
响应数据类型:*/*
接口描述:
查询合约行情列表
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
productGroup | 产品组 | query | true | string |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
highestPrice | 24小时最高价 | string | |
lastPrice | 最新价格 | string | |
lowestPrice | 24小时最低价 | string | |
markedPrice | 标记价格 | string | |
openPrice | 24小时开盘价 | string | |
prePositionFeeRate | 资金费用 | string | |
symbol | 标的代码 | string | |
turnover | 成交金额 | string | |
volume | 24小时数量 | string |
响应示例:
[
{
"highestPrice": "",
"lastPrice": "",
"lowestPrice": "",
"markedPrice": "",
"openPrice": "",
"prePositionFeeRate": "",
"symbol": "",
"turnover": "",
"volume": ""
}
]
获取盘口
接口地址:/cfd/openApi/v1/pub/marketOrder
请求方式:GET
请求数据类型:application/x-www-form-urlencoded
响应数据类型:*/*
接口描述:
获取盘口
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
depth | 深度 | query | true | integer(int32) | |
symbol | 交易对 | query | true | string |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
asks | 买盘 | array | MarketOrderResp |
orders | 订单数量 | integer(int32) | |
price | 价格 | number | |
volume | 数量 | number | |
bids | 卖盘 | array | MarketOrderResp |
orders | 订单数量 | integer(int32) | |
price | 价格 | number | |
volume | 数量 | number | |
symbol | 交易对 | string |
响应示例:
{
"asks": [
{
"orders": 0,
"price": 0,
"volume": 0
}
],
"bids": [
{
"orders": 0,
"price": 0,
"volume": 0
}
],
"symbol": ""
}