跳到正文
LinkProfit

速率限制

按 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 而不是轮询:事件会在几秒内推送给你,并且完全不消耗请求配额。