Rate Limits & Quotas
Ingestion is capped by two independent layers, bucketed differently and behaving differently when you go over:
- the per-minute burst limit is per project, and returns
429; - the event quota is per account — shared by every project you own — and silently drops the report.
1. Per-minute burst limit
Smooths spikes — for example a bad deploy that makes thousands of users error at once. Bucketed per project (not per IP, not per key), so one noisy project can never eat another's burst budget. It scales with the project's plan:
| Plan | Burst (events / minute, per project) |
|---|---|
| Hobby | 60 |
| Indie | 100 |
| Professional | 200 |
| Team | 500 |
Every response carries X-RateLimit-Limit and X-RateLimit-Remaining. Going
over returns 429 with a Retry-After of a small number of seconds — back
off briefly and retry.
2. Event quota
The hard cap on total volume. It belongs to your account, not to any one project: every project you own draws on the same pool.
The allowance is measured over a day, which bounds what a mistake can cost you. A runaway loop or a retry storm burns one day's allowance and stops; the allowance refills at midnight UTC and you are reporting again, without contacting us.
| Plan | Daily events (across all projects) |
|---|---|
| Hobby | 300 |
| Indie | 1,000 |
| Professional | 3,000 |
| Team | 20,000 |
Exhausting the quota does not return an error. The server responds
200 with { "dropped": true, "reason": "quota" } (no card is created) and
silently drops the report — a monitoring SDK should never surface a billing
limit as a failure in the app it watches. There is no Retry-After; the quota
resets at midnight UTC, so don't retry dropped reports.
You are not left to discover this from the drop. Everyone on the project who can act on it — the owner, admins and members, but not viewers — is emailed as the account passes 75%, 90% and 100% of the allowance, and each warning names the task cards drawing the most events so a runaway integration is easy to spot. Each warning is sent once per day at most.
One project cannot drain the whole pool
Because the pool is shared, a single leaked key or runaway project could in principle spend your entire allowance and leave every other project unable to report. It cannot: once an account has more than one active project, no single project may consume more than 80% of the account's pool.
This is a containment ceiling, not a budget. An account whose traffic is legitimately concentrated in one busy project is never squeezed by it, and an account with a single project is not subject to it at all.
Paused and archived projects
Only an active project accepts events. A paused or archived project is
read-only, and that applies to the API exactly as it does to the dashboard: it
answers 200 with { "dropped": true, "reason": "paused" } (or "archived"),
creates no card, and spends none of your quota.
Pausing is reversible and frees the plan slot the project was holding, so it is how you choose which projects stay live when your plan has room for fewer than you have active. Resume the project and ingestion resumes with it. See Error Codes for what to do with each drop reason.
Designing for bursts
Errors are bursty by nature. Whether you call the API directly or use an SDK:
- Honour
Retry-Afterand back off — never hammer a429. - Sample under load (
sampleRate < 1) so a spike sends a representative fraction rather than every occurrence. This is the single most effective guard against a bad deploy spending a whole day's allowance in minutes. - Bound concurrency so you never self-inflict the burst limit.
- Rely on deduplication — repeat reports collapse onto one card (matching on title or description), so a spike of the same error costs one card rather than thousands. The differing payloads are still kept beneath it as variants. See the API Reference.
There is no bulk endpoint — one card per request. The SDKs achieve throughput with a bounded-concurrency queue plus sampling and backoff, not a batch call.
Need more headroom?
Upgrade your plan for higher burst and event limits, or get in touch about a custom limit. See current limits and pricing on the pricing page.