Skip to main content

Limits reference

Every enforced Easel limit for builds, Functions, requests, Runtime Cache, domains, security, and observability.

This page lists every limit Easel enforces. Where a framework sets its own default, the stricter of the framework and Easel limit applies, so don't infer a limit from a framework default or another hosting provider.

Builds and deployments

LimitValue
Build duration10 minutes
Concurrent buildsHobby 1, Pro 3 per workspace; up to 12 by agreement. See Build queue
Build machine CPU, memorySee Build machines
Function bundle (zipped)250 MB
Environment variables64 KB total, names and values combined
Source: files20,000
Source: single file50 MiB
Source: total size250 MiB, after extracting an archive
Source archive (gzip)250 MiB

Source limits apply however you upload the source: easel deploy or the API. A build that runs past 10 minutes fails with a timeout. A build also fails when the resolved environment variables exceed 64 KB, so keep large files, certificates, and datasets out of environment variables.

To shrink a function bundle, remove unused dependencies, use framework output tracing, and load large assets from object storage instead of packaging them.

Functions

LimitValue
Default maximum duration30s
Maximum configurable duration800s; values outside 1–800s are clamped
Wait for response headers60s from invoke start
Wait between body chunks30s
Memory and CPU2 GB / 1 vCPU (Standard), 4 GB / 2 vCPU (Performance)
Incoming WebSocketsNot supported; use streaming HTTP or SSE

Duration covers the whole invocation: your handler, streaming the response body, and waitUntil / after() work. Returning headers doesn't end it. Set it per route through your framework; see Maximum duration. Move work that can't finish within 800s to a queue or durable worker.

The header and chunk waits abort a stalled invocation early. Each is capped by the duration budget that remains, so a short maxDuration ends a stall sooner.

Easel also enforces in-function concurrency, response size, temporary filesystem capacity, and outbound connection counts. These values aren't published and can change with runtime configuration, so keep your code safe under concurrent requests on a shared instance. See Function runtime.

Requests and delivery

LimitValue
Request body size10 MiB; the full body must arrive within 30s
Header, cookie, and URL sizeEnforced; values not published
Cacheable response size10 MiB after compression; larger responses are served but not cached
Minimum size for compression256 bytes; smaller responses are sent uncompressed
Cache tags per responseNo cap
Cache tag lengthNo cap
Tags per revalidation requestNo cap

Easel rejects a larger request body with 413 at the edge, before your function runs. For large uploads, send files from the browser straight to object storage with signed URLs. Keep cookies small and put large structured input in a request body instead of the URL.

Keep cache tags short and low-cardinality even without a cap. See Revalidation.

Runtime Cache

LimitValue
Item size2 MiB
Tags per item128
Tag length256 bytes
Maximum entry age30 days
Storage per cache, per region64 MiB on Hobby, 128 MiB on Pro

On Pro, each project has one cache per environment; on Hobby, a workspace's projects share one. See Storage for how Easel evicts entries when a cache is full.

Queues

LimitValue
Message size4 MiB
Retention60 seconds to 7 days, 24 hours by default
DelayUp to 7 days, and no longer than the retention
Lease (visibility timeout)Up to 60 minutes
Messages per receive10
Messages per batch publish100
Idempotency key256 characters, deduplicated for up to 24 hours
Topics with messages, per project10,000
Consumer groups per topic1,000
Messages in flight per consumer group10,000 (received and not yet acknowledged)

Past a limit, the API answers 429 with Retry-After. A consumer group at its in-flight limit gets only redeliveries until it acknowledges some messages.

Queues run in iad1. See Queues for delivery and retry behavior.

Domains

LimitValue
Domains per project or workspaceNo plan cap
Projects per hostname1, across all of Easel
Unverified domain or zone holds its name7 days
Hostname (FQDN) length253 characters
Label length63 characters

For allowed characters, see Add the domain. For the 7-day rule, see Domain ownership. A project can't have a wildcard domain; see Wildcard domains. A workspace wildcard domain covers names exactly one label under it; see Set up your domains.

Platform API

LimitValue
Requests per token6,000 per minute
Idempotency key length255 characters
Idempotency key kept24 hours
Scoped token lifetime60 seconds to 1 year, and no longer than the token that mints it
Projects per scoped token100
Token name32 characters
Upload URL lifetime60 to 900 seconds; 900 by default
JSON deployment request (inline files)10 MiB
Deployment meta20 pairs, keys up to 64 characters, 1 KiB of JSON in total
Git metadata header on an archive2 KiB
Hashes per POST /v1/files/missing20,000
Environment variables per request500
Deployments per page20 by default, up to 100
Runtime log and request records per page50 by default, up to 200
Usage range366 days
Webhooks per workspace20
Webhook delivery attempts8, over about 20 hours
Webhook response wait10 seconds
Webhook response body read64 KiB

A request over the token's rate limit gets 429. A webhook delivery that doesn't get a 2xx within the wait is retried until the attempts run out. See Webhooks.

Security

LimitValue
Custom firewall rulesNo published cap
Rate limit rules per projectHobby 1, Pro 40
Rate limit window10 seconds to 10 minutes
Attack challenge mode verification sessionAbout 1 hour
Attack challenge mode work tokenAbout 15 minutes
Deployment protection sessionAbout 1 hour

Firewall and attack challenge mode changes reach every edge region after a short delay, with no redeploy.

Observability

LimitValue
Chart time windows6h, 12h, 24h, 7d
Logs time range30 minutes to 7 days
Metric buckets5 minutes (24h or less), 60 minutes (longer)
Logs rows per pageUp to a few hundred
Function log lines per invoke256
Function log line size256 KiB
Function log output per invoke1 MiB
OpenTelemetry spans1,000 spans and 2 MiB per request; attributes over 64 KiB are dropped
easel logs --follow poll intervalAbout 10 seconds

Easel doesn't publish a retention guarantee beyond the 7-day window. Log and trace delivery is best-effort and never blocks your requests, so don't treat Logs as a complete audit log. To keep data longer, use Export.

When you exceed a limit

  • Request body too large: the client gets 413 and your function doesn't run.
  • Duration reached or stalled response: Easel terminates the invocation.
  • Build duration or environment variable size: the build fails.
  • Runtime Cache pool full: Easel evicts the least recently used entries. A write fails only when eviction can't free enough space.
  • Function logs or spans over the cap: Easel drops the excess output.

To find which limit a request hit, look it up by its request ID (X-Easel-Id) in Logs and its Trace.

Raise a limit

Some limits are fixed. Others depend on your plan or can be raised by agreement. Email hello@easel.sh with the limit name and the failure you're seeing.