本文へスキップ
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はRetry-Afterを添えて429を返します。

{
  "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を使ってください。1回のリクエストで最大 100本のリンクを作成できます。
  • ポーリングよりWebhookを選んでください。イベントは数秒以内に届き、 リクエストを一切消費しません。