Rate Limits & Plans

Rate limits protect the platform and ensure fair usage. Limits are applied per API key on REST endpoints. Dashboard (tRPC) requests are not rate limited.

Plan Comparison

FeatureFreeProGrowthTeamEnterprise
Price / monthFree$29$79$199Custom
Traces / month10,00050,000150,000500,000Unlimited
LLM evals / month5005,00015,00050,000Unlimited
Data retention7 days30 days60 days90 daysUnlimited
API rate limit100 req/s1,000 req/s1,000 req/s1,000 req/s1,000 req/s
Seats13UnlimitedUnlimitedUnlimited
OveragesNoYesYesYesNo
Audit logsNoNoYesYesYes
SSO/SAMLNoNoNoNoYes

Rate Limiting

How It Works

Rate limits use a Redis sliding window algorithm per API key. Each API key has an independent counter that tracks requests within a rolling one-second window.

Rate-Limited Endpoints

EndpointMethodRate Limited
/api/v1/tracesPOSTYes
/api/v1/tracesGETYes
/api/v1/scoresPOSTYes
/api/v1/route-modelPOSTYes
/api/v1/auth/*POSTYes
/api/v1/healthGETNo
/api/trpc/*AllNo

Response Headers

Rate-limited endpoints include these headers in every response:

HeaderDescription
RateLimit-LimitMaximum requests per second for your plan
RateLimit-RemainingRequests remaining in the current window
RateLimit-ResetUnix timestamp when the window resets

When Rate Limited (429)

{
  "data": null,
  "error": {
    "message": "Rate limit exceeded. Retry after 1 second.",
    "code": "RATE_LIMITED"
  }
}

Retry Strategy

Implement exponential backoff with jitter. The Python SDK handles retries automatically. For custom integrations:

import time
import random

def call_with_retry(func, max_retries=3):
    for attempt in range(max_retries):
        resp = func()
        if resp.status_code != 429:
            return resp
        wait = (2 ** attempt) + random.uniform(0, 1)
        time.sleep(wait)
    raise Exception("Rate limited after retries")

Payload Limits

EndpointMax PayloadMax Batch Size
POST /api/v1/traces5 MB1,000 events per batch
POST /api/v1/scores1 MB
POST /api/v1/route-model512 KB

Requests exceeding payload limits receive a 413 Payload Too Large response.

Usage Quotas

Usage is tracked per organization per calendar month (UTC). Counters include:

  • Trace count — each trace ingested
  • Span count — each span ingested
  • Eval run count — each evaluator execution

On the Free plan, trace ingestion is blocked when the monthly trace limit is reached. Upgrade or wait for the next month to resume. See Alerts & Usage for monitoring and alert details.

Data Retention

A daily cleanup worker deletes traces, spans, and associated scores older than your plan's retention window. Retention is calculated from the trace's createdAt timestamp.

PlanRetentionCleanup Frequency
Free7 daysDaily
Pro30 daysDaily
Growth60 daysDaily
Team90 daysDaily
EnterpriseUnlimitedN/A

Deletion is irreversible. Upgrade your plan before data expires if you need longer retention.

Have questions? Join our community!

Connect with other developers and the 2Signal team.

Join Discord