Limits
| Plan | Events a month | History | Projects | Destinations per project | Largest batch | Price |
|---|---|---|---|---|---|---|
| Free | 10,000 | 7 days | 2 | 2 | 4 MiB | $0 |
| Pro | 500,000 | 30 days | 10 | 10 | 16 MiB | Pricing coming soon |
| Business | 5,000,000 | 90 days | 50 | 25 | 32 MiB | Pricing coming soon |
The same table, with what each plan includes, is on the pricing page.
What counts as an event
Section titled “What counts as an event”One element of the JSON array your producer posts. A batch of 40 events is 40, whatever their type. Debug events count only when the project keeps them, which is a per-project switch on Projects.
Events refused because the batch was malformed, too large or past quota are not stored and are not counted against the allowance. They are counted as rejected, so a sender that has been failing for a week is visible rather than silent.
Going over the monthly allowance
Section titled “Going over the monthly allowance”Nothing is dropped on the spot. Events keep being accepted and stored for 24 hours past the limit, marked as over quota, so an incident in the last week of the month does not go dark.
After that window the ingest endpoint answers 429 with RESOURCE_EXHAUSTED. A patrol.Client surfaces it as a patrol.ServerError, and patrol.ErrorCodeResourceExhausted is the constant to switch on. Your own destinations, the ones configured in the library and delivered from your process, are untouched the whole time: they never went through us.
Batch size
Section titled “Batch size”Two ceilings, and the lower one wins:
patrol.MaxRequestBody, 32 MiB, is the library’s own cap. Above it the answer is413withPAYLOAD_TOO_LARGE.- The plan’s largest batch, from the table above. Above it the answer is the same
413.
MaxBatchSize on the producer is the knob. The default of 100 events is nowhere near either limit unless events carry files: one WithFile of a megabyte, a hundred times, is a hundred megabytes.
Retention
Section titled “Retention”Events are deleted when the plan’s window passes, counted from when they were received. There is no archive and no export tier; if you need history beyond the window, add patrol.SQL as a second flusher on the same producer and keep your own copy. Flushers are independent, so both destinations receive the same batch.
Rate limits
Section titled “Rate limits”Ingest is rate limited per key, generously enough that a normal batching producer never meets it: the default 5-second buffer interval is one request per key every five seconds. Failed authentication is limited per address, which is the case where a wrong key in a restart loop would otherwise hammer the endpoint.
Which limit stopped me
Section titled “Which limit stopped me”Every refusal carries a code, so the answer is in the error rather than in a support thread:
| Code | Status | Meaning |
|---|---|---|
UNAUTHENTICATED |
401 | The key is wrong, revoked, or missing |
PAYLOAD_TOO_LARGE |
413 | The batch is over the plan’s cap or over 32 MiB |
INVALID_ARGUMENT |
400 | The body is not a JSON array of events |
RESOURCE_EXHAUSTED |
429 | Past the monthly allowance and past the 24-hour grace |
UNAVAILABLE |
503 | We are having a bad day. Retry later |