Limits & quotas
#Plan allowances
Allowances are per project, per calendar month. See pricing for prices.
| Unclaimed (14 days) | Free trial (14 days) | Starter | Team | Enterprise |
| Members | none (read-only via the claim secret) | unlimited | 1 | unlimited | custom |
| Events / month | 250,000 | 250,000 | 250,000 included | 250,000 included | custom |
| Session replays / month | 2,500 | 2,500 | 2,500 included | 2,500 included | custom |
| Storage | 10 GB | 10 GB | 10 GB-months included | 10 GB-months included | custom |
| Sites | unlimited | unlimited | unlimited | unlimited | custom |
| Web analytics, session replay, reading data | ✓ | ✓ | ✓ | ✓ | ✓ |
| API keys, MCP, writes, erasures, members, settings | | ✓ | ✓ | ✓ | ✓ |
| ClickHouse SQL | | ✓ | ✓ | ✓ | ✓ |
| Beyond the included usage | collection pauses | collection pauses | pay as you go | pay as you go | contract |
- An event is each web analytics event (pageview, click, …) or each entry inserted via the API.
- A replay is one recorded session in one browser tab.
- A site is a hostname that sent events. One snippet works on any number of them.
- Storage is the compressed size of your streams plus your ClickHouse tables, measured hourly.
- On Starter and Team, usage beyond the included amount is billed: events $2 per 1M (first 100M), then $1 per 1M; replays $0.50 per 1,000 (first 100,000), then $0.25 per 1,000; storage $0.10 per GB-month.
- The trial has no card on file, so its limits are hard: collection pauses at a limit until you pick a plan. Data you already collected is untouched.
- An unclaimed project is one created by a snippet from analytics.capless.sh that nobody has claimed yet. Its limits are hard, and it is deleted with all its data 14 days after it was created unless it is claimed. Claiming starts the 14-day trial (or needs a plan if the account already had a trial) and keeps the data.
- Data is kept until you delete it (erasures, or deleting a stream); deleted data stops counting toward storage once it is purged.
#Spend cap
On Starter and Team, owners and admins can set a monthly limit on the whole bill (plan price plus usage beyond the included amount), in USD, at least 5:
curl -s -X PATCH https://api.capless.sh/v1/billing -H "authorization: Bearer $CAPLESS_API_KEY" -d '{"spendCap":50}'
# → {"spendCap":50}; {"spendCap":null} removes it
When the period's estimated bill reaches the cap, collection pauses (402 spend_cap_reached) until the next period or until you raise or remove the cap. Data you already collected is untouched. It is off by default, and it is the protection against traffic you did not expect, for example from a copied snippet.
#API
| Limit | Value |
| Request body | 8 MiB (413 request_too_large) |
| Entries per batch | 1–100 000 |
| Entry size / depth | 1 MiB / 32 levels |
| Idempotency key | ≤ 256 characters, kept 7 days |
| Stream and materialization names | ^[A-Za-z0-9][A-Za-z0-9_.\-]{0,127}$ (names starting with $ are built-in) |
| List page size | 1–1000 (default 100) |
| Commits per stream | on the order of 1000/s; batch, or shard hot streams |
#Reads
| Limit | Default | Max |
limitReadEntries (positions examined) | 10 000 | 1 000 000 |
limitResultEntries | 1 000 | 100 000 |
limitReadBytes (stored bytes examined) | 16 MiB | 256 MiB |
limitBytes (result bytes) | 1 MiB | 32 MiB |
Inlined erasure IDs in /changes | 1000 | |
Erasure affected-ID page (limit) | 1000 | 10 000 |
#CEL
| Limit | Value |
| Expression length | 4096 characters |
| AST nodes / depth | 1000 / 32 |
| Nested comprehensions | 2 |
| Literal list elements / map entries | 256 / 256 |
#ClickHouse queries
| Limit | Value |
| Statements per request | 1 |
| Time / memory | 30 s / 4 GB |
Returned rows (maxRows) | default 10 000, max 100 000 |
#Web collector
| Limit | Value |
| Payload per request | 1 MiB compressed, 4 MiB decompressed |
| Session timeout | 30 minutes of inactivity |
| New projects (first event of an unknown key) | 20 per minute per IP address (429 rate_limited) |
This page as Markdown