# Quotas and limits

Your plan sets several limits at once. This page explains what each one means, how to read your current
numbers, and how a script or an AI assistant checks them before doing work that would otherwise be refused.

## Monitor and feature limits

| Limit | What it means | Where it's enforced |
|---|---|---|
| Monitor count | The maximum number of **enabled** monitors your plan allows. Creating a new monitor beyond the cap is refused (or, when the request opts into it, lands the new monitor disabled instead); monitors you already have keep running. | `403 package_limit` (API) / an in-app validation message |
| Check interval floor | The shortest interval a monitor on your plan can use. Some monitor types (certificate expiry, domain expiry, DNSBL: every 6 hours; Web Risk: every 12 hours) have their own fixed cadence regardless of plan. | `422 invalid_interval` / `403 package_interval_conflict` |
| Contacts | The maximum number of alert contacts, and a per-contact-type sub-cap (for example voice-call contacts may be capped lower, or unavailable, on some plans). | `403 package_limit` |
| Reports | Which report frequencies (daily/weekly/monthly/quarterly/yearly) are available, if any. | refused subscription write |
| Status pages and subscribers | Each has its own plan-dependent cap. | in-app validation |
| Assertion rules per monitor | How many validation rules ([AssertRuleLang](/monitors/what-a-monitor-is/)) a single HTTP or API monitor can carry. | `422` on save |
| Bulk operation size | How many items a single bulk create/update/delete request may touch - published per account, not a flat constant. | `422 too_many_items` |

See [Plans and packages compared](/account/plans/) for how these scale across tiers, and
[Upgrade or downgrade](/account/upgrade-downgrade/) for what happens if a change puts you over a limit.

## Checking your current usage in the app

Open **Billing -> Packages** to see:

- Your plan's limits.
- How much of each you're currently using.
- Whether you're at or near a cap.

## Do it with the API or MCP

`GET /account` (MCP `get_account`) returns two blocks that answer "may I, and how much":

- `usage.{monitor,contact,report,maintenance}` - `{used, allowed}` per area; `allowed: null` means
  **unlimited**, never zero.
- `limits` - the account's allowed check intervals, alert-delay ladder, and the bulk-operation size caps
  (`maxBulkItems`, `maxBulkSelection`) your account may actually use (these can be smaller than the platform
  ceiling on a small plan).
- `flags.apiEnabled` - whether the account's plan and billing state allow API access at all.

`GET /account/quota` (MCP `get_account_quota`) is the API **rate-limit** view, separate from the resource
limits above - call it first whenever another call answers 429 or a 403 you don't understand:

```json
{
  "apiEnabled": true,
  "pools": {
    "account": { "limit": 6000, "used": 42, "remaining": 5958, "resetAt": 1758000000,
      "quotas": [ { "scope": "monitor:write", "quota": "requests-per-minute", "limit": 60, "used": 3,
                    "remaining": 57, "resetAt": 1758000060, "windowSec": 60, "successOnly": false } ] },
    "ic": { "limit": 100, "used": 5, "remaining": 95, "resetAt": 1758000000, "quotas": [ /* ... */ ] }
  },
  "scopes": [ { "scope": "monitor:read", "description": "..." } ]
}
```

Quota is **per user, per pool** - `account` covers everything except instant checks, and `ic` covers instant
checks separately, each with its own tightest-binding window across possibly several configured windows
(minute, day, month). Every metered API response also carries `RateLimit-Limit`, `RateLimit-Remaining` and
`RateLimit-Reset` headers, plus a `RateLimit-Policy` header naming the exact quota that applies to that call -
you don't have to call `GET /account/quota` just to read your remaining budget on a normal request.

## Limits and gotchas

- A request over the rate limit gets **`429`** with a `Retry-After` header (and, on the anonymous/reference
  tier, `rate_limited` with the window length). This is separate from a **`403 package_limit`**, which means
  your plan doesn't include the resource or feature at all, not that you're calling too fast.
- `usage.<area>.allowed: null` means unlimited - never compare it to `used` as if it were a real number.
- A token can carry its own self-imposed cap (`tokenCap`, tighter than the account limit) - `GET /account/quota`
  echoes it when present so a client can tell the two apart.

## Related

- [Plans and packages compared](/account/plans/)
- [Upgrade or downgrade your plan](/account/upgrade-downgrade/)
- [API rate limits](/integrations/rate-limits/)
