Smart Agent Teams

Limits

Every numeric limit in SAT, from field lengths and list caps to token lifetimes, leases, stream timings and runner intervals, with the values in the code.

This page lists every numeric limit the code enforces or uses, with its exact value and where it is defined. Requests that break a validation limit answer 422 with error code VALIDATION_ERROR unless noted. Money is integer cents, and a budget of 0 means no limit.

Field lengths

From the Pydantic models in apps/api/company/schemas.py and apps/api/api/schemas.py. "No limit" means the API does not cap it (the column is TEXT).

Companies

FieldLimit
name1 to 120 characters
task_prefix1 to 8 characters, pattern ^[A-Z][A-Z0-9]*$, default SAT. Cannot be changed after creation.
missionNo limit
monthly_budget_centsInteger, 0 or more

Agents

FieldLimit
name1 to 100 characters
titleUp to 120 characters on create. Not length-checked on update; the column is 120.
roleUp to 50 characters on create, default engineer. Not length-checked on update; the column is 50.
adapterUp to 50 characters on create, default claude_code. Not length-checked on update; the column is 50.
heartbeat_cronNot validated by the API; the column is 100 characters
instructions, capabilitiesNo limit
monthly_budget_centsInteger, 0 or more

Work

FieldLimit
Task title1 to 300 characters
Task descriptionNo limit
Comment bodyAt least 1 character, no maximum
Goal title1 to 200 characters
Project name1 to 100 characters
Project repositoryNo API limit; the column is 500 characters
Routine title1 to 200 characters
Routine cron1 to 100 characters. Stored as given, not validated by the API.
Approval new_budget_centsInteger, 0 or more

Runs

FieldLimit
runner_id (claim, heartbeat, report)1 to 100 characters. sat runner truncates its id to 100.
tokens_in, tokens_out, cost_centsIntegers, 0 or more
summary, error, transcript entry textNo API limit. sat runner clips them (see Runner).

Accounts and API keys

FieldLimit
Registration password8 to 128 characters
Reset password8 to 128 characters
Reset token20 to 200 characters
name (register, PATCH /api/me)1 to 255 characters
Registration companyUp to 255 characters
avatar_urlUp to 500 characters, must match ^https://\S+$
API key name1 to 100 characters, unique among your active (not revoked, not expired) keys
API key expires_in_days1 to 3650, optional (no expiry when omitted)

Preferences

From apps/api/api/preferences.py. Unknown fields are rejected.

FieldLimit
timezoneUp to 64 characters
localeUp to 35 characters, pattern ^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$
currencyThree uppercase letters
dashboard.range_days7, 14 or 30
dashboard.order, dashboard.hiddenUp to 20 card ids, each [a-z0-9-]{1,40}
tasks.saved_viewsUp to 20 views
Saved view id1 to 40 characters, [A-Za-z0-9_-]
Saved view name1 to 60 characters
Saved view queryUp to 500 characters
favorites.agents, favorites.projectsUp to 50 ids each

List limits

EndpointDefaultMaximumPaging
GET /tasks5001000 (limit)None. Ordered by sort_order, then newest number first.
GET /runs100500 (limit)None. Newest first. Transcripts omitted.
GET /activity50200 (limit)Cursor before (the created_at of the last row seen)
GET /dashboard active_runs2020Queued or running runs
GET /dashboard for_you.recent55Open tasks you created
GET /dashboard days147, 14 or 30 only
Agents, goals, projects, approvals, routines, members, companies, commentsAll rowsNo capNone

sat list commands take --limit: sat tasks list defaults to 200 rows, sat activity to 50 and sat runs list to 25.

Company and account limits

LimitValueSource
Active API keys per user20 (400 API_KEY_LIMIT). Revoked and expired keys do not countapi/api_key_endpoints.py
Active API keys per user, legacy route10api/user_endpoints.py (unsupported)
Task numbersPer company, from 1, never reusedcompanies.task_counter
Running runs per agent1. A claim skips agents with a running run.POST /runs/claim
Pending budget_override approvals per agent1services.enforce_agent_budget
Identical queued runs1 per agent, task and routine. A new wake returns the existing one.services.queue_run

Authentication

From apps/api/services/auth_service.py, services/password_reset.py and services/api_keys.py.

LimitValue
Access token lifetime30 minutes
Refresh token lifetime7 days
Failed sign-ins before lockout5 consecutive
Lockout duration30 minutes
Password reset link lifetime30 minutes, single use
Reset link cooldown1 per account per 60 seconds
Reset token entropy32 random bytes
API key secretsat_live_ plus 32 characters
API key display prefixFirst 13 characters
API key last_used updateAt most once per minute
SMTP connection timeout15 seconds

Rate limits

Per client address, counted in memory in each API process.

EndpointLimit
GET /health100 per minute
POST /api/password/forgot5 per minute
POST /api/password/reset10 per minute
GET /api/rate-limit-test10 per minute

No other endpoint is rate limited.

Runs and leases

LimitValueSource
Lease (RUN_LEASE_SECONDS)300 seconds by default. A running run whose last heartbeat or report (or start) is older is failed.company/services.py
Claim attempts per request5. If every attempt loses a race, the claim answers 204.POST /runs/claim
Transcript sizeNo limit. The whole transcript is one JSON value in the run row.runs.transcript

Live events

LimitValueSource
Stream heartbeat: heartbeat comment after 15 seconds without an eventcompany/routers/insights.py
Reconnect hintretry: 3000 (3 seconds), sent firstcompany/routers/insights.py
Subscriber queue1,000 events per connection (in-memory bus)company/events.py
Client reconnect backoff2 seconds, doubling to a maximum of 30 secondslibs/api-client/src/events.ts

Runner

From apps/cli/src/runner and apps/cli/src/commands/runner.ts.

LimitValue
Heartbeat interval30 seconds
Transcript flushEvery 2 seconds, or sooner once 4,096 characters are buffered
Concurrency (--concurrency)2 by default
Safety-net poll (--poll)30 seconds by default, minimum 5
Simulated run length (--echo-delay)1,500 ms by default
Echo adapter usage100 tokens in, 50 out, 1 cent per run
Agent stopSIGTERM, then SIGKILL after 5 seconds
Stderr kept from the agent processLast 4,000 characters
Run summary and error reported2,000 characters
Final comment posted to the task8,000 characters
Comments included in the task promptLast 20
Workspace folder namesSlugs of up to 40 characters

Transcript clipping in adapters

apps/cli/src/runner/adapters.ts. The agent's own messages are not clipped.

EntryClipped to
Tool call summary (→ tool input)200 characters
Claude Code tool result800 characters
Codex reasoning800 characters
Codex command output800 characters
Codex file edit summary300 characters
Unparseable output line500 characters
Agent CLI stderr in the run error1,500 characters

Clipped text ends with … [N more chars].

Scheduler

From apps/cli/src/runner/scheduler.ts.

LimitValue
Duplicate windowA routine that ran within 50 seconds (or half its interval, if shorter) is skipped
Definition refreshEvery 5 minutes, and 1 second after any routine.* or agent.* event
Stale-run expiry (--expire-interval)Every 60 seconds by default
Cron fields5, or 6 with seconds
Missed ticksNot backfilled

sat doctor

LimitValue
/health timeout10 seconds
Live stream wait (--stream-timeout)20 seconds by default

On this page