错误参考
错误与速率限制
错误代码、HTTP 状态映射、速率限制策略和重试策略的完整参考。
HTTP 状态码
现代 REST API 使用标准 HTTP 状态码。响应体包含结构化的错误对象。
| 代码 | 状态 | 含义 |
|---|---|---|
| 400 | Bad Request | 请求验证失败(参数缺失或无效) |
| 401 | Unauthorized | 需要身份验证或 API 密钥无效 |
| 402 | Payment Required | 钱包余额不足以完成操作 |
| 403 | Forbidden | 已认证但无权访问此资源 |
| 404 | Not Found | 资源未找到(例如激活 ID 不存在) |
| 409 | Conflict | 请求与当前状态冲突 |
| 422 | Unprocessable Entity | 请求格式正确但语义无效 |
| 429 | Too Many Requests | 速率限制超限 — 查看 Retry-After 响应头 |
| 500 | Internal Server Error | 意外服务器错误 — 用指数退避重试 |
| 503 | Service Unavailable | 上游服务暂不可用 — 稍后重试 |
错误响应形式(JSON)
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
Retry-After: 27937
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 2026-05-10T00:00:00.000Z
{
"error": "rate_limit_exceeded",
"message": "Daily API limit reached. Contact support for higher tier.",
"retryAfter": 27937,
"limit": 10000,
"usage": 10000
}SMS-Activate 文本代码
SMS-Activate 兼容端点返回纯文本代码。每个代码映射到一个 HTTP 状态。
| 文本代码 | HTTP | 含义 |
|---|---|---|
| BAD_KEY | 401 | API 密钥无效或缺失 |
| BAD_ACTION | 400 | action 参数缺失或格式错误 |
| BAD_SERVICE | 400 | 服务代码无法识别 |
| BAD_COUNTRY | 400 | country 参数无法识别 |
| BAD_STATUS | 400 | setStatus 的 status 值无效 |
| WRONG_ACTION | 400 | 不支持的操作名 |
| NO_BALANCE | 402 | 钱包余额不足 |
| NO_NUMBERS | 404 | 此组合没有可用号码 |
| NO_ACTIVATION | 404 | 激活 ID 不存在或不属于你 |
| RATE_LIMITED | 429 | 速率限制超限 — 减速或等待重置 |
| ERROR_SQL | 500 | 服务器内部错误 — 稍后重试 |
速率限制
按 API 密钥限流。多个服务器使用同一密钥共享一个桶。
突发限制
三层并发限流保护防止突发和持续滥用。达到任何一层返回 429。
short
5
/ 1 second
medium
30
/ 10 seconds
long
100
/ 60 seconds
每日配额
默认每个 API 密钥每天 10,000 次请求。UTC 午夜重置。
- 公共目录端点(services、countries)免于每日配额
- 配额计数器在每个已认证请求时增加,无论响应状态
- 提供更高限额的 Pro 级别 — 联系支持
响应头
每个已认证 API 响应都包含速率限制响应头,客户端可以主动自我限流。
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9543
X-RateLimit-Reset: 2026-05-10T00:00:00.000Z
Retry-After: 27937重试策略
如何在不过载 API 或丢失数据的前提下处理瞬态故障。
应当
- • 在 429 响应中遵守 Retry-After 头
- • 对 5xx 错误使用指数退避(1秒、2秒、4秒、8秒)
- • 重试最多 5 次,然后向用户显示错误
不应
- • 不要重试 429 以外的 4xx 错误 — 它们是确定性的
- • 429 后不要持续敲击 API — 等待完整的 Retry-After 时间
- • 不要在不检查幂等性的情况下重试 POST /activations
推荐的重试模式
# Pseudocode — exponential backoff with Retry-After
attempt = 0
while attempt < 5:
response = call_api()
if response.status == 200:
break # success
if response.status == 429:
wait = response.headers.get('Retry-After', 2 ** attempt)
sleep(wait)
attempt += 1
continue
if response.status >= 500:
sleep(2 ** attempt) # exponential
attempt += 1
continue
raise APIError(response) # 4xx other than 429幂等性
某些操作会从钱包扣费 — 简单重试可能导致重复扣款。
POST /activations 非幂等
如果你重试一个成功的 POST /activations,会创建第二次激活并被收费两次。任何超时或不明响应时,先用 GET /activations 验证状态再重试。
