参考

错误码

错误总会说明哪里出了问题,并在可能时说明正确的写法。本页按通道列出各种情况,并区分哪些值得重试、哪些不值得。

#错误的结构

详情由 detail 键给出。对于校验错误,它会指出出错的值,并在存在有限取值列表时一并列出。

400
{
  "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 大于或等于 slow400
sar 的 acceleration 大于 maximum400
标识符重复400
正文格式错误、超过 50 个实例、字段过长422
results 加 warm-up 超过 1000422
该周期数据不足,包括稳定币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)。

#重试策略

并非所有请求都可以重放。重放错误的请求只会得到完全相同的响应,白白消耗配额。

Python
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 关闭视为客户端过载的信号:不改变消费方式就重连,只会再次被断开。