速率限制
按 API 密钥统计的滑动窗口限制、X-RateLimit 系列响应头,以及正确的重试策略。
更新于 2026年8月13日
限额按密钥统计,采用 1 分钟的滑动窗口。默认值:工作区密钥 600 次请求/分钟,合作伙伴密钥 1200 次;你的套餐可能设置了不同的数值,实际限额始终以响应头为准。
响应头
每个响应都会带上当前状态:
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 273
X-RateLimit-Reset: 1755081600
X-RateLimit-Limit—— 该密钥在一个窗口内的容量。X-RateLimit-Remaining—— 当前窗口内剩余的请求数。X-RateLimit-Reset—— 窗口释放的 Unix 时间(秒)。
超出限额时,API 返回 429,并附带 Retry-After:
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded, retry later",
"doc_url": "https://linkprofit.com/docs/api/errors"
}
}
Retry-After: 12
窗口是滑动的
计数器不会在整分钟时清零:10:00:55 的突发请求,在 10:01:05 时仍然计入窗口。请按平稳的速率来规划请求,而不是按分钟对齐的突发流量。
被拒绝的请求同样会计入统计——收到 429 后紧密循环重试,只会让密钥一直处于封锁状态。
行为正确的重试
async function withRateLimit(request) {
for (let attempt = 0; attempt < 5; attempt += 1) {
const response = await request();
if (response.status !== 429) return response;
const wait = Number(response.headers.get("retry-after") ?? "1");
await new Promise((resolve) => setTimeout(resolve, wait * 1000 + attempt * 250));
}
throw new Error("Rate limit retries exhausted");
}
请遵循 Retry-After 给出的等待时间,而不是自己猜测;加入抖动,避免并行的工作进程同步重试;并且限制重试次数的上限。
如何保持在限额之内
- 关注
X-RateLimit-Remaining,在归零之前主动降速。 - 使用
POST /links/bulk——一个请求最多创建 100 条短链接。 - 优先使用 Webhook 而不是轮询:事件会在几秒内推送给你,并且完全不消耗请求配额。