Coinbase Pro API使用指南:认证、权限与端点详解

Coinbase Pro API 使用指南:从入门到精通

认证与权限

在使用 Coinbase Pro API 之前,必须先拥有一个 Coinbase Pro 账户,然后才能生成 API 密钥。API 密钥是访问 API 的关键凭证。密钥的生成过程如下:

  1. 登录你的 Coinbase Pro 账户。
  2. 然后,导航至 API 页面。API 页面通常位于账户设置或安全设置的子菜单中,具体位置可能因 Coinbase Pro 界面更新而略有不同。
  3. 接下来,点击“创建 API 密钥”按钮。这个按钮会引导你进入密钥配置流程。
  4. 为你的 API 密钥指定一个易于识别的名称,便于日后管理和区分不同的 API 密钥用途。更重要的是,仔细选择与应用程序功能相匹配的权限。权限的选择至关重要,因为它决定了你的应用程序可以通过 API 执行哪些操作。例如,如果你的应用程序仅需读取市场数据,则只需授予 view 权限即可,避免授予不必要的权限。如果你的应用程序需要进行交易,则必须授予 trade 权限。需要特别注意的是,授予 trade 权限意味着你的应用程序可以完全控制交易活动,务必谨慎操作,并采取严格的安全措施来保护你的 API 密钥,防止未经授权的访问和潜在的资金损失。
  5. 设置 IP 访问限制是提高 API 密钥安全性的重要措施。强烈建议限制 API 密钥只能从特定的 IP 地址访问,从而防止密钥泄露后被非法使用。你可以指定一个或多个 IP 地址,只有来自这些 IP 地址的请求才会被 API 接受。
  6. 成功创建密钥后,你将获得 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 : 获取指定交易对的最新行情数据,例如最新成交价、最高价、最低价、成交量等。 需要替换为具体的交易对ID,例如 'BTC-USD'。 此端点提供实时市场快照,助力高频交易和算法交易策略。
  • /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) 算法,结合时间戳机制,进一步增强安全性。

  1. 获取当前时间戳: 这是签名生成的第一步。时间戳必须是 Unix 时间戳,精确到秒。该时间戳将用于防止重放攻击。客户端与服务器的时间必须保持同步,时间偏差过大会导致签名验证失败。建议从 NTP 服务器获取标准时间。
  2. 构建签名字符串: 将请求方法(例如 GET、POST、DELETE)、请求路径(API 端点)、请求体(如果存在,需为 JSON 字符串)、以及时间戳按照特定的顺序拼接成一个字符串。顺序通常为: timestamp + method + request_path + body 。请求体为空时,使用空字符串。
  3. HMAC-SHA256 哈希: 使用您的 API 密钥密码(API Secret)作为密钥,对拼接后的字符串进行 HMAC-SHA256 哈希计算。HMAC-SHA256 是一种消息认证码算法,结合了哈希函数和密钥,可以验证数据的完整性和真实性。确保 API Secret 安全存储,避免泄露。
  4. 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 进行交易时,务必谨慎操作,并采取必要的安全措施保护你的账户安全。