# 基本信息
# 1. 介绍
· 根据API的分类,大多数接口需要Api Key才可以访问 ,请前往用户中心->API管理 创建你的授权应用APP 来获取Api Key与Api Secret Key 。
· 请妥善保管好Api Key与Api Secret Key , 如果不小心泄露了,请立即删除对应的授权应用APP;
# 2. 应用权限
· 权限有三个维度:模块、行为、资源 ,请妥善配置好你的权限增加安全性并以便管理 ;
# 2.1 模块:
基础模块;账户模块;现货模块;现货行情模块;
其他模块也会在未来版本逐次提供;
# 2.2行为:
查询 可以对模块查询对应的数据;
例如:查询现货模块的成交历史、查询账户模块的划转记录;
提交 可以对模块提交相应的业务请求;
例如: 现货模块的下币币委托订单、账户模块的提交划转申请;
请注意:在API Key与Api Secret Key 泄露的情况下,如果该授权应用配置了[查询]权限,则有泄露该模块数据的风险;
如果授权了[提交]权限,则有该模块的资金安全风险,所以需要谨慎配置!
# 2.3资源权限
针对于每个模块的业务不同,支持对应的资源权限隔离;
模块名称 | 资源权限类型 |
---|---|
账户模块 | 币种 例如:USDT、BTC、ETH 等 |
现货模块 | 交易对 例如 BTC/USDT 、ETH/USDT 等 |
... | ... 具体请参考每个接口中的[资源隔离类型] |
例如:现货模块配置【BTC/USDT】资源权限后,该应用的Api Key 在现货模块只有该交易对的【查询或提交】权限;无法操作查询其他交易对;
# 3. 接入指南
# 3.1 Api基本信息
1. 接口base URL
- https://api.starex.com
2. 所有的接口响应都是JSON格式
3. 无论是请求\响应 ,所有的时间、时间戳均为UNIX时间戳,单位为毫秒;
4. GET请求中,所有的参数都通过request params 传递 ;
POST请求中,所有的参数都通过request body 传递 ;
# 3.2 鉴权
服务器通过自定义请求头来鉴定接收到的请求是否有效并有权限;
请在每个需要鉴权的请求头中,按照鉴权约定填充它们;
键(key) | 值(value) | 备注 |
---|---|---|
STAREX-APP-KEY-V1 | 你授权应用的Api Key | 服务器用于识别你的授权应用 |
STAREX-SIGNATURE | 按照约定的算法计算输出的签名 | 服务器用于校验你的请求是否健康完整 |
STAREX-TIMESTAMP | 你的请求的时间戳 | 服务器用于校验你的请求是否有网络波动延迟 |
STAREX-TIMEOFFSET | 你所能接受的网络波动延迟(毫秒) | 选填,默认为3000毫秒 |
# 3.2.1 签名
调用绝大多数接口时,都需要进行签名,以便服务器校验接受到的请求没有被抓包篡改;
StarEX Open API签名采用 HmacSHA256算法进行签名;
a. 获取你的接口请求参数; 得到String param;
GET请求为你的request prams , POST请求为request body;
如果没有请求参数,则param为空字符串"";
b. 使用请求参数以拼接字符串的形式拼接你的请求时间戳 ; 得到HmacSHA256 content;
String hmacContent = param + String.valueOf(timestamp) ;
c. 使用你的Api Secret Key作为作为HmacSHA256的密钥,对HmacContent进行加密, 并将得到的结果进行hexDesign(输出为十六进制);
String hmacResult = HmacUtils.sha256(hmacContent,secretKey);
String signature = HexUtils.parse(hmacResult);
d. 将得到的签名,与APP Key、时间戳正确地放入请求头(Request Header)中,再发起你的请求;
# 3.2.2 时间同步安全
请求头中的STAREX-TIMESTAMP为请求发起时的UNIX时间戳;
服务器收到请求时会判断请求中的时间戳,如果是3000毫秒之前发出的,则请求会被认为无效。
这个时间的允许偏移值可以通过发送可选参数 STAREX-TIMEOFFSET 来定义;
由于网络波动或是其他不可控原因,请求到达服务器前可能会在网络层面就消耗许多时间 ;
在某些接口或特定场景下,你可能会对调用发起的时效要求比较高;
例如场景: 我希望我的下单请求在一秒钟内到达服务器,否则则丢弃请求;
在此场景下,你可以通过灵活设置请求头中的 STAREX-TIMEOFFSET=1000 来达到你的要求;
# 3.3 限制
# 3.3.1 访问限制
每个Api Key都有不同的访问权限,其中包括不同的模块/行为/资源权限,具体请查阅本文档中【介绍 --> 应用权限】
# 3.3.2 IP限制
在授权应用绑定了IP的场景下,有且仅有这些IP能够成功访问API ;
# 3.3.3 速率限制 (callLimits)
· 每个接口都需要通过消耗callLimits来正确的访问API ;根据API的业务复杂度或者是对系统的压力,消耗的callLimits也不同,具体参考每个接口;
· 所有接口消耗的callLimits是共公的;也就是说它们会互相受到速率限制的影响;
· 每个Api Key 每分钟恢复 24000 callLimits ;
· 在超频调用后,服务器会以httpStatus:418 返回超频调用警告,并且在一段时间内持续警告;您的应用在收到超频调用警告后,有必要也有义务对自己的调用频率进行降频;
· 同一Api Key进行多次超频警告后,服务器会转为httpStatus: 429 超频封禁。封禁是临时的,从最短1小时到最长7天不等,您需要在解封前处理您的调用或整改您的程序,然后再正确的发起调用;
# 3.4 调用示例
以下示例中, 假定你的Api Key为 "abcd" , Api Secret Key 为 "test" , 你的请求时间戳为 "1234567890" ;
# 示例1:查询划转记录
GET https://api.starex/v1/account/transfer/page?coin=USDT&from=EXCHANGE
其中请求参数为: "coin=USDT&from=EXCHANGE" (字符串,不需要URLEncode)
- 将它拼接你的请求时间戳, 得到HmacSHA256 Content : "coin=USDT&from=EXCHANGE1234567890" ;
- 再用你的Api Secret Key "test" 作为HmacSHA256 Secret Key 进行运算得到HmacResult ;
- 将HmacResult转Hex(十六进制) 得到签名;
String content = "coin=USDT&from=EXCHANGE1234567890";
String apiSecretKey = "test";
String hamc256Result = HmacUtils.sha256(content,secretKey);
String signature = HexUtils.parse(hexContent);
得到签名结果 "58c47be0d1119874dbeabe7af16a0c0fb6901d700bc7d10adcc85ff95f9d452f" , 并放入请求头STAREX-SIGNATURE中;
最后的请求为:
curl -X GET
-H "STAERX_APP_KEY_V1:abcd"
-H "STAREX-TIMESTAMP:1234567890"
-H "STAREX-SIGNATURE:58c47be0d1119874dbeabe7af16a0c0fb6901d700bc7d10adcc85ff95f9d452f"
"http://api.starex/v1/account/transfer/page?coin=USDT&from=EXCHANGE"
# 示例2:提交划转申请
POST https://api.starex/v1/account/transfer/submit
{
"amount":"1",
"coin":"USDT",
"from":"EXCHANGE",
"to":"OTC"
}
其中请求参数为: {"amount":"1","coin":"USDT","from":"EXCHANGE","to":"OTC"} (压缩过后的JSON字符串)
将它拼接你的请求时间戳,得到HmacSHA256 Content : {"amount":"1","coin":"USDT","from":"EXCHANGE","to":"OTC"}1234567890
再用你的Api Secret Key "test" 作为HmacSHA256 Secret Key 进行运算并进行Hex 得到签名:
String content = "{\"amount\":\"1\",\"coin\":\"USDT\",\"from\":\"EXCHANGE\",\"to\":\"OTC\"}1234567890";
String secretKey = "test";
String hamc256Result = HmacUtils.sha256(content,secretKey);
String signature = HexUtils.encode(hexContent);
得到签名结果 "3c908c790a0dcc1a308b66afc542472845f178c4e7303daa68301dcd4cf5eac9" , 并放入请求头STAREX-SIGNATURE中;
最后的请求为:
curl -X POST
-H "STAREX-APP-KEY-V1:abcd"
-H "STAREX-TIMESTAMP:1234567890"
-H "STAREX-SIGNATURE:3c908c790a0dcc1a308b66afc542472845f178c4e7303daa68301dcd4cf5eac9"
-d "{\"amount\":\"1\",\"coin\":\"USDT\",\"from\":\"EXCHANGE\",\"to\":\"OTC\"}"
"https://api.starex/v1/account/transfer/submit"
更新日志 →