# Rate limits

> How many requests per minute the Slicer API accepts per token, the X-RateLimit headers, the 429 response and other v1 limits.

Source: https://docs.slicer.media/en/api/rate-limits/

Rate limits protect the service from runaway loops and overload. They are counted **per token** (for apps connected via OAuth — per connection), not per IP address: two of your services with different tokens don't affect each other.

## Requests per minute

| Bucket | Limit | Which requests |
| --- | --- | --- |
| Regular | 120 per minute | everything except the ones below |
| Paid operations and rendering | 30 per minute | creating a project, rebuild, retry, AI assistant, caption translation, export |
| Upload parts | 1200 per minute | `PUT /v1/uploads/{id}/parts/{n}` |

The [reference](https://docs.slicer.media/en/api/reference/) shows which bucket each endpoint belongs to. The window is one minute. Values may change; the current ones always come in the response headers.

## Headers

Every API response carries the current state of the limit:

| Header | Value |
| --- | --- |
| `X-RateLimit-Limit` | how many requests are allowed in the window for this bucket |
| `X-RateLimit-Remaining` | how many are left in the current window |
| `X-RateLimit-Reset` | when the window resets — Unix time in seconds |
| `Retry-After` | only in a 429 response: how many seconds to wait before retrying |

429 response:

```http
HTTP/1.1 429 Too Many Requests
Retry-After: 17
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1792152060

{
  "ok": false,
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Too many requests: no more than 120 per minute per token",
    "retryAfterSec": 17
  }
}
```

## Staying within the limit

-   **Poll status every 5 seconds**, not more often: a montage takes minutes, and frequent polling won't speed it up. Better yet, use [webhooks](https://docs.slicer.media/en/api/webhooks/): they arrive on their own and don't use up the limit.
-   **Upload parts in parallel, but in moderation** — 4–6 streams are enough to upload a large file quickly.
-   **Cache the catalog** `GET /v1/styles` — it rarely changes.
-   On 429, wait `Retry-After` seconds and repeat the same request with the same `Idempotency-Key` — see [Errors](https://docs.slicer.media/en/api/errors/).

## Other limits

| What | Limit |
| --- | --- |
| Active API tokens per account | 20  |
| Webhooks per account | 5   |
| Materials in one project (`uploadIds`) | up to 20; exact limits per kind — `GET /v1/styles` → `materialLimits` |
| Concurrent imports from URLs | 3 per account; more — `429 too_many_imports` |
| Operations in one edit request | up to 80 |
| Publications in one export | up to 8 accounts |
| Upload link `uploadUrl` | one file, up to 1 hour |
| Webhook response timeout | 10 seconds |

File size, duration and format limits are the same as in the app: [File formats and limits](https://docs.slicer.media/en/guide/help/files/).

Besides per-token limits, the service has general overload protection by network address — normal use doesn't run into it.

## What's next

[ErrorsError codes and what to retry.](https://docs.slicer.media/en/api/errors/)[WebhooksEvents instead of polling.](https://docs.slicer.media/en/api/webhooks/)
