|
| 1 | +--- |
| 2 | +title: Rate limiting |
| 3 | +--- |
| 4 | + |
| 5 | +import { CalloutBox } from 'components/Docs/CalloutBox' |
| 6 | + |
| 7 | +Rate limits cap how many exception events PostHog ingests, so a single noisy client or runaway issue can't blow through your quota – or your bill. Exceptions received above the configured rate are dropped at ingestion, before they're [stored or billed](/docs/error-tracking/pricing). |
| 8 | + |
| 9 | +## How rate limiting works |
| 10 | + |
| 11 | +PostHog applies rate limits using a token bucket. You set a **maximum number of exceptions** and a **time window** (for example, 10,000 exceptions per hour). The bucket holds up to that maximum and refills steadily across the window, so short bursts are absorbed while sustained over-the-limit volume is capped. Exceptions that arrive when the bucket is empty are dropped at ingestion. |
| 12 | + |
| 13 | +Because dropped exceptions are never ingested, they don't count toward your bill. |
| 14 | + |
| 15 | +There are two types of rate limit. They're applied independently, and you can use either or both. You can configure both in the [Error Tracking configuration page](https://app.posthog.com/error_tracking/configuration#selectedSetting=error-tracking-rate-limits). |
| 16 | + |
| 17 | +### Project-wide rate limit |
| 18 | + |
| 19 | +This limit applies across your entire project, regardless of which issue an exception belongs to. It acts as a single safety cap on total exception volume. |
| 20 | + |
| 21 | +<ProductScreenshot |
| 22 | + imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/pasted_image_2026_06_07_T14_08_44_937_Z_c8badbee44.png" |
| 23 | + imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/pasted_image_2026_06_07_T14_04_59_591_Z_1f50e085fa.png" |
| 24 | + alt="Project-wide rate limit settings" |
| 25 | + classes="rounded" |
| 26 | +/> |
| 27 | + |
| 28 | +### Per-issue rate limit |
| 29 | + |
| 30 | +You set a single limit, and PostHog automatically applies it to every issue individually – each issue gets its own bucket. Once an issue exceeds the configured rate, further exceptions for *that issue* are dropped, while exceptions from your other issues keep flowing. Use this to stop a single noisy issue from drowning out everything else. |
| 31 | + |
| 32 | +When configuring a per-issue limit, you can pick an issue from your most active issues to preview its recent exception volume against the limit, so you can choose a threshold before saving. |
| 33 | + |
| 34 | +<ProductScreenshot |
| 35 | + imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/pasted_image_2026_06_07_T14_09_34_375_Z_d89669f2f6.png" |
| 36 | + imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/pasted_image_2026_06_07_T14_10_04_339_Z_652b6381b6.png" |
| 37 | + alt="Per-issue rate limit settings" |
| 38 | + classes="rounded" |
| 39 | +/> |
| 40 | + |
| 41 | +## Configuring rate limits |
| 42 | + |
| 43 | +The following options are available for each limit: |
| 44 | + |
| 45 | +| Option | Description | |
| 46 | +| --- | --- | |
| 47 | +| **Maximum exceptions** | The most exceptions to ingest per window. Leave this empty for no limit. | |
| 48 | +| **Per** | The time window the limit applies over – 15 minutes, 30 minutes, or 1 hour. | |
| 49 | + |
| 50 | +<CalloutBox icon="IconInfo" title="Rate limits vs. client-side controls" type="fyi"> |
| 51 | + |
| 52 | +Rate limits run server-side, at ingestion, and apply to every client sending exceptions to your project. To reduce exceptions before they leave the client, see [burst protection](/docs/error-tracking/capture#burst-protection), [suppression rules](/docs/error-tracking/capture#suppressing-exceptions), and the [`before_send` hook](/docs/error-tracking/capture). For more ways to lower your bill, see [reducing Error Tracking costs](/docs/error-tracking/pricing). |
| 53 | + |
| 54 | +</CalloutBox> |
0 commit comments