Limits and quotas
Every bound the service enforces, including the public plan ladder.
| Allowance | Free | Starter | Pro | Scale |
|---|
| Active routines | 1 | 1 | 10 | 50 |
| Run starts | 10 per UTC calendar month | 50 per Stripe billing period | 250 per Stripe billing period | 1,000 per Stripe billing period |
| MCP connections | 1 | 2 | 10 | 50 |
| Accessible history | 7 days | 30 days | 90 days | 365 days |
| Concurrent runs | 1 | 1 | 2 | 5 |
| Upstream AI usage | $0.50 per UTC calendar month | $2 per Stripe billing period | $10 per Stripe billing period | $25 per Stripe billing period |
| API | Read only | Read only | Full | Full |
| Signed result webhook | No | Yes | Yes | Yes |
Business capacity is configured by agreement for workloads beyond Scale. Plan
limits pause only the bounded new action and never create automatic overage
charges. Runs are bounded by time — an idle timeout and an absolute deadline —
never by a configurable model-step count; a fixed platform safety ceiling of
10,000 model steps exists purely as an anti-runaway backstop. See
Billing for counting, reset, plan-change, and downgrade rules,
including paid-to-paid target-limit enforcement and newest-first routine
pausing.
| Field | Bound |
|---|
name | 3–100 characters |
description | up to 500 characters |
instructions | 20–20,000 characters |
model | 1–200 characters, must exist in the directory |
schedule.cron | 5–120 characters, exactly five fields |
schedule.timezone | 1–100 characters, a valid IANA identifier |
limits.idleTimeoutSeconds | 60–1800 (default 600) |
limits.timeoutSeconds | 30–3600 (default 1200) |
variables | any JSON object; only strings and numbers substitute |
webhookUrl | a valid URL |
| Field | Bound |
|---|
name | 2–100 characters |
url | a valid URL, up to 2,048 characters |
headers | up to 50 entries |
| header name | 1–100 characters |
| header value | up to 4,096 characters |
| Field | Bound |
|---|
name | 2–100 characters |
| Property | Value |
|---|
| Name | 1–80 characters |
| Scopes | at least one, from the seven available |
| Format | wor_<prefix>_<secret> — 10 hex characters, then a 24-byte base64url secret |
| Storage | SHA-256 hash only; plaintext shown once |
| Bound | Value |
|---|
| Idle time per run | the routine's idleTimeoutSeconds, at most 1,800 seconds |
| Wall clock per run | the routine's timeoutSeconds, at most 3,600 seconds |
| Platform execution window | matches timeoutSeconds; each run owns its invocation |
| Model steps per run | 10,000 — the fixed platform safety ceiling |
| Stored run output | truncated at 100,000 characters |
| Worker concurrency | bounded; runs are claimed atomically from SQLite |
| Operations tick interval | one minute |
On the hosted scheduler each claimed run executes as its own queue message
in its own invocation, so the platform window matches the routine's full
timeoutSeconds (at most 3,600 seconds) instead of sharing a cron
invocation's budget. A run that reaches the window ends timed_out with the
timeout category and the message "The run reached the platform execution
window." The Node worker honors the same configured deadline. The model-step
ceiling is an anti-runaway backstop, not a configurable product limit: the
retired per-run step cap no longer exists.
| Bound | Value |
|---|
| Rate limit | per credential, fixed 60-second window |
| Rate limit headers | X-RateLimit-Limit, X-RateLimit-Remaining, Retry-After on 429 |
| Request body | 1 MB on /v1 |
| CORS | the configured UI_ORIGIN only, with credentials |
The rate limit key combines the project, the credential kind, and the
credential identity — so two API keys in the same project have independent
budgets, and a session does not consume a key's allowance.
| Bound | Value |
|---|
| Attempts | 4 |
| Backoff | 30 seconds, doubling per attempt, capped at 30 minutes |
| Jitter | added to every scheduled retry |
| Request timeout | 10 seconds |
| Replay window | 5 minutes, enforced against the timestamp |
| Redirects | not followed |
| Bound | Value |
|---|
state life | 10 minutes |
state use | single use, bound to the user and the active project |
| PKCE | S256 for PostHog; GitHub OAuth apps use the client secret |