Rate limits

Guardian Logs enforces rate limits at both the per-credential and per-organization level, so one noisy token, key, or tenant cannot starve the platform. Ingest and the read API have separate budgets.

Limits

SurfaceCounted inPer-credential defaultPer-org default
Ingest (POST /api/v1/ingest)events600 / min per token3000 / min per org
Read API (GET /api/v1/*)requests120 / min per key600 / min per org

Ingest is counted in events, not requests — a 500-event batch consumes 500 of the budget, so large batches cannot bypass the limit. The read API is counted in requests (one per call).

All limits are fixed 60-second windows and are configurable per environment:

Env varControlsDefault
GL_RATELIMIT_TOKEN_EVENTS_PER_MINingest, per token600
GL_RATELIMIT_ORG_EVENTS_PER_MINingest, per org3000
GL_RATELIMIT_APIKEY_REQ_PER_MINread API, per key120
GL_RATELIMIT_ORG_API_REQ_PER_MINread API, per org600

When you exceed a limit

The request is rejected with 429 and nothing is consumed:

{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded.",
    "retryAfterSec": 12,
    "scope": "token"
  }
}

organization's budget).

Handling 429

budget is per-event, so batching does not raise your event allowance.

no-ops.

See also: errors.md · idempotency.md · ingest.md.