Coinbase Pro API使用指南:认证、权限与端点详解
Coinbase Pro API 使用指南:从入门到精通
认证与权限
在使用 Coinbase Pro API 之前,必须先拥有一个 Coinbase Pro 账户,然后才能生成 API 密钥。API 密钥是访问 API 的关键凭证。密钥的生成过程如下:
- 登录你的 Coinbase Pro 账户。
- 然后,导航至 API 页面。API 页面通常位于账户设置或安全设置的子菜单中,具体位置可能因 Coinbase Pro 界面更新而略有不同。
- 接下来,点击“创建 API 密钥”按钮。这个按钮会引导你进入密钥配置流程。
-
为你的 API 密钥指定一个易于识别的名称,便于日后管理和区分不同的 API 密钥用途。更重要的是,仔细选择与应用程序功能相匹配的权限。权限的选择至关重要,因为它决定了你的应用程序可以通过 API 执行哪些操作。例如,如果你的应用程序仅需读取市场数据,则只需授予
view
权限即可,避免授予不必要的权限。如果你的应用程序需要进行交易,则必须授予trade
权限。需要特别注意的是,授予trade
权限意味着你的应用程序可以完全控制交易活动,务必谨慎操作,并采取严格的安全措施来保护你的 API 密钥,防止未经授权的访问和潜在的资金损失。 - 设置 IP 访问限制是提高 API 密钥安全性的重要措施。强烈建议限制 API 密钥只能从特定的 IP 地址访问,从而防止密钥泄露后被非法使用。你可以指定一个或多个 IP 地址,只有来自这些 IP 地址的请求才会被 API 接受。
- 成功创建密钥后,你将获得 API 密钥(API Key)、API 密钥密码(API Secret)和 API 密钥签名(API Passphrase)。请务必妥善保管这些信息,这些是你访问 API 的唯一凭证,相当于账户的“钥匙”。 切勿将这些信息泄露给任何人,包括朋友、同事甚至 Coinbase Pro 的客服人员。同时,也不要将其存储在公共或不安全的版本控制系统(如 Git)中,以防止密钥泄露。 建议使用安全的密码管理工具或硬件钱包来存储这些敏感信息。
API 权限控制是保障账户资金安全和数据安全的关键环节。Coinbase Pro 提供了细粒度的权限控制机制,你需要根据应用程序的具体需求,仔细选择并分配最小必需权限。不必要的权限授予会增加安全风险。常见的权限包括:
-
view
: 允许读取账户余额、历史交易记录、市场深度数据、最新成交价等信息。该权限通常用于数据分析、行情展示等场景。 -
trade
: 允许下达、修改和取消订单。该权限是进行交易操作的必要条件,务必谨慎授予。 -
deposit
: 允许向你的 Coinbase Pro 账户存入加密货币。 -
withdraw
: 允许从你的 Coinbase Pro 账户提取加密货币。 请极其谨慎地授予此权限。在大多数情况下,应避免授予此权限,或者仅在必要时临时授予,并在完成提款操作后立即撤销。 务必采取额外的安全措施,例如双重验证,来保护具有此权限的 API 密钥。
API 端点与请求方法
Coinbase Pro API 提供了广泛且精细化的端点,全面覆盖了从账户管理到复杂订单类型、以及实时市场数据的获取等多个关键业务领域。开发者可以利用这些端点构建自动化交易策略、监控市场动态或集成到第三方应用中。常用的 API 端点包括:
-
/accounts
: 获取用户的账户信息,包括账户余额、可用资金、以及账户的各种状态信息。 该端点允许开发者监控账户资产并执行相关的资金管理操作。 -
/products
: 获取所有可交易的交易对信息,例如 BTC-USD、ETH-BTC 等。此端点返回交易对的详细信息,包括交易对ID、基础货币、报价货币、交易手续费率和最小交易单位等,是进行交易决策的重要参考。 -
/products/
: 获取指定交易对的最新行情数据,例如最新成交价、最高价、最低价、成交量等。/ticker -
/orders
: 管理订单,包括下达新订单、查询订单状态、修改订单和取消订单。 该端点支持限价单、市价单、止损单等多种订单类型,满足不同交易需求。 -
/fills
: 获取用户的成交记录,包括成交价格、成交数量、成交时间和成交手续费等。 通过此端点,用户可以详细了解历史交易情况,用于交易分析和风险管理。
API 请求严格遵循标准的 HTTP 请求方法,例如
GET
、
POST
、
DELETE
、
PUT
等。 开发者应根据操作类型选择合适的HTTP方法。
-
GET
: 主要用于从服务器获取数据,不会对服务器上的数据进行修改。例如,获取账户信息或行情数据。 -
POST
: 主要用于在服务器上创建新的资源。在Coinbase Pro API中,通常用于下达新的订单。 -
DELETE
: 主要用于从服务器上删除指定的资源。例如,用于取消未成交的订单。 -
PUT
: 主要用于更新服务器上的资源。在Coinbase Pro API中,可能用于修改订单(具体取决于API的支持情况)。
为了保障账户安全和数据完整性,每个 API 请求都需要携带经过加密认证的信息,包括 API 密钥(API Key)、API 密钥密码(API Secret)和 API 密钥签名(API Signature)。API 密钥签名是通过使用 API Secret 对请求参数、请求路径和时间戳进行哈希(通常是HMAC-SHA256)计算生成的数字签名。服务端通过验证签名来确认请求的合法性和真实性,防止未经授权的访问和数据篡改。开发者需要妥善保管API Key和API Secret,避免泄露。
签名生成
生成 Coinbase Pro API 请求签名是与 Coinbase Pro API 进行安全通信的关键环节。有效的签名能够验证请求的来源和完整性,确保数据在传输过程中未被篡改,从而保证交易安全。签名机制是防止恶意攻击、保障账户安全的重要措施。该签名采用 HMAC (Hash-based Message Authentication Code) 算法,结合时间戳机制,进一步增强安全性。
- 获取当前时间戳: 这是签名生成的第一步。时间戳必须是 Unix 时间戳,精确到秒。该时间戳将用于防止重放攻击。客户端与服务器的时间必须保持同步,时间偏差过大会导致签名验证失败。建议从 NTP 服务器获取标准时间。
-
构建签名字符串:
将请求方法(例如 GET、POST、DELETE)、请求路径(API 端点)、请求体(如果存在,需为 JSON 字符串)、以及时间戳按照特定的顺序拼接成一个字符串。顺序通常为:
timestamp + method + request_path + body
。请求体为空时,使用空字符串。 - HMAC-SHA256 哈希: 使用您的 API 密钥密码(API Secret)作为密钥,对拼接后的字符串进行 HMAC-SHA256 哈希计算。HMAC-SHA256 是一种消息认证码算法,结合了哈希函数和密钥,可以验证数据的完整性和真实性。确保 API Secret 安全存储,避免泄露。
- Base64 编码: 将 HMAC-SHA256 哈希计算的结果进行 Base64 编码。Base64 是一种将二进制数据转换为 ASCII 字符串的编码方式,便于在 HTTP 头部中传输。编码后的字符串即为 API 签名。
各种编程语言都提供了相应的库来实现 HMAC-SHA256 算法和 Base64 编码。以下是一个 Python 示例,演示了如何生成签名并发送 API 请求:
import hashlib
import hmac
import base64
import time
import requests
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
api_passphrase = "YOUR_API_PASSPHRASE"
api_url = "https://api.pro.coinbase.com"
def generate_signature(request_path, method, body, timestamp):
message = timestamp + method + request_path + body
hmac_key = base64.b64decode(api_secret)
signature = hmac.new(hmac_key, message.encode('utf-8'), hashlib.sha256)
signature_b64 = base64.b64encode(signature.digest()).decode('utf-8')
return signature_b64
def make_request(method, endpoint, body=""):
timestamp = str(time.time())
request_path = endpoint
signature = generate_signature(request_path, method, body, timestamp)
headers = {
'CB-ACCESS-KEY': api_key,
'CB-ACCESS-SIGN': signature,
'CB-ACCESS-TIMESTAMP': timestamp,
'CB-ACCESS-PASSPHRASE': api_passphrase,
'Content-Type': 'application/' # 明确指定 JSON 内容类型
}
url = api_url + endpoint
if method == 'GET':
response = requests.get(url, headers=headers)
elif method == 'POST':
response = requests.post(url, headers=headers, data=body) # POST 请求需要传递 data 参数
elif method == 'DELETE':
response = requests.delete(url, headers=headers, data=body) # DELETE 请求也可以传递 data 参数
else:
raise ValueError("Invalid method")
return response
示例:获取账户信息
在加密货币交易或管理中,获取账户信息是至关重要的一步。通过API接口,我们可以程序化地获取账户的各种详细信息。以下代码展示了如何使用
make_request
函数来发起一个HTTP GET请求,从而获取账户信息。
response = make_request('GET', '/accounts')
这行代码调用了名为
make_request
的函数,该函数接受两个参数:HTTP请求方法(这里是'GET')和API端点(这里是'/accounts')。
make_request
函数负责构建并发送HTTP请求到指定的API服务器,并返回服务器的响应。'/accounts'端点通常用于检索与用户账户相关的详细数据,例如账户余额、交易历史和账户设置。
print(response.())
获取响应后,我们需要解析并显示其中的数据。
response.()
这部分代码用于从响应对象中提取数据,并将其转换为可读的格式。具体的实现取决于
response
对象的类型。 常见的做法是使用
response.()
将JSON格式的响应数据解析为Python字典,或者使用
response.text()
获取原始文本响应。然后,
print()
函数将解析后的数据输出到控制台,以便用户查看账户信息。
请注意,
make_request
函数的具体实现以及
response
对象的属性和方法会根据你所使用的API库和编程语言而有所不同。例如,你可能需要使用
requests
库 (Python) 或者其他类似的HTTP客户端库来发送请求,并且根据API文档来确定如何正确地解析响应数据。
示例:下达限价买单
此示例展示了如何通过 API 下达一个限价买单,以指定的价格购买一定数量的比特币。
以下代码片段展示了构建订单的 Python 字典:
order = {
'size': '0.01', # 想要购买的比特币数量,单位为 BTC
'price': '30000', # 设定的购买价格,单位为 USD
'side': 'buy', # 订单方向,这里是买入
'product_id': 'BTC-USD', # 交易对,表示比特币对美元
'type': 'limit', # 订单类型,这里是限价单
'time_in_force': 'GTC' # 时间生效策略,GTC (Good-Til-Cancelled) 表示订单会一直有效,直到被执行或取消
}
字段解释:
-
size
: 指定购买或出售的标的数量。在这个例子中,目标是购买 0.01 个比特币。 -
price
: 设定订单的执行价格。只有当市场价格达到或低于 30000 美元时,买单才会被执行。 -
side
: 定义订单的方向。'buy'
表示这是一个买单。 -
product_id
: 明确指定交易的资产对。'BTC-USD'
表示比特币与美元的交易对。 -
type
: 定义订单类型。'limit'
表示这是一个限价单,允许用户设定期望的买入或卖出价格。 -
time_in_force
: 控制订单在市场中的有效时长。'GTC'
确保订单持续有效,直至完全成交或被主动取消。
为了通过 API 发送订单,需要将 Python 字典转换为 JSON 格式,并将其作为 POST 请求的 body 发送至
/orders
端点。
response = make_request('POST', '/orders', body=str(order).replace("'", '"'))
print(response.())
make_request
函数负责处理 API 请求的细节,包括身份验证、错误处理等。
str(order).replace("'", '"')
用于将 Python 字典转换为 JSON 字符串,确保 API 可以正确解析订单信息。
response.()
用于打印 API 响应,其中包含订单的状态和详细信息,例如订单 ID、成交价格等。通过分析响应,可以确认订单是否成功提交以及其执行情况。
常见问题与解决方案
- 认证失败: 检查您的 API 密钥、API 密钥密码以及 API 密钥签名是否完全正确。细致核对大小写和特殊字符,确保没有遗漏或错误。同时,确认客户端时间戳与 Coinbase Pro 服务器时间同步,任何显著的时间偏差都可能导致认证失败。请使用网络时间协议 (NTP) 服务来保持时间同步。
- 权限不足: 仔细检查您所使用的 API 密钥是否被赋予了执行当前操作所需的全部权限。在 Coinbase Pro 平台的用户权限管理界面,确认该 API 密钥拥有执行该操作,比如交易、查询账户余额、或者访问特定数据流的相应权限。
- 请求频率限制: Coinbase Pro API 实施了请求频率限制机制,以防止滥用和维护系统稳定性。如果您接收到 429 错误代码,表明您的请求频率已经超过了允许的上限。此时,建议您采取以下措施:一是合理控制请求频率,采用指数退避算法进行重试;二是考虑使用 WebSocket API 获取实时数据,WebSocket 连接可以减少API请求数量。
- 订单未成交: 如果您的订单长时间未成交,请检查订单的价格设定是否符合当前市场行情。当订单价格显著偏离市场价格时,例如挂单价格过高或过低,订单可能无法立即成交。可以考虑调整订单价格,使其更接近当前的市场价格,或者选择市价单快速成交。同时,还要关注交易对的流动性,流动性差的交易对可能导致订单成交缓慢。
- WebSocket 连接失败: 检查用于建立 WebSocket 连接的地址是否正确无误,包括协议类型(wss:// 或 ws://)、域名以及路径。确保您的网络连接稳定可靠,避免因网络中断或不稳定导致连接失败。同时,防火墙设置或代理服务器也可能阻止 WebSocket 连接,请检查相关配置。可以尝试ping通Coinbase Pro的WebSocket服务器来诊断网络问题。
WebSocket API
Coinbase Pro 除了提供 REST API 之外,还提供了一个强大的 WebSocket API,专为需要实时市场数据和账户更新的用户设计。通过 WebSocket API,您可以订阅各种频道,这些频道提供细粒度的实时信息,包括但不限于行情数据(ticker)、订单簿更新(level2和full)、成交记录(matches)、心跳(heartbeat)以及用户账户活动等。
WebSocket API 的主要优势在于其能够提供近乎零延迟的实时数据流,避免了传统 REST API 轮询方式所带来的延迟和资源消耗。这意味着您可以立即对市场变化做出反应,抓住交易机会,或进行精确的风险管理,而无需持续发送请求并等待响应。
为了开始使用 WebSocket API,您需要建立一个持久的 WebSocket 连接到 Coinbase Pro 的 WebSocket 服务器。连接建立后,您需要发送一个 JSON 格式的订阅消息,明确指定您感兴趣的产品和频道。订阅消息的结构如下:
{
"type": "subscribe",
"product_ids": [
"BTC-USD",
"ETH-USD"
],
"channels": [
"ticker",
"level2"
]
}
上述订阅消息指示 Coinbase Pro 向您推送 BTC-USD 和 ETH-USD 这两个交易对的行情数据(ticker)和 Level 2 订单簿更新。
ticker
频道提供最新的交易价格、成交量和时间戳等信息。
level2
频道提供订单簿的快照,包括买单和卖单的价格和数量,帮助您了解市场深度和流动性。您还可以订阅
full
频道获取完整的订单簿快照,或者使用
matches
频道接收实时的成交记录,了解市场的交易活动。
除了上述示例,您还可以订阅其他频道,例如
user
频道来接收有关您账户活动的更新,包括订单状态变化、资金变动等。 通过调整
product_ids
和
channels
字段,您可以灵活地定制您接收的数据流,以满足您的特定交易策略和信息需求。
安全建议
- 保护 API 密钥: 务必将 API 密钥视为最高机密信息。切勿在任何公开场合(如代码库、论坛、聊天群组等)泄露密钥。使用环境变量或加密的配置文件安全存储 API 密钥,并且定期轮换密钥以降低风险。考虑使用专门的密钥管理服务来加强保护。
- 限制 IP 访问: 为了进一步提高安全性,建议将 API 密钥的使用限制在特定的 IP 地址范围内。配置你的 Coinbase Pro 账户,只允许来自你信任的服务器或应用程序的 IP 地址访问 API。这样即使密钥泄露,攻击者也无法从未经授权的 IP 地址使用它。
- 使用 HTTPS: 始终通过 HTTPS 协议发送所有 API 请求,确保数据传输过程中的安全性。HTTPS 使用 TLS/SSL 加密协议,防止中间人攻击,保护你的敏感信息(如 API 密钥和交易数据)不被窃听或篡改。确认你的 API 客户端配置正确,强制使用 HTTPS 连接。
- 定期审查权限: 定期检查并更新你的 API 密钥的权限设置。根据你的实际需求,仅授予 API 密钥执行所需操作的最小权限。避免授予不必要的权限,以降低潜在的安全风险。如果某个 API 密钥不再需要,立即撤销其权限。
- 监控账户活动: 密切监控你的 Coinbase Pro 账户的活动,包括交易记录、API 调用和登录尝试。设置警报系统,以便在检测到异常活动时立即收到通知。例如,当出现不明来源的大额交易、异常的 API 调用频率或未授权的登录尝试时,及时采取措施阻止潜在的攻击。
- 启用双重验证: 为了增加账户的安全性,强烈建议为你的 Coinbase Pro 账户启用双重验证(2FA)。2FA 需要在登录时提供除密码之外的第二种验证方式,例如来自身份验证器应用程序(如 Google Authenticator 或 Authy)的一次性密码。即使密码泄露,攻击者也无法在没有第二种验证因素的情况下访问你的账户。
- 使用强密码: 为你的 Coinbase Pro 账户设置一个强密码,包含大小写字母、数字和特殊字符,并且长度足够长。避免使用容易猜测的密码,如生日、电话号码或常见单词。定期更改密码,并确保在不同的在线服务中使用不同的密码。考虑使用密码管理器来安全地存储和管理你的密码。
- 了解 API 限制: 熟悉 Coinbase Pro API 的使用限制,特别是请求频率限制。避免过度调用 API,以免触发速率限制或被暂时禁用。合理设计你的应用程序,优化 API 调用,并使用缓存机制来减少对 API 的请求次数。遵守 API 的使用条款,以确保你的应用程序能够稳定运行。
希望这份指南能帮助你更好地使用 Coinbase Pro API。请记住,在使用 API 进行交易时,务必谨慎操作,并采取必要的安全措施保护你的账户安全。