# Limits

The chat endpoint enforces every limit below on every request, whatever the SDK composer already checked. Narrowing a limit through an SDK option is a UX affordance, not a boundary.

## Requests

| Limit | Value | When it is exceeded |
| --- | --- | --- |
| Request body | 32 MB, checked against `content-length` and again while reading | `413`, "The message and its attachments are too large." |
| Rate limit | 20 requests per 60 seconds, counted per organization, tenant, and tenant user | `429`, "Too many chat requests; try again in a minute." |
| Chat auth token lifetime | 60–600 seconds, 300 by default | `createAstralBeamToken` throws, a token outside the range is rejected as invalid |
| Chat auth token size | 16,384 bytes | minting throws, and a longer bearer header is rejected before it is verified |
| `user` and `tenant` claims | 8,192 bytes of JSON | minting throws "user and tenant must not exceed 8192 bytes" |
| Clock difference | 30 seconds either way | the token reads as expired or not yet valid, the composer offers a retry |

## Attachments

A refused file keeps its chip in the composer, and the agent is told in one sentence that the file could not be included and why.

| Limit | Value | What the agent is told |
| --- | --- | --- |
| Files per message | 5 | "the message went over the limit of 5 attachments." |
| One file, by kind | 5 MB image, 10 MB PDF, 1 MB text, 10 MB data, 10 MB office | "it is larger than the 5.0 MB limit for that file type." |
| All files on one message | 20 MB | "the message went over the 20 MB attachment limit." |
| Accepted types | PNG, JPEG, WebP, GIF, PDF, text and source files, CSV, TSV, Parquet, SQLite, `.docx`, `.pptx`, `.xlsx` | "this assistant reads images, PDFs, text and source files, CSV and TSV data, Word, Excel, and PowerPoint files." |
| Declared type | must match the file's leading bytes | "its contents are not a `<type>` file." |
| Filename | 120 characters | truncated with an ellipsis rather than refused |

## Files the agent reads

| Limit | Value | What happens at the limit |
| --- | --- | --- |
| Office archive | 96 MB declared uncompressed, 2,048 kept parts, 4,096 entries walked | "it declares more content than this assistant will unpack." |
| Table shape | 50,000 rows, 512 columns, 200,000 cells per sheet | cells outside the bounds are skipped and the table is reported as truncated |
| Column type profile | the first 50 data rows | types stay a hint the agent should confirm against the file itself |
| Readable text per file | 2,000,000 characters | `read_attachment` returns `readableTextTruncated: true` |
| One `read_attachment` page | 40,000 characters, whatever `limit` asks for | the result carries `nextOffset` to read on from |

## Sandbox and artifacts

| Limit | Value | What happens at the limit |
| --- | --- | --- |
| Idle sandbox | 15 minutes, swept every minute | destroyed, the conversation's next turn provisions a new one |
| Live sandboxes | 25 per server process | the least recently used sandbox is destroyed |
| Published artifact | 10 MB | "Artifacts are limited to 10485760 bytes. Compress or split the file." |
| Artifact download ticket | 15 minutes | `404`, "The download has expired. Ask the agent to publish the file again." |
| Text in the transcript | 20,000 characters of command output, 40,000 of a file read, 200,000 of a file write | clamped with the middle elided |

These limits are enforced by the deployment and cannot be raised through SDK options.

---

- Parent: [Documentation index](https://app.astralbeam.ai/docs.md)
- Previous: [SDK: Attachments](https://app.astralbeam.ai/docs/sdk/attachments.md)
- Next: [SDK: Sandbox](https://app.astralbeam.ai/docs/sdk/sandbox.md)
