Python调用Kucoin API下限价单返回400 Bad Request的修复方法
KuCoin API提交限价单返回400 Bad Request解决方案
核心错误点
- 订单参数位置错误:你将
clientOid、side、symbol、type、price、size这类业务参数全部放在了请求头中,这类参数属于POST请求的提交内容,应当放在请求体里,请求头仅需保留鉴权相关字段。 - 签名逻辑不符合V2版本API要求:使用
KC-API-KEY-VERSION: 2时,待签名字符串的拼接规则是时间戳 + 请求方法 + 请求路径 + JSON序列化后的请求体字符串,原有签名逻辑遗漏了请求体部分,会直接导致签名校验失败。 - 签名值格式错误:
hmac.new计算后经base64编码得到的是bytes类型值,没有解码为utf-8字符串就传入请求头,格式不符合接口要求。
修正后的可运行代码
import time import hmac import hashlib import base64 import secrets import requests import json # 替换为你自己的密钥信息 api_key = "你的API Key" api_secret = "你的API Secret" api_passphrase = "你的API Passphrase" client_oid = secrets.token_hex(8) url = 'https://api.kucoin.com/api/v1/orders' now = int(time.time() * 1000) # 订单参数统一放在请求体中 order_body = { "clientOid": client_oid, "side": "sell", "symbol": "AFK-USDT", "type": "limit", "price": "0.05", "size": "50.00" } # 序列化请求体用于签名,必须保证签名用的字符串和实际发送的请求体完全一致 body_str = json.dumps(order_body) str_to_sign = f"{now}POST/api/v1/orders{body_str}" # 签名结果必须转成utf-8字符串 signature = base64.b64encode( hmac.new(api_secret.encode('utf-8'), str_to_sign.encode('utf-8'), hashlib.sha256).digest() ).decode('utf-8') passphrase = base64.b64encode( hmac.new(api_secret.encode('utf-8'), api_passphrase.encode('utf-8'), hashlib.sha256).digest() ).decode('utf-8') # 请求头仅保留鉴权和内容类型字段 headers = { "KC-API-SIGN": signature, "KC-API-TIMESTAMP": str(now), "KC-API-KEY": api_key, "KC-API-PASSPHRASE": passphrase, "KC-API-KEY-VERSION": "2", "Content-Type": "application/json" } # 通过json参数传递请求体,requests会自动完成符合要求的序列化 response = requests.post(url, headers=headers, json=order_body) print(response.status_code) print(response.json())
额外排查点
- 确认
AFK-USDT交易对在KuCoin当前处于可交易状态,交易对名称大小写必须和平台公示的完全一致。 - 确认本机时间和UTC标准时间差不超过5秒,时间偏差过大会触发鉴权失败。
- 限价单的
price和size精度必须符合对应交易对的规则,精度不符合也会返回参数错误,可提前调用交易对配置接口查询对应精度限制。
内容的提问来源于stack exchange,提问作者DeziLuv
相关产品推荐
相关产品推荐

