API v1 · 错误码

错误码表

HTTP code + meta 双码系统,对齐 51tracking / 168tracking 行业规范。

所有错误响应统一格式 {code, meta, message, data},其中 meta 是业务码。客户端应优先检查 meta,而不是 HTTP status code。

HTTP 状态码(粗分类)

HTTPmeta 范围含义客户端行为
200200成功正常处理 data
40041xx请求参数错误(业务)检查 message 修复请求
401401身份验证失败检查 API Key
403403禁止访问(跨账号)权限错误
4044102资源不存在检查 id 是否正确
429429超出请求限制退避 120s 后重试
50051x服务器错误记录错误码 + 联系支持

业务码 41xx(参数错误)

metaHTTP含义常见原因
4101400物流单号已存在 同一单号重复注册(不会重复扣 quota)
4102400物流单号不存在 查询时该单号未注册到当前账号
4103400批量超过 40 个 单次批量上限 40,超出被拒(不扣 quota)
4110400tracking_number 不符合规则 长度不在 4-40 之间
4111400tracking_number 必填 JSON body 缺字段
4112400查询 ID 无效 tracking id 拼写错
4113400retrack 太频繁 间隔 < 1 小时
4120400courier_code 无效 不在支持列表:usps/ups/fedex/dhl/sf-express/yto
4130400请求参数格式无效 JSON 解析失败 / 类型错 / URL 不合法(webhook)
4190400查询额度不足 当月 quota 已用完

业务码 51xx(服务器错误)

metaHTTP含义客户端行为
511500上游查询失败retry-friendly,等 30s 后重试
512500数据库错误联系支持,提供 request id
513500内部异常联系支持,提供完整 request body

响应示例

成功响应(meta=200)

{
  "code": 200,
  "meta": 200,
  "message": "请求响应成功。",
  "data": {
    "id": "f44cba625aa841eb7225f511",
    "tracking_number": "9205512345600001234567",
    "carrier": "usps",
    "status": "查询中"
  }
}

业务错误(meta=4111)

{
  "code": 4111,
  "meta": 4111,
  "message": "物流单号(tracking_number)为必填字段。",
  "data": null
}

认证错误(meta=401)

{
  "code": 401,
  "meta": 401,
  "message": "身份验证失败或没有权限。",
  "data": null
}

额度不足(meta=4190)

{
  "code": 4190,
  "meta": 4190,
  "message": "当前查询额度不足。",
  "data": null
}

限流(meta=429)

{
  "code": 429,
  "meta": 429,
  "message": "超出 API 请求限制,请稍后重试。",
  "data": null
}

客户端错误处理建议

import requests

def call_api(method, url, **kwargs):
    r = requests.request(method, url, timeout=10, **kwargs)
    body = r.json()
    meta = body.get('meta')

    # 成功
    if meta == 200:
        return body['data']

    # 限流:退避 120s
    if meta == 429:
        time.sleep(120)
        return call_api(method, url, **kwargs)

    # quota 用完:抛异常,让上层决定升级 plan
    if meta == 4190:
        raise QuotaExceededError(body['message'])

    # 4xx 业务错误:抛异常 + 完整 meta 信息
    if 4100 <= meta < 4200:
        raise BusinessError(meta, body['message'])

    # 5xx 服务器错误:可重试 3 次(指数回退)
    if 510 <= meta < 520:
        for attempt in range(3):
            time.sleep(2 ** attempt)
            try:
                return call_api(method, url, **kwargs)
            except BusinessError:
                raise
        raise ServerError(meta, body['message'])

    raise UnknownError(meta, body)