Limits & defaults

Know the number before you hit it: every default and ceiling Duraton applies to pagination, request size, retries, AI steps, and connections.

A reference for the numbers Duraton applies when you don't set one. Where a value is configurable, the option is linked.

Requests & pagination

LimitValueNotes
Request body size1 MiBApplies to every JSON request body and inbound webhook payload. Larger bodies are rejected.
Cursor page size30 default, 200 maxGET /runs, GET /webhook-deliveries, and GET /webhook-source-deliveries. Set limit to change it; over 200 is clamped to 200.
Log & list page size100 default, 1000 maxGET /events, /approvals, /control-actions, and a run's logs. Over 1000 is clamped to 1000.
Session page size100 default, 500 maxGET /sessions. Over 500 is clamped to 500.
Unpaged readswhole listA run's steps and scores take no limit - they return every row for that run.
Pagination cursorX-Next-Cursor headerGET /runs, /webhook-deliveries, and /webhook-source-deliveries use keyset pagination; pass the returned cursor to fetch the next page.
Event name / id length256 charactersApplies to name, app, runner, targetApp, dedupeId, and session on POST /events. Over the bound returns 400.

API rate limits

Duraton does not impose a fixed per-second request rate limit on the API. There is no requests/second quota on POST /events or on the read endpoints, and no 429 Too Many Requests / Retry-After back-off protocol to code against - a well-formed request is admitted regardless of how many preceded it. Two real ceilings apply instead:

CeilingEffect
Request body size (1 MiB)A larger JSON body or inbound webhook payload is rejected outright (see above).
Usage / plan limitWhen a workspace reaches its plan's metered ceiling the project is suspended, and subsequent run-starting calls are refused with 403 Forbidden rather than throttled.

Suspension is the ceiling that actually gates throughput, and it is not a rate limit - it is a hard stop until usage falls back under the plan or the plan is raised. Its shape differs by endpoint:

  • POST /events on a suspended project still returns 202 Accepted, but starts no new run: the response carries suspended: true with no runId, and any in-flight waitForEvent waiters are still woken. The event is recorded; only the fan-out into new runs is withheld.
  • Other run-creating actions (and cron-triggered runs) on a suspended project are refused with 403 Forbidden.

Because there is no request-rate throttle, protect a busy ingest path with your own client-side batching or concurrency limit; the durable back-pressure you can configure is per-workflow flow control (concurrency, throttle, rate-limit, debounce, batch), which shapes how fast admitted events turn into runs.

Retries & delivery

LimitValueConfigurable
Step retriesnone by default (maxAttempts: 1)Per workflow via retry. A failed step waits a backoff delay, then retries up to maxAttempts total.
Outbound webhook attemptsup to 5Duraton retries a failed delivery with a backoff between attempts, then marks it exhausted.
Outbound webhook timeout10s per attemptA slower endpoint counts as a failed attempt.
Webhook signingHMAC-SHA256The X-Duraton-Signature header on every inbound and outbound delivery.

AI steps

DefaultValueOption
Provideranthropicprovider on step.ai.generate.
Re-asks on invalid output1reask; applies only when an output schema is set.
Inference cache TTL24 hourscache - pass { ttlMs } to change it.
Inference cache eligibilitytemperature set and <= 0.2The cache is a no-op when temperature is above 0.2 or left unset (a provider default is often non-deterministic), so only near-deterministic calls are reused.
Embedding batch size100 inputs per durable batchbatchSize on step.ai.embed.
Eval fan-out200 items per runA dataset eval runs at most 200 items; a larger dataset is truncated to the first 200.

Per-run and rolling-window AI spend ceilings are opt-in and unlimited by default - see cap and budget.

Connection defaults

These are what the SDK uses when a value and its environment variable are both unset:

SettingDefaultEnvironment variable
urlnone - set it to your Duraton base URL, shown in the console under API KeysDURATON_URL
apiKeynone - required on every requestDURATON_API_KEY
AppdefaultDURATON_APP
Runner heartbeat interval30s- (the serve re-registration; a connect endpoint is refreshed on its socket heartbeat at the same cadence)
Runner liveness TTL90s since the last heartbeat- (both transports; a runner past it shows as Stale and is listed with live: false)
Protocol version1- (sent as X-Duraton-Protocol; see the wire protocol)

On this page