错误码

PolyTest API 使用标准 HTTP 状态码。所有错误响应都会返回一个 JSON 主体,其中的 error 字段描述了问题。

错误响应格式:所有错误都返回一个 JSON 对象,其中只有一个 "error" 键,包含一条易读的消息。HTTP 状态码表示错误类别。

400Bad Request

请求格式错误或缺少必填参数。

{ "error": "timestamp query parameter is required" }

常见原因

  • 缺少必填的查询参数
  • 参数格式无效(例如时间戳不是 ISO 8601 格式)
  • 参数值超出允许范围

401Unauthorized

认证失败:请求没有有效的凭证。

{ "error": "Invalid API key" }

常见原因

  • 缺少 X-API-Key 请求头或 Authorization 请求头
  • API 密钥不存在或无效
  • API 密钥已被撤销
  • API 密钥已过期
  • JWT 令牌无效或已过期

403Forbidden

凭证有效,但没有执行此操作的权限。

{ "error": "Admin access required" }

常见原因

  • 在没有管理员权限的情况下尝试访问仅限管理员的端点(sync、seed)
  • API 密钥的权限范围不包含所需权限

404Not Found

请求的资源不存在。

{ "error": "Market not found" }

常见原因

  • 市场 ID 不存在
  • 市场 slug 没有匹配的记录
  • 在给定时间戳 ±2 秒内没有找到快照

429Too Many Requests

超出速率限制。请退避,并在指示的时间后重试。

{ "error": "Rate limit exceeded" }

常见原因

  • 超出你的套餐档位的每分钟请求数限制
  • 超出突发限制(短时间内请求过多)

500Internal Server Error

服务器发生意外错误。这种情况很少见,如果持续出现,请联系支持。

{ "error": "Internal server error" }

常见原因

  • 数据库连接问题
  • 上游服务故障
  • 服务器端意外异常

处理错误

客户端错误(4xx)

不要自动重试。重试前请先修正请求参数或认证,或确认资源是否存在。

服务器错误(5xx)

可以安全地使用指数退避重试。从 1 秒延迟开始,每次重试翻倍,最多重试 3 次。

import time
import requests

def api_request(url, headers, max_retries=3):
    for attempt in range(max_retries):
        response = requests.get(url, headers=headers)

        if response.status_code == 429:
            wait = int(response.headers.get("Retry-After", 2 ** attempt))
            time.sleep(wait)
            continue

        if response.status_code >= 500:
            time.sleep(2 ** attempt)
            continue

        return response

    raise Exception("Max retries exceeded")