> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fingopay.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Rate limits

> Default limits, retry guidance, and how to request higher throughput

## Default limits

| Scope       | Limit        | Window                                   |
| ----------- | ------------ | ---------------------------------------- |
| Per account | 600 requests | 1 minute                                 |
| Burst       | Allowed      | Short 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.

<ResponseExample>
  ```json 429 Too Many Requests theme={"dark"}
  {
    "error": {
      "type": "rate_limit_error",
      "code": "too_many_requests",
      "message": "Rate limit exceeded. Retry after 12 seconds.",
      "requestId": "req_abc123"
    }
  }
  ```
</ResponseExample>

## Handling 429 responses

<Steps>
  <Step title="Respect the Retry-After header">
    The response header tells you exactly how long to wait before retrying.

    ```http theme={"dark"}
    Retry-After: 12
    ```
  </Step>

  <Step title="Use exponential backoff">
    If `Retry-After` is not present, implement exponential backoff starting at 1 second with a maximum of 60 seconds.

    <CodeGroup>
      ```javascript Node.js theme={"dark"}
      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');
      }
      ```

      ```python Python theme={"dark"}
      import time, requests

      def request_with_backoff(fn, max_retries=3):
          for attempt in range(max_retries + 1):
              res = fn()
              if res.status_code != 429:
                  return res
              retry_after = res.headers.get("Retry-After")
              delay = int(retry_after) if retry_after else min(2 ** attempt, 60)
              time.sleep(delay)
          raise Exception("Rate limit exceeded after max retries")
      ```
    </CodeGroup>
  </Step>

  <Step title="Add idempotency keys">
    Always include an `Idempotency-Key` header on POST requests so retries do not create duplicate transactions.
  </Step>
</Steps>

<Tip>
  For batch operations or sustained high-volume traffic, contact [integrations@fingo.africa](mailto:integrations@fingo.africa) to request a higher rate limit.
</Tip>
