Product limits, API rate limits, and runtime defaults currently enforced across Helix.
Product limits
These limits are currently enforced across Helix services.
Projects
| Item | Value |
|---|---|
| Project title | ≤ 100 characters |
| Project description | ≤ 300 characters |
| Project alias | ≤ 30 characters |
| Max projects per workspace | 100 |
| Max projects per org | 500 |
| Deployment bundle size | ≤ 50 MB |
| Max authentications per deployment | 100 |
Key-value store
| Item | Value |
|---|---|
| Max keys per project | 500 |
| Max value size per key | 200 KB |
See the key-value store guide for key naming rules and the ctx.kv() reference for the API.
Helix API rate limits
These limits apply to Helix API calls (create, update, deploy, and related management endpoints). They are not limits on project execution or function invocations.
| Item | Value |
|---|---|
| Requests per second per org | 50 across all endpoints |
| Requests per minute per org | 1800 across all endpoints |
| Over-limit response | HTTP 429 with a Retry-After header |
| Rate-limiter outage | Fail-open (requests are allowed through) |
| Successful deployments per org | 200 per UTC calendar day |
Runtime defaults and limits
Functions
| Item | Value |
|---|---|
| Production runtime | Node.js 20+, one runtime per project with internal routing |
| CLI requirement | Node.js 24.18.0 or later |
| Function timeout | 30 s default, configurable per function |
| Streamed response size | 20 MB maximum (first byte can arrive before the function finishes) |
| Buffered response size | 6 MB maximum |
| Memory | Managed by the platform, not configurable per function |
| Scaling | Scales with demand and to zero when idle; no configuration required |
Return a Response with a ReadableStream body to stream; the runtime handles streaming setup. Note that the output schema is not applied to streaming responses. See the function definition reference.
Async function calls
| Item | Value |
|---|---|
| Chaining depth | Two hops: a normal execution can call ctx.callFunctionAsync() once, the execution it starts can call it once more, a third hop is refused |
| Dispatch method | Always POST; the target must accept POST regardless of the caller’s own method |
| Delivery | At-least-once, with no idempotency key; write target handlers to be idempotent |
| Result | None; the call resolves once accepted, with no return value, status, or execution ID from the target |
See the async function calls guide.
Schedules
| Item | Value |
|---|---|
| Schedule files per project | 20 maximum; a deploy that declares more is rejected |
| Fastest cadence | Once per minute |
| Run duration | 3 minutes maximum per run, not configurable |
| Cron format | Five-field standard cron; day-of-month and day-of-week cannot both be constrained |
| Timezone | Named IANA zones only; offset forms like '+05:00' are rejected at build time |
| Delivery | At least once; a failed run is retried once, five minutes after it started, then dropped |
| Overlap | Runs can still overlap. concurrent is accepted at deploy time but not enforced yet |
See the scheduled functions guide.
Storage
| Item | Value |
|---|---|
| Max keys per project | 500 |
| Max value size per key | 200 KB |
Data retention
| Item | Value |
|---|---|
| Execution logs | 30 days |
| Previous deployments | 30 days from deploy; the live deployment and the one before it are always kept |
See how long previous deployments are kept for what expiry removes.