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

# Rate limits

> How many requests a team can make, and how to stay under

## Limits

| Window | Requests |
| - | - |
| Per minute | 300 |
| Per hour | 10,000 |
| Per day | 100,000 |

Limits are per team. Every API token and the MCP server share them.

## Headers

Every response, errors included, carries:

| Header | Value |
| - | - |
| `X-RateLimit-Limit` | The limit of the window with the fewest requests left |
| `X-RateLimit-Remaining` | Requests left in that window |
| `X-RateLimit-Reset` | When that window resets, as Unix time in milliseconds |

## When you hit one

```json theme={null}
{
  "code": "rateLimited",
  "message": "The team exceeded its API rate limit.",
  "details": {
    "window": "minute",
    "limit": 300,
    "resetAt": "2026-09-14T10:33:00.000Z"
  },
  "requestId": "req_tz4a98xxat96iws9zmbrgj3a"
}
```

The response is `429` with a `Retry-After` header, in seconds.

```typescript retry.ts theme={null}
async function withRetry(
  send: () => Promise<Response>,
  attempts = 5,
): Promise<Response> {
  for (let attempt = 0; attempt < attempts; attempt++) {
    const response = await send();

    if (response.status !== 429 && response.status !== 503) return response;

    const retryAfter = Number(response.headers.get("Retry-After") ?? 1);
    const jitter = Math.random() * 250;

    await new Promise((resolve) =>
      setTimeout(resolve, retryAfter * 1000 + jitter),
    );
  }

  throw new Error(`Still rate limited after ${attempts} attempts`);
}
```

## Platform limits

Platforms limit each of your accounts separately from the API. When one does, the response is `429 platformRateLimited`, with `details.retryAfterSeconds` when the platform gives one. Other accounts keep working.

## Stay under

* **Use webhooks instead of polling.** One [webhook](/v2/webhooks/overview) replaces a loop over `GET /threads`.
* **Expand instead of fetching again.** `?expand=contact&expand=profile` saves two requests per thread.
* **Look up in batches.** `GET /contacts` takes up to 100 `platformId` values in one call.
* **Page with `limit=100`.** The default is 50.


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