# Limits

Every limit an agent can meet, with the error it returns ([error codes](https://carnival-staging.dev/docs/errors.md)). Plan values come from Carnival's plans table; only the public plans are listed.

## Sites

| Limit | Free plan | When exceeded |
|---|---|---|
| Live sites per account | 3 | [`LIVE_SITE_LIMIT_REACHED`](https://carnival-staging.dev/docs/errors/LIVE_SITE_LIMIT_REACHED.md) |
| Site lifetime | 7 days from the first publish; updates keep it | — |
| Files per site | 250 | [`TOO_MANY_FILES`](https://carnival-staging.dev/docs/errors/TOO_MANY_FILES.md) |
| Site size | 25 MiB (26,214,400 bytes) | [`SITE_TOO_LARGE`](https://carnival-staging.dev/docs/errors/SITE_TOO_LARGE.md) |
| File size (decoded) | 4 MiB (4,194,304 bytes) | [`FILE_TOO_LARGE`](https://carnival-staging.dev/docs/errors/FILE_TOO_LARGE.md) |

Site traffic is subject to [fair use](https://carnival-staging.dev/terms#fair-use).

## Each `carnival_deploy` call

| Limit | Free plan | When exceeded |
|---|---|---|
| Decoded file bytes per call | 4 MiB (4,194,304 bytes) | [`PAYLOAD_TOO_LARGE`](https://carnival-staging.dev/docs/errors/PAYLOAD_TOO_LARGE.md) |
| Files with content in a call with `finalize=false` (`{path, sha256}` entries not counted) | 72 | [`TOO_MANY_FILES_IN_CALL`](https://carnival-staging.dev/docs/errors/TOO_MANY_FILES_IN_CALL.md) |
| Entries in a call with `finalize=true` (`{path, sha256}` entries counted) | 30 | [`TOO_MANY_FILES_IN_CALL`](https://carnival-staging.dev/docs/errors/TOO_MANY_FILES_IN_CALL.md) |
| `files` entries | 250 | schema validation (uncoded `Input validation error` text) |
| `delete_paths` entries | 250 | schema validation (uncoded `Input validation error` text) |
| Pieces of one file (`parts`) | 2–128 | schema validation (uncoded `Input validation error` text) |
| Path length | 200 characters | schema validation (uncoded `Input validation error` text) |
| `title` length | 80 characters | schema validation (uncoded `Input validation error` text) |
| Staged upload (`deploy_id`) lifetime | 60 minutes from its first call | [`DEPLOY_EXPIRED`](https://carnival-staging.dev/docs/errors/DEPLOY_EXPIRED.md) |

A request to `/mcp` carries at most 8 MiB (8,388,608 bytes); a larger body gets HTTP 413. On Muse, keep each call's arguments under about 90 KB: send files over several calls with `finalize=false`.

## Rates

| Limit | Free plan | When exceeded |
|---|---|---|
| Publishes per UTC hour (the dashboard's Redeploy included) | 20 | [`RATE_LIMITED`](https://carnival-staging.dev/docs/errors/RATE_LIMITED.md) (`finalizes_per_hour`) |
| Publishes per UTC day | 100 | [`RATE_LIMITED`](https://carnival-staging.dev/docs/errors/RATE_LIMITED.md) (`deploys_per_day`) |
| New sites per UTC day (fewer for new and restricted accounts) | 10 | [`RATE_LIMITED`](https://carnival-staging.dev/docs/errors/RATE_LIMITED.md) (`new_sites_per_day`) |
| Content rejections before publishing pauses | 5 per UTC day, then paused for 24 hours | [`REJECTION_COOLDOWN`](https://carnival-staging.dev/docs/errors/REJECTION_COOLDOWN.md) |

Request rates (every plan; approximate, counted per Cloudflare location):

| Limit | Rate | When exceeded |
|---|---|---|
| `carnival_deploy` calls | 30 per minute | [`RATE_LIMITED`](https://carnival-staging.dev/docs/errors/RATE_LIMITED.md) (`calls_per_minute`) |
| `carnival_status` and `carnival_logs` calls (counted apart from deploys) | 30 per minute | [`RATE_LIMITED`](https://carnival-staging.dev/docs/errors/RATE_LIMITED.md) (`calls_per_minute`) |
| Requests to `/mcp` with a body over 1 MiB (1,048,576 bytes), or with no `Content-Length` (counted apart) | 30 per minute | HTTP 429 (`Retry-After: 60`) |
| Client registrations (`POST https://carnival-staging.dev/register`), per IP address | 10 per minute | HTTP 429 |
| Sign-in and consent pages, per IP address | 30 per minute | HTTP 429 |

A limit result carries `error.retry_after_seconds`: wait that long, never retry in a loop.
