币安 API 申请的核心流程是:完成 KYC L2 实名 → 进入 币安官网 后台 API 管理页 → 创建密钥 → 设置 IP 白名单 → 在代码中用 HMAC-SHA256 对参数签名调用。整个过程约 15 分钟,密钥创建后立即可用,免费且无每月费用。如果你还没安装币安手机端方便管理 2FA 验证,可以用 币安官方APP 安装安卓版;iPhone 用户参考 iOS安装教程。本文按 4 个部分把申请、签名、报错处理、限频策略讲清,附 Python 和 Node.js 完整代码。
一、申请 API 密钥的前置条件
1. 完成 KYC L2 实名认证
币安 API 要求账号至少完成 L2 中级身份认证(提交身份证 + 人脸识别)。L1 基础认证的账号无法创建 API 密钥。L2 通常 24 小时内审核完成。
2. 启用 2FA(必须)
API 密钥创建过程中需要 2FA 验证码确认。如果还没绑定,先到 安全中心 → 双重身份验证 → Google Authenticator 完成绑定。
3. 充值 / 持仓不强制要求
账户为零余额也可以创建 API 密钥,方便提前准备好密钥再充值。
二、创建 API 密钥(5 个步骤)
第一步:进入 API 管理页
登录 币安官网 → 右上角头像 → API 管理。直接 URL 是 binance.com/zh-CN/my/settings/api-management。
第二步:选择密钥类型
币安提供两种 API 密钥类型:
| 类型 | 用途 | 推荐场景 |
|---|---|---|
| System generated | 系统自动生成密钥对 | 90% 用户首选,简单稳定 |
| Self-generated | 你提供 Ed25519 公钥 | 高级用户,密钥永不离开本地 |
新手选 System generated 即可。
第三步:填写密钥标签
给密钥取个名字(标签),便于以后管理。例如:
python-grid-bot— 网格交易机器人nodejs-monitor— 价格监控脚本quantitative-strategy-v2— 量化策略 v2
标签只对你自己可见,币安不会基于标签做任何区分。
第四步:通过 2FA 验证
输入:
- 邮箱 6 位验证码
- 手机短信 6 位验证码
- Google Authenticator 6 位动态码
三个码都正确后,密钥生成完成。
第五步:保存 Secret Key(关键)
密钥页面会显示:
- API Key:永久可见,可以随时回来查
- Secret Key:只显示这一次,关闭页面后再也看不到
必须立即把 Secret Key 复制到本地安全位置(密码管理器或加密笔记),否则只能删除重建。
三、配置密钥权限和 IP 白名单
密钥创建后,默认所有权限关闭,必须手动启用:
权限选项
| 权限 | 用途 | 风险等级 |
|---|---|---|
| Enable Reading | 查询余额、订单、行情 | 低 |
| Enable Spot & Margin Trading | 现货 / 杠杆下单 | 中 |
| Enable Futures | 合约下单 | 高 |
| Enable Withdrawals | 提币(必须配合 IP 白名单) | 极高 |
| Permits Universal Transfer | 资金账户互转 | 中 |
安全建议:只开启你需要的权限。读取行情数据只勾 Enable Reading;做现货量化只勾 Enable Reading + Enable Spot & Margin Trading;永远不要 在不必要的情况下开启 Enable Withdrawals。
IP 白名单(强烈推荐)
在密钥设置页面填写允许使用此密钥的服务器 IP 地址(最多 5 个)。配置后,只有来自这些 IP 的请求 才能用此密钥操作账户。
如果服务器是动态 IP(家用宽带),可以选择 Unrestricted (Less Secure) 不限制 IP,但权限会自动降级——Enable Withdrawals 在不限制 IP 的密钥上无法启用,这是币安强制的安全规则。
四、生成签名调用 API
币安 REST API 中,所有涉及账户操作的请求都需要签名。签名算法是 HMAC-SHA256。
签名规则
签名内容 = 所有请求参数按 URL 编码后用 & 拼接的字符串
例如查询账户余额的接口:
GET /api/v3/account
参数: timestamp=1712876400000
签名内容: timestamp=1712876400000
签名: HMAC_SHA256(secret_key, "timestamp=1712876400000")
最终请求:
GET /api/v3/account?timestamp=1712876400000&signature=<计算出的签名>
Header: X-MBX-APIKEY: <你的API Key>
Python 完整示例
import hmac, hashlib, time, requests
API_KEY = "你的API Key"
SECRET_KEY = "你的Secret Key"
BASE_URL = "https://api.binance.com"
def sign(params: dict) -> str:
query = "&".join([f"{k}={v}" for k, v in params.items()])
return hmac.new(SECRET_KEY.encode(), query.encode(), hashlib.sha256).hexdigest()
def get_account():
params = {"timestamp": int(time.time() * 1000)}
params["signature"] = sign(params)
headers = {"X-MBX-APIKEY": API_KEY}
r = requests.get(f"{BASE_URL}/api/v3/account", params=params, headers=headers)
return r.json()
print(get_account())
Node.js 完整示例
const crypto = require('crypto');
const axios = require('axios');
const API_KEY = '你的API Key';
const SECRET_KEY = '你的Secret Key';
const BASE_URL = 'https://api.binance.com';
function sign(params) {
const query = Object.keys(params).map(k => `${k}=${params[k]}`).join('&');
return crypto.createHmac('sha256', SECRET_KEY).update(query).digest('hex');
}
async function getAccount() {
const params = { timestamp: Date.now() };
params.signature = sign(params);
const r = await axios.get(`${BASE_URL}/api/v3/account`, {
params,
headers: { 'X-MBX-APIKEY': API_KEY }
});
return r.data;
}
getAccount().then(console.log);
五、限频与权重
币安 API 用 权重(Weight) 控制调用频率:
| 限制项 | 默认值 |
|---|---|
| 每分钟权重上限 | 6000 |
| 每 10 秒下单上限 | 100 单 |
| 每天下单上限 | 200,000 单 |
| WebSocket 单连接订阅数上限 | 1024 |
| 单 IP WebSocket 连接数上限 | 300 |
常见接口的权重:
GET /api/v3/ticker/price— 权重 1GET /api/v3/depth— 权重 1-50(取决于 limit 参数)GET /api/v3/account— 权重 10POST /api/v3/order— 权重 1(但占用下单频次)
响应头会返回当前权重:
X-MBX-USED-WEIGHT-1m:当前 1 分钟内已用权重X-MBX-ORDER-COUNT-10s:当前 10 秒内已下单次数
超出权重会返回 429 Too Many Requests,严重违规会返回 418 并临时封 IP(2 分钟到 3 天不等)。
六、常见报错及处理
报错: -1022 Signature for this request is not valid
原因:签名错误。最常见的是参数顺序不一致,或 URL 编码方式不对。 处理:
- 确保签名时用的字符串与请求时的查询字符串 完全一致
- 数字类型的参数不要加引号(如
timestamp=1712876400000而不是timestamp="1712876400000") - 对特殊字符做正确的 URL 编码
报错: -1021 Timestamp for this request was 1000ms ahead of the server's time
原因:本地时间与币安服务器时间差超过 1 秒。 处理:
- 同步本地系统时间(NTP)
- 或在请求中加
recvWindow=10000参数把容差调到 10 秒 - 服务器在中国大陆推荐使用
time.windows.com或ntp.aliyun.com
报错: -2014 API-key format invalid
原因:密钥字符串错误。 处理:检查是否复制时多了空格、换行;密钥应为 64 位字母数字。
报错: -1003 Too many requests; current limit is X requests per minute
原因:超出权重上限。 处理:
- 减少调用频率或合并请求(例如用
/api/v3/ticker/24hr一次拿所有交易对而不是逐个查询) - 改用 WebSocket 接收实时数据,减少 REST 调用
- 等待 1 分钟后重试
七、API 安全最佳实践
- 永远不要在前端代码中暴露 Secret Key — 前端可以调用你自己的后端,后端再调币安 API
- 代码仓库 .gitignore 排除密钥文件 — 避免推送到 GitHub 后被自动扫描机器人窃取
- 生产环境使用 IP 白名单 — 只允许你的服务器 IP
- 定期轮换密钥 — 每 6 个月手动删除旧密钥重建一次
- 监控异常调用 — 在 API 管理页查看每日调用统计,发现异常立即停用
常见问题 FAQ
Q1: API 密钥是免费的吗?
A: 完全免费。币安不对 API 调用收费(只在实际下单成交时收手续费),创建密钥也不需要任何押金。但每个账号最多创建 30 个 API 密钥,到达上限需要先删除旧的。
Q2: 用 API 下单的手续费比手动低吗?
A: 不会自动更低。手续费只与你的 VIP 等级和持有的 BNB 数量相关,无论是手动下单还是 API 下单都按同一个费率表。但 API 适合做高频交易,能享受更精准的成交价。
Q3: 测试环境可以模拟交易吗?
A: 可以。币安提供 Spot Testnet(现货测试网)和 Futures Testnet(合约测试网),免费拿测试币练习 API 调用,不会影响真实账户。
Q4: 用 ccxt 这类第三方库简单还是直接调 API 简单?
A: 看场景。ccxt 适合需要支持多个交易所的项目,封装好了签名和参数转换;直接调 API 适合只用币安、性能敏感的场景(少了一层抽象,调试也更直接)。新手推荐先用 ccxt 跑通流程,再决定是否切换到原生调用。
Q5: 我的 API 密钥被盗了怎么办?
A: 立即 在 币安官网 → API 管理 中删除该密钥(删除操作秒级生效)。然后检查最近的交易和提币记录,发现异常通过客服申诉。如果没开启 Enable Withdrawals 权限,盗号者只能下单不能提币,资产损失通常可控。详细的应对流程见 风控防护 分类。
需要查看怎么应对账号风控?回到 分类导航 选择「风控防护」分类查看完整流程。