Restful API 说明
REST API 简介
Bibox为用户提供了一套全新的API,可以帮用户快速接入Bibox的交易系统,实现程序化交易。
通过API可以实现以下功能:
- 市场行情信息查询(K线、深度、实时成交ticker、24小时行情)
- 账户资产信息查询
- 下单、撤单操作
- 订单信息查询
REST API 请求路径
REST API 签名
使用REST API进行交易、查询资产等操作,需要先申请apikey。
限速策略:对于同一个apikey,api请求限速30次/5秒;对于同一个ip,当一次api请求cmd个数超过15个时,会限速1次/1秒,cmd个数不超过15个不做限速。
申请apikey
- 登陆 https://www.bibox.com/
- 账户信息 -> API
- 根据提示生成 apikey 和 secret,请秘密保存
设置apikey操作权限
- 登陆 https://www.bibox.com/
- 账户信息 -> API -> 编辑
- 设置 apikey 权限
合法请求结构
基于安全考虑,除行情API 外的 API 请求都必须进行签名运算。一个合法的请求由以下几部分组成
- apikey 您申请的 apikey。
- 请求方法体 即请求结构中的
cmds
,REST API支持批量请求,即cmds
可包含多个方法体,每个方法体表示一次独立API请求,每个方法体都有一组用于定义 API 调用的必需参数和可选参数。可以在每个方法的说明中查看这些参数及其含义。 - 签名方法(SignatureMethod) 用户计算签名的基于哈希的协议,此处使用 HmacMD5。
- 签名 签名计算得出的值,用于确保签名有效和未被篡改。请一定注意:签名是对格式化后的
cmds
的值进行签名!
例子
{
"cmds": "[{\"cmd\":\"transfer/assets\",\"body\":{\"select\":1}}]",
"apikey":"5213595xxxxedca0809axxxxxaba7580xxxxxa6",
"sign":"6a21e39e3f68b6fc2227c4074c7e6a6c" //用您的apisecret签名cmds的结果
}
签名步骤
API 请求在通过 Internet 发送的过程中极有可能被篡改。为了确保请求未被更改,我们会要求用户在每个请求中带上签名(行情 API 除外),来校验参数或参数值在传输途中是否发生了更改。
- 规范要计算签名的请求 因为使用 HMAC 进行签名计算时,使用不同内容计算得到的结果会完全不同。所以在进行签名计算前,请先对请求进行规范化处理。下面以查询资产详情请求为例进行说明
{
"cmds":[
{
"cmd":"transfer/assets",
"body":{
"select":1
}
}
],
"apikey":"",
"sign":""
}
- 格式化
cmds
{ "cmds": "[{\"cmd\":\"transfer/assets\",\"body\":{\"select\":1}}]", //js用 JSON.stringify()进行格式化 "apikey":"", "sign":"" }
- 填写您申请的
apikey
{ "cmds": "[{\"cmd\":\"transfer/assets\",\"body\":{\"select\":1}}]", "apikey":"5213595xxxxedca0809axxxxxaba7580xxxxxa6", "sign":"" }
- 使用您申请的apisecret签名
cmds
{ "cmds": "[{\"cmd\":\"transfer/assets\",\"body\":{\"select\":1}}]", "apikey":"5213595xxxxedca0809axxxxxaba7580xxxxxa6", "sign":"6a21e39e3f68b6fc2227c4074c7e6a6c" }
计算签名,将以下两个参数传入加密哈希函数:
要进行签名计算的字符串
"[{\"cmd\":\"transfer/assets\",\"body\":{\"select\":1}}]"
进行签名的密钥(apisecret)
bxxxxxxxxf1236222xxxxxxxxx6d5d76d5xxxxxxxxx
得到签名计算结果
6a21e39e3f68b6fc2227c4074c7e6a6c
完整签名例子
nodejs实现
let CryptoJS = require("crypto-js");
let apikey = "1e01c22ff8c59e9d98d93423817303f0e7c6d79d"; //your apikey
let secret = "1e01c22ff8c59e9d98d93423817303f098d93423"; //your apikey secret
let param = [
{
"cmd": "transfer/assets",
"body": {
"select": 1
}
}
];
let form = {
"cmds": JSON.stringify(param), //格式化param
"apikey": apikey,
"sign": ""
};
let sign = CryptoJS.HmacMD5(form.cmds, secret).toString();//签名cmds
form.sign = sign;
console.log(form)
输出
{
"cmds":"[{\"cmd\":\"transfer/assets\",\"body\":{\"select\":1}}]",
"apikey":"1e01c22ff8c59e9d98d93423817303f0e7c6d79d",
"sign":"86e88a4bc8eedc795b453f121f5894ee"
}
API请求、返回格式说明
Bibox REST API参数规范,支持批量请求,请务必认真阅读。
请求参数
需要apikey的请求格式
// Request { "cmds": JSON.stringify([ // 支持批量请求(cmd设置不同,用来区分返回结果) { "cmd": "orderpending/trade", // 下单 "index": 1234567, "body": { "pair": "BIX_BTC", ... //其他参数 } }, { "cmd": "orderpending/cancelTrade", // 撤单 "body": { "orders_id": 12345 } } ]), "apikey": "**************", // 您的apikey "sign": "**************" // 用您的apisecret签名(序列化后的)cmds的结果 }
不需要apikey的请求格式
// Request { "cmds": JSON.stringify([ // 支持批量请求(cmd设置不同,用来区分返回结果) { "cmd": "api/ticker", // 请求ticker "body": { "pair": "BIX_BTC" } }, { "cmd": "api/depth", // 请求深度 "body": { "pair": "BIX_BTC", "size": 10, } } ]) }
参数解释
字段 | 描述 |
---|---|
cmds | 请求参数封装格式, 数组类型, 使用时必须先序列化,数组中每个元素代表一次独立的API调用 |
cmd | API接口名,请参考API Reference |
body | cmd对应的请求参数,请参考API_Reference |
apikey | 系统给您分配的 apikey |
sign | 使用系统分配给您的 api secret 签名(格式化后的)cmds的结果 |
结果返回
- 请求成功返回
{
"result":[
{
"cmd":"api/pairList",
"result":[
{
"id":1,
"pair":"BIX_BTC"
},
{
"id":2,
"pair":"ETH_BTC"
}
]
}
]
}
- 结果解释
字段 | 描述 |
---|---|
cmd | API接口名,请参考API Reference |
result(外) | 批量请求的返回结果,不保证顺序一致性 |
result(里) | 特定cmd接口对应的返回结果 |
请求失败返回
{ "error":{ "code":"1000", "msg":"something error" } }
结果解释
字段 | 描述 |
---|---|
code | 错误码 |
msg | 错误描述 |
- 批量请求返回
{
"result":[
{ //成功
"cmd":"api/pairList",
"result":[
{
"id":1,
"pair":"BIX_BTC"
},
{
"id":2,
"pair":"ETH_BTC"
}
]
},
{ //失败
"cmd":"api/depth",
"error":{
"code":"1000",
"msg":"something error"
}
}
]
}
请求示例
// Request
let CryptoJS = require("crypto-js");
let request = require("request");
let url = "https://api.bibox.com/v1/transfer";
let apikey = "1e01c22ff8c59e9d98d93423817303f0e7c6d79d"; //your apikey
let secret = "1e01c22ff8c59e9d98d93423817303f098d93423"; //your apikey secret
let param = [
{
"cmd": "transfer/assets",
"body": {
"select": 1
}
}
];
let form = {
"cmds": JSON.stringify(param), //格式化param
"apikey": apikey,
"sign": ""
};
let sign = CryptoJS.HmacMD5(form.cmds, secret).toString();//签名cmds
form.sign = sign;
console.log({url, form})
request.post({url, form }, (error, response, body) => {
if (!error && response && response.statusCode === 200) {
try {
let result = JSON.parse(body);
console.log(result)
} catch (error) {
console.log(error)
}
} else {
console.log(error, response, body);
}
});
请求参数
{
"url":"https://api.bibox.com/v1/transfer",
"form":{
"cmds":"[{\"cmd\":\"transfer/assets\",\"body\":{\"select\":1}}]",
"apikey":"1e01c22ff8c59e9d98d93423817303f0e7c6d79d",
"sign":"86e88a4bc8eedc795b453f121f5894ee"
}
}
返回结果错误
// Response
{
"error":{
"code":"3012",
"msg":"apikey无效"
}
}
返回结果正确
// Response
{
"result":[
{
"result":{
"total_btc":"3.28811692",
"total_cny":"201875.67",
"total_usd":"28847.20",
"assets_list":[
{
"coin_symbol":"BTC",
"BTCValue":"0.21730559",
"CNYValue":"13341.59",
"USDValue":"1906.46",
"balance":"0.21730558",
"freeze":"0.00000000"
},
{
"coin_symbol":"BIX",
"BTCValue":"0.03018417",
"CNYValue":"1853.17",
"USDValue":"264.81",
"balance":"62.68909999",
"freeze":"0.00000000"
}
]
},
"cmd":"transfer/assets"
}
]
}