Skip to content
P
Back to Guides

Rate limits

Per-plan limits and the X-RateLimit-* / Retry-After response headers.

How limiting works

Requests are rate-limited over a rolling one-minute window. Integrations — API keys and tokens from POST /api/v1/auth/login — are limited per organisation: your per-minute allowance is set by your plan, and all of an organisation's keys share the same window. Sandbox traffic is metered in a separate bucket, so exploring the API never eats your production quota.

People working in PIE's own apps are limited differently, because a single page makes many requests: each signed-in user has their own allowance of 600 requests per minute, and all of an organisation's signed-in users together may use up to five times the plan's allowance. Browser sessions therefore never use up the quota your integrations depend on.

Sign-in attempts are limited separately and count failures only: ten failed attempts for one account from one IP address, or fifty from one IP address across accounts, within 15 minutes. Successful sign-ins never count.

Response headers

Every response reports your current standing:

  • X-RateLimit-Limit — the maximum requests allowed in the window.
  • X-RateLimit-Remaining — requests still available in the current window.
  • Retry-After — sent only on a 429; the number of seconds to wait before retrying.

Handling 429 Too Many Requests

When you exceed the limit, PIE responds 429 with the standard error envelope and a Retry-After header:

HTTP/1.1 429 Too Many Requests
Retry-After: 12

{ "error": { "code": "RATE_LIMITED", "message": "Too many requests" } }

Back off for at least Retry-After seconds before retrying. A robust client honours the header and adds jitter to avoid a synchronised retry storm:

async function call(url, key) {
  for (let attempt = 0; ; attempt++) {
    const res = await fetch(url, { headers: { "X-API-Key": key } });
    if (res.status !== 429) return res;

    const wait = Number(res.headers.get("Retry-After") ?? 1);
    await sleep((wait + Math.random()) * 1000);
  }
}

Watch X-RateLimit-Remaining and slow down proactively rather than waiting for a 429. Repeated 429s on an API key raise a rate-limit warning notification to your org admins.