错误码
错误总会说明哪里出了问题,并在可能时说明正确的写法。本页按通道列出各种情况,并区分哪些值得重试、哪些不值得。
#错误的结构
详情由 detail 键给出。对于校验错误,它会指出出错的值,并在存在有限取值列表时一并列出。
{
"detail": "Symbole 'PEPEUSDT' inconnu. Valeurs acceptees : BTCUSDT, ETHUSDT, ..."
}与方案相关的拒绝有固定结构,由网关设置:status、timestamp 和 detail,基于时间的拒绝还会加上 retry_after(同样出现在 Retry-After 响应头中)。X-Deny-Reason 响应头指明原因:rate、quota、family、websocket 或 key。
{
"status": "error",
"timestamp": 1775648290510,
"detail": "Debit depasse : votre offre autorise un nombre limite de requetes par minute.",
"retry_after": 1
}深度相关的 403 由接口本身返回,不带 X-Deny-Reason:其 detail 总是以 « Profondeur d’historique hors offre » 开头,并给出该周期下可使用的最大 limit。各方案的窗口见使用限制页面。
#HTTP 状态码
| 状态码 | 原因 | 修复 |
|---|---|---|
400请求被拒绝 | 交易对未知或已停用、深度超过该字段上限、指标参数越界。 | 响应正文会指出出错的值;如果是交易对,还会列出可接受的交易对。 |
403被方案或 API 密钥拒绝 | 四种原因,由 X-Deny-Reason 响应头指明:API 密钥缺失、无效或已吊销(key);数据族不在方案内(family);WebSocket 数据流不在方案内(websocket);或历史深度超出方案窗口,其 detail 以 « Profondeur d’historique hors offre » 开头。 | 对于 key,请确认请求头确实已发送:部分 HTTP 客户端在重定向后会丢失它。对于 family 和 websocket,数据存在但不在你的方案中。对于深度,detail 会给出可使用的最大 limit。 |
422参数缺失或格式错误 | 缺少 symbol、周期不在列表中、请求多周期字段时缺少 @tf 后缀、?fields= 中有未知字段、JSON 正文无效。 | 对于 ?fields=,响应会建议最接近的字段。对于周期,会列出可接受的值。 |
429超出速率或配额 | 每分钟请求数超过方案允许,或突发过于密集(X-Deny-Reason: rate,Retry-After: 1);或账户月度配额已用尽(X-Deny-Reason: quota,Retry-After: 3600)。 | 对于 rate,等待 Retry-After 给出的秒数。对于 quota,计数在每月第一天(UTC)重置;你也可以在控制台更换方案。 |
503暂时不可用 | 某个读取依赖正在恢复,或数据流的同时连接数已达上限。 | 在 Retry-After 给出的延迟后重试。此错误本质上是暂时的。 |
500意外错误 | 服务端故障,绝不是由请求引起。 | 请重试;若问题持续,请附上响应中的时间戳报告给我们。 |
最常见的混淆
| 症状 | 真实原因 |
|---|---|
| 密钥有效却返回 403 | 查看 X-Deny-Reason。family:该端点的数据族不在你的方案中。websocket:方案不含数据流。detail 为 « Profondeur d’historique hors offre »:请求超出了方案的时间窗口。无明显原因的 key:HTTP 客户端在重定向后丢失了自定义请求头;请调用最终 URL。 |
| 请求频率不高却返回 429 | 用尽的是账户的月度配额(X-Deny-Reason: quota,Retry-After: 3600),而不是速率限制。配额在每月第一天(UTC)重置,或在更换方案后立即恢复。 |
| 快照返回 422 但没有明确信息 | 请求多周期字段时缺少 @tf 后缀,或在单一形式的字段上加了后缀。 |
| 看似合理的深度返回 400 | 快照的每个字段都有自己的上限和单位。CVD 最多 200 个窗口,交易所间价差最多 50 个。 |
| 在别处有效的周期返回 422 | 多空比不接受 1m,日内宏观品种不接受 30m,周线只存在于指标中。 |
| 不是错误的空响应 | 在稳定币上请求期货指标,或在 BTC 和 ETH 以外的资产上请求期权。快照的 unavailable 键会说明适用三种原因中的哪一种。 |
| 参数被忽略 | 快照中的未知键会被悄悄忽略。拼错的字段只会在响应中缺失。 |
#指标
校验按固定顺序进行(周期、结果数量、交易对、指标解析、上限规则、读取 K 线),以第一个失败为准。因此修正后的正文可能会暴露第二个错误。
| 情况 | 状态码 |
|---|---|
| 周期无效、results 小于 1、交易对未知 | 400 |
| indicators 列表为空,或某个条目不是对象 | 400 |
| 缺少 id 或 type 键,或 id 格式不符合该类型 | 400 |
| 不支持的类型 | 400 |
| 该类型的未知参数(例如带 period 的 obv) | 400 |
| 参数类型错误,或低于最小值 | 400 |
| macd 或 adosc 的 fast 大于或等于 slow | 400 |
| sar 的 acceleration 大于 maximum | 400 |
| 标识符重复 | 400 |
| 正文格式错误、超过 50 个实例、字段过长 | 422 |
| results 加 warm-up 超过 1000 | 422 |
| 该周期数据不足,包括稳定币 | 422 |
#WebSocket 数据流
每个无法满足的请求都会收到 op: error 消息,说明期望的内容:有效交易对列表、频道列表、depth 的范围。有三种情况不会产生错误,而是关闭连接:
| 代码 | 原因 |
|---|---|
| 4003 · 上限 | 已达到方案的同时连接数上限。原因中会给出上限。断开连接会立即释放名额。 |
| 4003 · 客户端过慢 | 发送队列已溢出十次。请加快消费速度,或减少频道数量。原因会区分这两种情况。 |
| 4001 | 显式认证帧被拒绝:其中携带的密钥无效。 |
| 4002 | 会话在五秒内始终未认证。由于密钥已在握手时校验,这种情况很少见。 |
密钥在握手时校验,早于连接建立:密钥缺失或无效,或方案不含数据流(Free),会在握手时收到 403,X-Deny-Reason 为 key 或 websocket。此时出现 429 表示建立连接的频率过高。连接后,订阅方案外数据族的频道会收到 op: error(« canal … hors offre : la famille … n’est pas incluse dans votre abonnement »),整个订阅都会被拒绝。见使用限制。
#MCP 服务器
错误遵循同一种格式 Erreur (HTTP NNN) : message,这样智能体只需识别一种情况。每次工具调用都按使用客户端密钥的 REST 请求来判断:方案外数据族的 403 或配额相关的 429 会原样返回,并附带其 detail。有两类错误是它特有的:
- 未知指标:消息会列出四十六个有效指标。
- 定位无效:同时指定两个目标、缺少目标、目标类型错误,或对全市场指标指定了目标。错误会指出所需的参数,并且在任何网络调用之前抛出。
服务器故障会先自动重试一次再报告。超时会在三十秒后返回 Erreur (HTTP 504)。
#重试策略
并非所有请求都可以重放。重放错误的请求只会得到完全相同的响应,白白消耗配额。
def should_retry(code: int) -> bool:
"""What is transient, and what never will be."""
# 429 and 503 will pass: the server says when.
if code in (429, 503):
return True
# 500: a fault on the service side, a retry makes sense.
if code == 500:
return True
# 400, 403, 422: the request is at fault. Replaying it as is will
# produce exactly the same response.
return False- 遵守
Retry-After,不要自行设定延迟:服务器知道自己何时就绪。 - 限制重试次数。三到四次就够了:再多说明问题不是暂时的。
- 不要重放 4xx(429 除外)。请修正请求。
- 对于数据流,请以递增的延迟重连,并把
4003关闭视为客户端过载的信号:不改变消费方式就重连,只会再次被断开。