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

# Rate Limit Exceeded

> Too many requests per minute

**HTTP Status:** 429

```json theme={null}
{
  "code": "rate_limit_exceeded",
  "message": "Rate limit exceeded for your plan. Retry with exponential backoff.",
  "request_id": "req_3f6a2c1e-9b0d-4e7a-8c21-5d1f0a9b7e42",
  "doc_url": "https://docs.poof.bg/errors/rate-limit-exceeded"
}
```

## Rate Limits by Plan

Each organisation has a token bucket that is refilled every minute. The bucket size depends on your plan:

| Plan | Requests per minute |
| - | - |
| Free | 4 |
| Basic | 8 |
| Pro | 12 |
| Mega | 40 |
| Ultra | 100 |
| Giga | 200 |

In addition, a global limit of 10,000 requests per minute applies per IP address. There is no concurrency limit.

Rate-limited requests are not billed. The `/me` endpoint is not rate limited.

## Reasons and How to Fix

### Too Many Requests

You're sending requests faster than your plan's per-minute limit allows.

**To fix:**

1. Implement exponential backoff in your code
2. Spread requests evenly over the minute rather than sending them in a burst
3. Upgrade to a higher plan for a larger per-minute limit

### No Retry-After Header

The API does not send a `Retry-After` header. Use exponential backoff with jitter and retry; the bucket refills within a minute.

**Best Practices:**

```python theme={null}
import time
import random
from poof import RateLimitError

def call_with_backoff(func, max_retries=5):
    for attempt in range(max_retries):
        try:
            return func()
        except RateLimitError:
            wait = (2 ** attempt) + random.uniform(0, 1)
            time.sleep(wait)
    raise Exception("Max retries exceeded")
```

```typescript theme={null}
async function callWithBackoff(fn: () => Promise<any>, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await fn();
    } catch (e) {
      if (e.code !== 'rate_limit_exceeded') throw e;
      const wait = Math.pow(2, attempt) + Math.random();
      await new Promise(r => setTimeout(r, wait * 1000));
    }
  }
  throw new Error('Max retries exceeded');
}
```

### Batching in Workflow Tools

In n8n, Zapier or Make, keep each batch at or below your plan's per-minute limit and wait 60 seconds between batches. For example, on the Free plan send 4 requests, then wait 60 s; on Pro send up to 12, then wait 60 s.

## Need Help?

Contact us at [support@poof.bg](mailto:support@poof.bg) with your `request_id` if you need higher limits.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.