Limits and Quotas
Engram Limits
Per-Request Limits
| Resource | Limit | Notes |
|---|---|---|
Messages per append_messages call | 200 | Batch your messages in groups of 200 or fewer |
Search results (limit param) | 50 max | Default: 10 |
Messages per get_conversation (message_limit) | 500 max | Default: 100. Use pagination for longer conversations |
Conversations per list_conversations (limit) | 100 max | Default: 20. Use offset for pagination |
Data Limits
| Resource | Limit | Notes |
|---|---|---|
| Message content size | No hard limit | Practical limit ~100KB per message. D1 TEXT fields have no defined max |
| Tags per conversation | No hard limit | Stored as JSON array. Keep reasonable for query performance |
| Metadata size | No hard limit | Stored as JSON object. Keep under a few KB |
| Title length | No hard limit | TEXT field |
Memory Storage
Memory works like storage: it fills up as you store messages, nothing ever expires or is deleted, and deleting conversations frees space. Upgrading raises the ceiling. There is no monthly cap on the Free plan.
| Plan | Memory storage |
|---|---|
| Free | 10,000 messages |
| Pro | 1,000,000 messages |
| Team | 1,000,000 messages per seat, pooled across the team |
| Enterprise | Unlimited |
Monthly Velocity Guard (paid plans)
Storage is the quota; velocity is a guard. To keep the platform healthy, paid plans also cap how many messages can be stored per calendar month: 100,000/month on Pro and 500,000/month pooled on Team (the Free plan has no monthly cap — its storage ceiling is the only gate). Hitting the guard returns 429 message_limit_exceeded until the month rolls over; nothing is lost, and search and reads are unaffected.
Most users never notice it. The one place it matters is bulk history imports — importing a very large ChatGPT/Claude archive on a fresh account can reach the guard mid-import. If that’s you, contact us and we’ll lift it for the import.
Memory Retention
Permanent on every plan. Memories are never archived, expired, or deleted — your data stays until you delete it.
Chunking Parameters
| Parameter | Value | Description |
|---|---|---|
| Window size | 5 messages | Number of messages per chunk |
| Stride | 3 messages | Step between consecutive chunk starts |
| Overlap | 2 messages | Messages shared between adjacent chunks |
These are fixed in the current release. Configurable chunking is on the roadmap.
Estimating Usage
Storage
Message content is gzip-compressed before storage, reducing space by roughly 3×. A typical message is ~3 KB raw and ~1 KB compressed. With chunk overhead, roughly 35 KB per 100-message conversation.
Short messages (<128 bytes) are stored uncompressed — gzip headers would make them larger.
Vectors
Each chunk produces one 768-dimensional vector. With a window of 5 and stride of 3, a 100-message conversation produces roughly 33 chunks.
Requests
Each append_messages call is one API request, as is each search — whether it arrives via MCP or the REST API. Your monthly request count is shown on the dashboard ; per-minute rate limits are below.
Rate Limiting
Requests are rate-limited per organization as burst protection: 30 requests/minute on Free, 120 on Pro, 300 on Team, and 600 on Enterprise. These are velocity caps, not billing meters — your monthly API usage is shown on the dashboard .