Limits
The limits below are the ones the API enforces, and this page is generated from the same file. A dash (—) means there is no limit of that kind for that tier.
Every app starts on the sandbox tier. In the private beta Forgeling approves every app before it can
run anything: until then, starting a run answers 403 approval_required. An approved app gets the
larger quotas. The last column of the quotas table is what an approved app gets during the private
beta, where that differs from the approved default: runs share worker machines, so approved apps have
fewer concurrent and suspended runs than they will have later.
A value above your tier's maximum is refused with 422 tier_limit, and a quota that is used up with
409 quota_exceeded; see errors. Rate limits are in
conventions.
The two event-stream quotas are upper bounds: the API counts open streams on each of its server
processes, so a stream can be answered 429 rate_limited before the total is reached; see
follow a run live.
A turn as a whole is capped at 1 MiB: its input, context, actor, output_schema, trigger and
limits, encoded together as compact UTF-8 JSON, may take at most 1 MiB, less about 0.5 KiB the
platform adds when it forwards the turn. A larger turn is refused when it is posted, with 422
validation_failed and param: "input" ("initial_turn.input" when you create a run).
Run sizes
| Size | vCPU | Memory | Disk | Who |
|---|---|---|---|---|
small |
1 | 2 GiB | 10 GB | everyone (the only size in the sandbox tier) |
standard |
2 | 4 GiB | 10 GB (20 GB from M2) | approved apps |
large |
4 | 8 GiB | 40 GB | approved apps |
Memory figures are pending Forgeling's week-1 measurement of the run image and may change.
Lifecycle
| Field | Default | Max (sandbox) | Max (approved) |
|---|---|---|---|
| limits.turn_timeout_s | min(3600, tier max) | 1800 | 14400 |
| lifecycle.idle_suspend_s | 1800 | — | — |
| lifecycle.expires_in_s | min(86400, tier max) | 7200 | 259200 |
| lifecycle.queue_timeout_s | 900 | 3600 | 3600 |
| lifecycle.resume_timeout_s | 900 | 3600 | 3600 |
Quotas
| Quota | Sandbox | Approved | Private beta (M1) |
|---|---|---|---|
| Live workspaces | 3 | 500 | 500 |
| Concurrent runs per app | 1 | 10 | 2 |
| Concurrent runs per workspace | 1 | 3 | 2 |
| Suspended runs per app | 1 | 20 | 4 |
| Queued runs per app | 3 | 100 | 100 |
| Run sizes | small |
small, standard, large |
small, standard, large |
| Run hours per day per app | 4 | 500 | 500 |
| Turn timeout, maximum (seconds) | 1800 | 14400 | 14400 |
| Run lifetime, maximum (seconds) | 7200 | 259200 | 259200 |
| Run budget required, at most (USD) | 10 | — | — |
| Output files retained (days) | 1 | 7 | 7 |
| Output file storage (GB) | 1 | 100 | 100 |
| Events retained (days) | 7 | 30 | 30 |
| Webhook endpoints | 1 | 10 | 10 |
| API requests per second per key | 5 | 50 | 50 |
| API burst per key (requests) | 20 | 200 | 200 |
| Active API keys | 20 | 20 | 20 |
| Event streams per run | 5 | 5 | 5 |
| Event streams per app | 200 | 200 | 200 |
Other caps
| Limit | Value |
|---|---|
| Event size | 64 KiB |
| Tool summary | 16 KiB |
| Events per run | 20,000 |
| Event data per turn | 2 MiB |
| Runtime response size | 4 MiB |
| Event rate per run | 50 events/s |
| Event burst per run | 200 events |
| Protocol violations before a run ends | 20 |
| Inline input files per run | 5 MB |
| Approval expiry | 900 s |
| Signed download URL | 5 minutes |