Skip to main content

Default limits

ScopeLimitWindow
Per account600 requests1 minute
BurstAllowedShort bursts above 600/min are tolerated
Exceeding the limit returns 429 Too Many Requests with a Retry-After header indicating how many seconds to wait.
{
  "error": {
    "type": "rate_limit_error",
    "code": "too_many_requests",
    "message": "Rate limit exceeded. Retry after 12 seconds.",
    "requestId": "req_abc123"
  }
}

Handling 429 responses

1

Respect the Retry-After header

The response header tells you exactly how long to wait before retrying.
Retry-After: 12
2

Use exponential backoff

If Retry-After is not present, implement exponential backoff starting at 1 second with a maximum of 60 seconds.
async function requestWithBackoff(fn, maxRetries = 3) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const res = await fn();
    if (res.status !== 429) return res;

    const retryAfter = res.headers.get('Retry-After');
    const delay = retryAfter
      ? parseInt(retryAfter, 10) * 1000
      : Math.min(1000 * Math.pow(2, attempt), 60000);
    await new Promise((r) => setTimeout(r, delay));
  }
  throw new Error('Rate limit exceeded after max retries');
}
3

Add idempotency keys

Always include an Idempotency-Key header on POST requests so retries do not create duplicate transactions.
For batch operations or sustained high-volume traffic, contact integrations@fingo.africa to request a higher rate limit.