指南
速率限制
请求限额、Header 与 429 退避
各套餐限额
| 套餐 | 请求限额 | 并发 | 适用场景 |
|---|---|---|---|
| Free | 每分钟 10 次 | 2 并发 | 测试与原型 |
| Pro | 每分钟 100 次 | 10 并发 | 生产应用 |
| Enterprise | 每分钟 1000 次 | 50 并发 | 大规模运营 |
响应 Header
每次响应都会带上速率限制 Header:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1714137600X-RateLimit-Reset 是 Unix epoch 时间戳。
处理 429
碰到 429 RATE_LIMIT_EXCEEDED 时,退避到 X-RateLimit-Reset 时间点 —— 不要盲目重试。再叠加指数退避来应对瞬时错误:
import httpx, time
def call(url: str, headers: dict, body: dict, max_attempts: int = 5):
for attempt in range(max_attempts):
r = httpx.post(url, headers=headers, json=body, timeout=60.0)
if r.status_code != 429:
r.raise_for_status()
return r.json()
reset = int(r.headers.get("X-RateLimit-Reset", "0"))
wait = max(reset - int(time.time()), 2 ** attempt)
time.sleep(wait)
raise RuntimeError("rate-limited after retries")对批量任务,宁可发更少的大批次也不要发很多小批次 —— 一个 50 URL 的批次只算速率限制里的 1 次请求,而不是 50 次。