公开 vs 需要验证
公开(无需验证)
Gamma API、Data API 和 CLOB 读取端点(订单簿、价格、价差)不需要身份验证。
需要验证(CLOB)
CLOB 交易端点(下单、撤单、心跳)需要全部 5 个
POLY_* L2 HTTP header。两级身份验证模型
CLOB 使用两级身份验证:L1(私钥)和 L2(API Key)。两种方式都可以通过 CLOB 客户端或 REST API 完成。L1 身份验证 - 私钥
L1 身份验证使用钱包的私钥签署一个 EIP-712 消息,用于请求头。它证明了对私钥的所有权和控制权。私钥始终由用户控制,所有交易活动都是非托管的。 用于:- 创建 API 凭证
- 派生现有的 API 凭证
- 本地签署和创建用户订单
L2 身份验证 - API 凭证
L2 使用从 L1 身份验证生成的 API 凭证(apiKey、secret、passphrase)。这些仅用于验证发送到 CLOB API 的请求。请求使用 HMAC-SHA256 签名。 用于:- 取消或获取用户的活跃订单
- 检查用户的余额和授权
- 提交用户签名的订单
即使使用了 L2 身份验证 header,创建用户订单的方法仍然需要用户签署订单 payload。
获取 API 凭证
在发送需要验证的请求之前,你需要使用 L1 身份验证获取 API 凭证。使用 SDK - 推荐
- TypeScript
- Python
使用 REST API
虽然我们强烈建议使用提供的客户端来处理签名和身份验证,但以下内容适用于选择不使用 Python 或 TypeScript 客户端的开发者。 创建 API 凭证POLY_SIGNATURE 通过签署以下 EIP-712 结构生成:
EIP-712 签名示例
EIP-712 签名示例
L2 身份验证 Header
所有交易端点需要以下 5 个 header:
L2 的
POLY_SIGNATURE 是使用用户 API 凭证的 secret 值创建的 HMAC-SHA256 签名。参考实现可在 TypeScript 和 Python 客户端中找到。
CLOB 客户端 - L2
- TypeScript
- Python
即使使用了 L2 身份验证 header,创建用户订单的方法仍然需要用户签署订单 payload。
签名类型和 Funder
初始化 L2 客户端时,你必须指定钱包的 signatureType 和持有资金的 funder 地址:安全最佳实践
永远不要暴露私钥
永远不要暴露私钥
将私钥存储在环境变量或安全的密钥管理系统中。永远不要将它们提交到版本控制系统。
在服务器端实现请求签名
在服务器端实现请求签名
永远不要在客户端代码中暴露你的 API secret。所有需要身份验证的请求都应从你的后端发起。
故障排除
错误 - INVALID_SIGNATURE
错误 - INVALID_SIGNATURE
你的钱包私钥不正确或格式不对。解决方案:
- 验证你的私钥是有效的十六进制字符串(以 “0x” 开头)
- 确保你使用的是目标地址对应的正确密钥
- 检查密钥是否具有正确的权限
错误 - NONCE_ALREADY_USED
错误 - NONCE_ALREADY_USED
你提供的 nonce 已被用于创建 API key。解决方案:
- 使用相同的 nonce 调用
deriveApiKey()来获取现有凭证 - 或使用不同的 nonce 调用
createApiKey()
错误 - Invalid Funder Address
错误 - Invalid Funder Address
你的 funder 地址不正确或与你的钱包不匹配。**解决方案:**在 polymarket.com/settings 查看你的 Polymarket 个人资料地址。如果地址不存在或用户从未登录过 Polymarket.com,请先部署地址,然后再创建 L2 身份验证。
凭证和 nonce 都丢失了
凭证和 nonce 都丢失了
很遗憾,没有 nonce 就无法恢复丢失的 API 凭证。你需要创建新的凭证:
下一步
下你的第一笔订单
了解如何创建和提交订单。
地区限制
按地区检查交易可用性。