Skip to content
Talk to our solutions team

Worksheet limits and quotas

Every worksheet bound is a compile-time constant in data.svc. None of them read configuration, an environment variable or a tenant setting: there is no way to raise or lower one at deploy time, and no per-tenant override. Plan against the values below.

BoundValueScopeExceeded →
TTL1 minute – 24 hours, default 30 minutesper worksheetttl_seconds outside the range → worksheet.invalid_ttl (400). Omit the field to get the default.
Expiry grace window5 minutes past expires_atper worksheetRequests inside the window → worksheet.expired (410); after it the worksheet is evicted and requests → worksheet.not_found (404). A sweep also evicts every 30 seconds.
Uploaded file size500 MiBper uploaded filefile.size_exceeded (413). Applies to multipart uploads only — a file registered by URL is never size-checked.
Files per worksheet50per worksheetfile.size_exceeded (413), with a “max files per worksheet” message.
Tables per worksheet100per worksheettable.name_conflict (409), with a “max tables per worksheet” message. Checked only when you define a table explicitly. The tables ingestion creates on its own — one per imported sheet — count toward the total but are never blocked, so a worksheet can pass 100 without an error.
XLSX rows1,000,000per sheetfile.size_exceeded (413) from a dimension pre-check run during sheet discovery, against every sheet in the workbook — one oversized sheet rejects the whole file. Ingestion also applies a hard LIMIT at the same number.
XLSX columns1,000per sheetfile.size_exceeded (413) from the same pre-check. Nothing enforces it during ingestion.
XLSX data scanfirst 5,000 rows, or 10 secondsper sheetA sheet whose first non-empty cell falls outside the scan window counts as empty and drops out of sheet discovery, so the file can fail with file.format_invalid (400) even though the sheet holds data. Passing format_options.sheets skips discovery entirely.
XLSX header auto-detect scanfirst 20 rowsper sheetOnly these rows are considered when header_row is not supplied.
Query result rows100,000per querymax_rows above the cap is clamped, not rejected. The response carries truncated: true.
Query timeoutdefault 30 seconds, maximum 5 minutesper querytimeout_ms above the cap is clamped. On expiry → query.timeout (504).
Worksheet memory2 GBper worksheetworksheet.memory_exceeded (507), classified from the engine error. Not settable over HTTP.
Sample rowsdefault 50, maximum 10,000per requestn above the cap is clamped.
Distinct valuesdefault 100, maximum 10,000per requestlimit above the cap is clamped. The response carries truncated.
Concurrent worksheets20 non-expiredper tenantrate_limit_exceeded (429) on create, with Retry-After: 60.
Worksheet creations10 per minuteper tenantrate_limit_exceeded (429), Retry-After: 60.
File registrations30 per minuteper tenantrate_limit_exceeded (429), Retry-After: 60. Counts uploads and URL registrations alike.
Queries60 per minuteper worksheetrate_limit_exceeded (429), Retry-After: 60.
Idempotency window10 minutesper tenant + keyA repeated Idempotency-Key on create replays the cached 201 body verbatim instead of creating a worksheet.

histogram_buckets and top_k on the analytics endpoint default to 20 and have no upper bound.

Four request fields are silently reduced to their maximum rather than refused: max_rows and timeout_ms on query, n on sample, and limit on distinct. Sending max_rows: 1000000 returns 100,000 rows and truncated: true — no error, no warning header. Read truncated and row_count_returned in the response rather than assuming your requested size was honoured.

The three per-minute counters are a fixed window per tenant: all of them reset together the first time a request arrives more than 60 seconds after the last reset, so a burst can straddle a window boundary and pass twice the nominal rate.

The idempotency check runs before the rate-limit check on create, so a replayed key does not consume creation quota.

Nothing here applies to the entity surface. The query DSL has its own paging and limit behaviour.