基本信息
API 基本信息
- 接口可能需要用户的 API Key,如何创建API-KEY请参考这里
- 本篇列出接口的 base URL 有:
- 上述列表的最后4个接口 (
api1-api4) 可能会提供更好的性能,但其稳定性略为逊色。因此,请务必使用最适合您现有配置的那款。 - 所有接口的响应都是 JSON 格式。
- 响应中如有数组,数组元素以时间升序排列,越早的数据越提前。
- 所有时间、时间戳均为UNIX时间,单位为毫秒。
HTTP 返回代码
- HTTP
4XX错误码用于指示错误的请求内容、行为、格式。问题在于请求者。 - HTTP
403错误码表示违反WAF限制(Web应用程序防火墙)。 - HTTP
409错误码表示重新下单(cancelReplace)的请求部分成功。(比如取消订单失败,但是下单成功了) - HTTP
429错误码表示警告访问频次超限,即将被封IP。 - HTTP
418表示收到429后继续访问,于是被封了。 - HTTP
5XX错误码用于指示Binance服务侧的问题。
接口错误代码
- 使用接口
/api/v3, 以及/sapi/v1/margin时, 每个接口都有可能抛出异常;
API 与 SAPI 的错误代码返回形式如下:
{
"code": -1121,
"msg": "Invalid symbol."
}
- 具体的错误码及其解释在 错误代码.
接口的基本信息
GET方法的接口, 参数必须在query string中发送。POST,PUT, 和DELETE方法的接口,参 数可以在内容形式为application/x-www-form-urlencoded的query string中发送,也可以在request body中发送。 如果你喜欢,也可以混合这两种方式发送参数。- 对参数的顺序不做要求。
- 但如果同一个参数名在query string和request body中都有,query string中的会被优先采用。
访问限制
访问限制基本信息
-
以下 是
intervalLetter作为头部值:- SECOND => S
- MINUTE => M
- HOUR => H
- DAY => D
-
在
/api/v3/exchangeInforateLimits数组中包含与交易的有关RAW_REQUESTS,REQUEST_WEIGHT和ORDERS速率限制相关的对象。这些在限制种类 (rateLimitType)下的枚举定义部分中进一步定义。 -
违反任何一个速率限制时(访问频次限制或下单速率限制),将返回429。
IP 访问限制
- 每个请求将包含一个
X-MBX-USED-WEIGHT-(intervalNum)(intervalLetter)的头,其中包含当前IP所有请求的已使用权重。 - 每一个接口均有一个相应的权重(weight),有的接口 根据参数不同可能拥有不同的权重。越消耗资源的接口权重就会越大。
- 收到429时,您有责任停止发送请求,不得滥用API。
- 收到429后仍然继续违反访问限制,会被封禁IP,并收到418错误码
- 频繁违反限制,封禁时间会逐渐延长,从最短2分钟到最长3天。
Retry-After的头会与带有418或429的响应发送,并且会给出以秒为单位的等待时长(如果是429)以防止禁令,或者如果是418,直到禁令结束。- 访问限制是基于IP的,而不是API Key
###下单频率限制
- 每个成功的下单回报将包含一个
X-MBX-ORDER-COUNT-(intervalNum)(intervalLetter)的头,其中包含当前账户已用的下单限制数量。 - 当下单数超过限制时,会收到带有429但不含
Retry-After头的响应。请检查GET api/v3/exchangeInfo的下单频率限制 (rateLimitType = ORDERS) 并等待封禁时间结束。 - 被拒绝或不成功的下单并不保证回报中包含以上头内容。
- 下单频率限制是基于每个账户计数的。
- 用户可以通过接口
GET api/v3/rateLimit/order来查询当前的下单量.
WEB SOCKET 连接限制
- Websocket服务器每秒最多接受5个消息。消息包括:
- PING帧
- PONG帧
- JSON格式的消息, 比如订阅, 断开订阅.
- 如果用户发送 的消息超过限制,连接会被断开连接。反复被断开连接的IP有可能被服务器屏蔽。
- 单个连接最多可以订阅 1024 个Streams。
- 每IP地址、每5分钟最多可以发送300次连接请求。
/api/ 与 /sapi/ 接口限频说明
/api/*接口和 /sapi/*接口采用两套不同的访问限频规则, 两者互相独立。
-
/api/*的接口相关:- 按IP和按UID(account)两种模式分别统计, 两者互相独立。
- 以
/api/*开头的接口按IP限频,且所有接口共用每分钟6,000限制。 - 每个请求将包含一个
X-MBX-USED-WEIGHT-(intervalNum)(intervalLetter)的头,包含当前IP所有请求的已使用权重。 - 每个成功的下单回报将包含一个
X-MBX-ORDER-COUNT-(intervalNum)(intervalLetter)的头,其中包含当前账户已用的下单限制数量。
-
/sapi/*的接口相关:- 按IP和按UID(account)两种模式分别统计, 两者互相独立。
- 以
/sapi/*开头的接口采用单接口限频模式。按IP统计的权重单接口权重总额为每分钟12000;按照UID统计的单接口权重总额是每分钟180000。 - 每个接口会标明是按照IP或者按照UID统计, 以及相应请求一次的权重值。
- 按照IP统计的接口, 请求返回头里面会包含
X-SAPI-USED-IP-WEIGHT-1M=<value>或X-SAPI-USED-IP-WEIGHT-1S=<value>, 包含当前IP所有请求已使用权重。 - 按照UID统计的接 口, 请求返回头里面会包含
X-SAPI-USED-UID-WEIGHT-1M=<value>或X-SAPI-USED-UID-WEIGHT-1S=<value>, 包含当前账户所有已用的UID权重。
数据来源
- 因为API系统是异步的, 所以返回的数据有延时很正常, 也在预期之中。
- 在每个接口中,都列出了其数据的来源,可以用于理解数据的时效性。
系统一共有3个数据来源,按照更新速度的先后排序。排在前面的数据最新,在后面就有可能存在延迟。
- 撮合引擎 - 表示数据来源于撮合引擎
- 缓存 - 表示数据来源于内部或者外部的缓存
- 数据库 - 表示数据直接来源于数据库
请求鉴权类型
- 每个接口都有一个鉴权类型,指示所需的 API 密钥权限,显示在接口名称旁边(例如,下新订单 (TRADE))。
- 如果未指定,则鉴权类型为
NONE。 - 除了为
NONE外,所有具有鉴权类型的接口均视为SIGNED请求(即包含signature),listenKey 管理 除外。 - 具有鉴权类型的接口需要提供有效的 API 密钥并验证通过。
- API 密钥可在您的 Binance 账户的 API 管理 页面创建。
- API 密钥和密钥对均为敏感信息,切勿与他人分享。 如果发现账户有异常活动,请立即撤销所有密钥并联系 Binance 支持。
- API 密钥可配置为仅允许访问某些鉴权接口。
- 例如,您可以拥有具有
TRADE权限的 API 密钥用于交易, 同时使用具有USER_DATA权限的另一个 API 密钥来监控订单状态。 - 默认情况下,API 密钥无法进行
TRADE,您需要先在 API 管理中启用交易权限。
- 例如,您可以拥有具有
| 鉴权类型 | 描述 |
|---|---|
| NONE | 不需要鉴权的接口 |
| TRADE | 需要有效的 API-Key 和签名 |
| MARGIN | 需要有效的 API-Key 和签名 |
| USER_DATA | 需要有效的 API-Key 和签名 |
| USER_STREAM | 需要有效的 API-Key |
| MARKET_DATA | 需要有效的 API-Key |
需要签名的接口
- 调用
SIGNED接口时,除了接口本身所需的参数外,还需要在query string或request body中传递signature, 即签名参数。
签名是否是大小写敏感的
- HMAC: 使用 HMAC 生成的签名不区分大小写。这意味着无论字母大小写如何,签名字符串都可以被验证。
- RSA: 使用 RSA 生成的签名是大小写敏感的。
- Ed25519: 使用 Ed25519 生成的签名也是大小写敏感的。
请参阅已签名请求示例 (HMAC)、已签名请求示例 (RSA) 和已签名请求示例 (Ed25519),了解如何根据您使用的 API 密钥类型计算签名。
时间同步安全
SIGNED请求还需要一个timestamp参数,该参数应为当前时间戳,单位为毫秒或微秒。(参见 通用 API 信息)- 另一个可选参数
recvWindow,用以指定请求的有效期,只能以毫秒为单位。recvWindow扩展为三位小数(例如 6000.346),以便可以指定微秒。- 如果未发送
recvWindow,则 默认值为 5000 毫秒。 recvWindow的最大值为 60000 毫秒。
- 请求处理逻辑如下:
serverTime = getCurrentTime()
if (timestamp < (serverTime + 1 second) && (serverTime - timestamp) <= recvWindow) {
// 开始处理请求
serverTime = getCurrentTime()
if (serverTime - timestamp) <= recvWindow {
// 将请求转发到撮合引擎
} else {
// 拒绝请求
}
// 结束处理请求
} else {
// 拒绝请求
}
关于交易时效性
互联网状况并不100%可靠,不可完全依赖,因此你的程序本地到币安服务器的时延会有抖动.
这是我们设置recvWindow的目的所在,如果你从事高频交易,对交易时效性有较高的要求,可以灵活设置recvWindow以达到你的要求。
不推荐使用5秒以上的recvWindow。最大值不能超过60秒!
POST /api/v3/order 的签名示例
HMAC Keys
不使用分隔符,把查询字符串与 HTTP body 连接在一起将生成请求的签名 payload。任何非 ASCII 字符在签名前都必须进行百分比编码(percent-encoded)。
以下示例分步演示如何使用 echo、openssl 和 curl 从 Linux 命令行发送有效的签名 payload。其中一个例子中的交易对名称完全由 ASCII 字符组成,另一个例子中的交易对名称则包含非 ASCII 字符。
API 密钥和密钥示例:
| Key | Value |
|---|---|
apiKey | vmPUZE6mv9SD5VNHk4HlWFsOr6aKE2zvsw0MuIgwCIPy6utIco14y7Ju91duEh8A |
secretKey | NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j |
警告:请勿与任何人分享您的 API 密钥和秘钥。
此处提供的示例密钥仅用于示范说明目的。
交易对名称完全由 ASCII 字符组成的请求示例:
| 参数 | 取值 |
|---|---|
symbol | LTCBTC |
side | BUY |
type | LIMIT |
timeInForce | GTC |
quantity | 1 |
price | 0.1 |
recvWindow | 5000 |
timestamp | 1499827319559 |
交易对名称包含非 ASCII 字符的请求示例:
| 参数 | 取值 |
|---|---|
symbol | 123456 |
side | BUY |
type | LIMIT |
timeInForce | GTC |
quantity | 1 |
price | 0.1 |
recvWindow | 5000 |
timestamp | 1499827319559 |
第一步: 构建签名 payload。
- 将参数格式化为
参数=取值对并用&分隔每个参数对。 - 对字符串进行百分比编码(percent-encoded)。
对于第一组示例参数(仅限 ASCII 字符), parameter=value 字符串将如下所示:
symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559
对字符串进行百分比编码(percent-encoded)后,签名 payload 如下所示:
symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559
对于第二组示例参数(包含一些 Unicode 字符),parameter=value 字符串将如下所示:
symbol=123456&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559
对字符串进行百分比编码(percent-encoded)后,签名 payload 如下所示:
symbol=%EF%BC%91%EF%BC%92%EF%BC%93%EF%BC%94%EF%BC%95%EF%BC%96&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559
第二步: 计算签名。
- 使用 API 密钥中的
secretKey作为 HMAC-SHA-256 算法的签名密钥。 - 对步骤 1 中构建的签名 payload 进行签名。
- 将 HMAC-SHA-256 的输出编码为十六进制字符串。
请注意,secretKey 和 payload 是大小写敏感的,而生成的签名值是不区分大小写的。
示例命令
对于第一组示例参数(仅限 ASCII 字符):
$ echo -n "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559" | openssl dgst -sha256 -hmac "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71
对于第二组示例参数(包含一些 Unicode 字符):
$ echo -n "symbol=%EF%BC%91%EF%BC%92%EF%BC%93%EF%BC%94%EF%BC%95%EF%BC%96&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559" | openssl dgst -sha256 -hmac "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
e1353ec6b14d888f1164ae9af8228a3dbd508bc82eb867db8ab6046442f33ef3
第三步: 为请求添加签名
通过在查询字符串中添加 signature 参数来完成请求。
对于第一组示例参数(仅限 ASCII 字符):
curl -s -v -H "X-MBX-APIKEY: $apiKey" -X POST "https://api.binance.com/api/v3/order?symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559&signature=c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71"
对于第二组示例参数(包含一些 Unicode 字符):
curl -s -v -H "X-MBX-APIKEY: $apiKey" -X POST "https://api.binance.com/api/v3/order?symbol=%EF%BC%91%EF%BC%92%EF%BC%93%EF%BC%94%EF%BC%95%EF%BC%96&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559&signature=e1353ec6b14d888f1164ae9af8228a3dbd508bc82eb867db8ab6046442f33ef3"
以下是一个执行上述所有步骤的 Bash 脚本示例:
apiKey="vmPUZE6mv9SD5VNHk4HlWFsOr6aKE2zvsw0MuIgwCIPy6utIco14y7Ju91duEh8A"
secretKey="NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
payload="symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559"
# 对请求进行签名
signature=$(echo -n "$payload" | openssl dgst -sha256 -hmac "$secretKey")
signature=${signature#*= } # Keep only the part after the "= "
# 发送请求
curl -H "X-MBX-APIKEY: $apiKey" -X POST "https://api.binance.com/api/v3/order?$payload&signature=$signature"
RSA Keys
不使用分隔符,把查询字符串与 HTTP body 连接在一起将生成请求的签名 payload。任何非 ASCII 字符在签名前都必须进行百分比编码(percent-encoded)。
要获取 API 密钥,您需要将 RSA 公钥上传到您的帐户中,系统将为您提供相应的 API 密钥。
仅支持 PKCS#8 密钥。
在以下示例中,其中一个例子中的交易对名称完全由 ASCII 字符组成,另一个例子中的交易对名称则包含非 ASCII 字符。
这些示例假设私钥存储在文件 ./test-prv-key.pem 中。
| Key | Value |
|---|---|
apiKey | CAvIjXy3F44yW6Pou5k8Dy1swsYDWJZLeoK2r8G4cFDnE9nosRppc2eKc1T8TRTQ |
交易对名称完全由 ASCII 字符组成的请求示例:
| 参数 | 取值 |
|---|---|
symbol | BTCUSDT |
side | SELL |
type | LIMIT |
timeInForce | GTC |
quantity | 1 |
price | 0.2 |
timestamp | 1668481559918 |
recvWindow | 5000 |