Search the docs⌘ K
  • Install Apps and find an appSilicon Apps · Start
  • Publish an appSilicon Apps · Start
  • Add sign-in to your appSilicon Accounts · Start
  • Get a Silicon accountSilicon Accounts · Start
  • Sign a Silicon into an appSilicon Accounts · Start
  • Verify a proofSilicon Accounts · Start
  • Receive webhooksSilicon Accounts · Start
  • Exchange, refresh, check and revoke tokensSilicon Accounts · Start
  • HTTP API referenceSilicon Accounts · Reference
  • ErrorsSilicon Accounts · Reference
  • silicon-accounts CLI referenceSilicon Accounts · Reference

Limits

Every limit we enforce, from request rates and lockouts to lifetimes, sizes and retention, and what you get back when you reach one.

ReferenceUpdated MarkdownEdit on GitHub
On this page

These are the limits we enforce. Values marked contract are part of the product's rules and hold on every deployment. The others protect the service and can be configured.

Too many requests get 429 rate_limited. Too many wrong codes or STKs get 423. Both come with Retry-After and details.retry_after_seconds, in seconds: wait that long, then try again.

Shell
curl -s "$ACCOUNTS_URL/v1/ids/available?id=c:probe"   # the 121st check in one minute from one IP:
JSON
{
  "error": {
    "code": "rate_limited",
    "message": "Too many id availability checks from this network: the limit is 120 per minute.",
    "hint": "Wait 57 seconds before trying again.",
    "details": { "retry_after_seconds": 57 }
  }
}

Rate limits are fixed windows counted in the database, so they hold across every server. "Per IP" means the client's address (the right-most X-Forwarded-For entry behind the load balancer). Everything behind one address shares one budget, so a fleet of runners behind one address should sign in once per job and reuse the session, not sign in once per command.

Rate limits

WhatLimitCounted per
Verification codes sent to one email or phone (sign-in, CLI, adding an address, requirements)10 per 10 minutes (contract)address
Verification codes sent from one network30 per 10 minutesIP
Adding an email or phone (POST /v1/me/emails, /phones), counted before any refusal20 per 10 minutes; 30 per 10 minutesaccount; IP
Hosted sign-in flows started (POST /v1/flows)300 per minuteIP
CLI code sign-ins started (POST /v1/cli/login/start)60 per 10 minutesIP
Device sign-ins started (POST /v1/device/authorize)60 per 10 minutes; 600 per 10 minutes for one app's toolsIP; app
Device codes looked up, approved or denied (/v1/device/{user_code}…)60 per 10 minutesCarbon
Connecting Google or Apple (POST /v1/me/identities/{provider})30 per houraccount
Silicon sign-in attempts (POST /v1/silicons/login)60 per minuteIP
Token exchanges with an outside OIDC token (grant_type=…:token-exchange)60 per minuteIP
Identity tokens (POST /v1/me/identity-tokens)60 per minuteSilicon
Silicon self-creations (POST /v1/silicons)10 successful per hour, and 60 attempts of any outcome per hourIP
Self-created Silicons waiting for one custodian20 pendingc:id or email
Transfer requests30 per hourcustodian
Silicon webhook test pings10 per hourSilicon
Id availability checks (GET /v1/ids/available)120 per minuteIP
Account lookups (/v1/accounts/{uuid} and /by-id/{id} together)600 per minuteapp or account
Id changes (own, or a custodian's for its Silicon; reclaims included)5 per rolling 24 hoursaccount
Photo uploads20 per hour; 20 per houraccount; sign-up
Imports60 requests per hour (dry runs and refused files count); 2,000,000 rows per 24 hoursapp
Bug reports (POST /v1/reports)5 per hourIP
Telemetry (POST /v1/telemetry/events)120 requests per minuteIP

Lockouts

WhatLock
10 wrong verification codes in a row for one address (any flow, the CLI, the account site)every code to that address is refused for 60 seconds (contract: 1 minute): 423 verification_locked. A right code ends the streak; a resend keeps it
10 wrong STKs in a row for one Siliconits sign-in is refused for 60 seconds: 423 login_locked

Lifetimes

WhatLifetime
Verification code (6 digits)10 minutes (contract); a resend replaces it. resend_available_at suggests waiting 30 seconds
Hosted sign-in flow (and its sa_flow cookie)60 minutes
Sign-up session (sa_signup)48 hours (contract)
Browser session (sa_session)900 days
Access token30 minutes, 1800 seconds (contract)
Refresh token / sign-in900 days from the sign-in, not extended by refreshing (contract); every refresh rotates the token
Authorization code120 seconds, single use
Short-lived token (slt_…)120 seconds, single use, one app
Sign-in from a trusted outside token (token exchange)until the outside token expires: at least 30 minutes, at most 12 hours; refresh tokens rotate within it
Identity token60 to 3600 seconds, default 300
A trusted issuer's keys (JWKS)cached for 10 minutes; fetched again for an unknown kid, at most every 30 seconds per issuer
Device code600 seconds; poll every 5 seconds (slow_down if faster)
Silicon custodian request (initial or transfer)14 days (contract: 2 weeks)
Id reservation after a change10 days (contract); the previous owner may take it back meanwhile
Proof token (sap_…)60 to 1800 seconds, default 1800
Proof (its refresh token, sapr_…)900 days; a User verification proof ends with its sign-in
Idempotency results24 hours; 10 minutes for responses carrying a new secret; an unfinished request holds its key for at most 120 seconds
Webhook deliveriesretried for 72 hours after the event (or after a replay)
Discovery document and JWKScacheable for 5 minutes
App credentialsverified results are cached for 60 seconds per server

Sizes and counts

WhatLimit
Handle (after c: / si:)3 to 30 characters of a-z 0-9 - _, case-insensitive (contract); reserved words: admin, administrator, root, system, support, help, security, silicon-accounts, account, silicon, silicons, carbon, carbons, api, www, mail, null, undefined, me, owner, staff
uuida-z A-Z 0-9, case-sensitive; 3 characters, then 4 once every 3-character uuid is used (contract); never reused
App id3 to 30 characters of a-z 0-9 - _, as Silicon Apps creates them (my_app, 2fa-tool); older ids of 2 to 40 characters of a-z 0-9 - starting with a letter (dm) keep working
Emails per Carbon / phones per Carbon10 / 10 (contract)
Display name1 to 100 characters, no control characters
Date of birthin the past, not before 1900-01-01; a Silicon's is its creation date
STKgenerated: stk- + 12 hex characters; chosen: stk- + 8 to 32 hex characters (contract)
URLs (photos, webhooks, …)2048 characters
client_label100 characters (longer ones are cut)
Profile photo2 MB (2,097,152 bytes); PNG, JPEG, WebP or GIF; 8192 px a side; 50 megapixels
Request body64 KB; photos 2 MB; PATCH …/signin-config 512 KB; imports 50 MB; Silicon Apps sync 5 MB
Time budget per request30 seconds; photo uploads and sync 60 seconds; imports 5 minutes (then 503 request_timeout)
Page size1 to 200, default 50
Idempotency-Key1 to 200 visible ASCII characters
X-Request-Id kept from the client1 to 128 characters of A-Z a-z 0-9 - _ . :
Redirect URIs / allowed origins / allowed email domains per app50 / 50 / 100
Brandinglogo_height 16 to 96 px, radius 0 to 40 px, inline logos 128 KB each, text contrast at least 4.5:1, copy.title 80 and copy.subtitle 200 characters
Import100,000 rows; 200 columns; column names 200 bytes; values 8 KB; lists 50 items; 10 emails and 10 phones per row; external_id 255 characters; display names cut at 100 characters
Concurrent import parses2 per server; a request waits up to 30 seconds for a slot, then 503 imports_busy (Retry-After: 15)
Webhook replay100 deliveries per request
Proof scopes20 per proof, each 1 to 100 characters of A-Z a-z 0-9 _ . : / -
App verification receiving appsexactly 1 per proof
Report message1 to 10,000 characters; pr_url https
Telemetry batch50 events; name ^[a-z0-9_.]{1,64}$; source 64 characters; step 200 characters; data 8 KB
Sign-in history shown to an app per memberthe last 20

Webhooks and messages

WhatValue
Answer time for a delivery10 seconds; a 2xx in time is success
Retry schedule10 s, 30 s, 1 min, 5 min, 15 min, 30 min, then hourly
Give up72 hours after the event (or after a replay): failed, replayable
Redirectsnot followed
Signature timestamp tolerance (Rust client default)5 minutes
Email and SMS sendingat most 8 attempts; a code's message stops retrying once the code expired

Silicon keys

WhatValue
Live keys per Silicon10
Assertion lifetime (exp - iat)at most 300 seconds (30 seconds of clock skew allowed)
Assertion jti1 to 200 characters, each used once
Key nameat most 100 characters

Trust relationships and identity tokens

WhatValue
Live trusts per Silicon20
Conditions per trust1 to 10
Condition claim name / value1 to 100 characters of a-z A-Z 0-9 _ - . : / / 1 to 500 characters
Issuer / audience of a trust300 / 400 characters
Trust nameat most 100 characters
Outside token16 KB
Clock skew on an outside token's exp, nbf, iat30 seconds
Fetching an issuer's discovery document or JWKShttps, 5 seconds to connect, 10 seconds in all, 256 KB, no redirects
Identity token audiences per Silicon0 to 20 (none until the custodian allows one), each at most 400 characters
Identity token signing keyRSA 2048, RS256

Event streams

WhatValue
Open streams (GET /v1/events/stream)5 per app or account; 500 per server (429 too_many_streams / 503 stream_capacity_reached, with Retry-After)
How often a stream looks for new eventsevery second, at most 100 events per read
Heartbeat (: heartbeat)after 15 seconds without events
Reconnect delay told to clients (retry:)5 seconds
Credentials checked againevery 30 seconds
Longest stream1 hour, then stream.closed with max_duration: reconnect with Last-Event-ID
Event types in ?types=at most 20
Subscriptions per appone webhook and one stream

Retention

Every 10 minutes a sweep deletes, in batches:

  • sign-in flows, 1 day after they expired;
  • authorization codes, short-lived tokens and device codes, 7 days after they expired;
  • verification codes, 1 day after they expired;
  • expired idempotency results;
  • id reservations, 1 day after they ended;
  • sign-up sessions, 7 days after they expired or were used;
  • used jtis of Silicon key assertions and of outside tokens, once they expired;
  • rate-limit windows older than a day.

Proof tokens are deleted 1 day after they expire, and every token of a proof 30 days after the proof ended.

History is never deleted: sign-ins, id changes, custodian transfers, proofs, sign-in setup versions and the audit log stay for good.

Related

Silicon Accounts · Reference · ReferenceHTTP API referenceFind any Accounts endpoint and who can call it, plus the rules every endpoint shares for errors, retries, pagination and limits.Silicon Accounts · Reference · ReferenceErrorsEvery error code we return, what caused it and what to do next, across the HTTP API, OAuth, the Rust client, webhooks and the CLI.Silicon Accounts · Learn · ExplanationTokens and sessionsWhat access and refresh tokens do, why a refresh token changes every time you use it, and what ends a sign-in.Silicon Accounts · Learn · ExplanationSecurityHow we protect credentials, sign-in sessions and webhook delivery, and what your app still needs to check itself.

Every page is plain Markdown at its address plus .md. Silicons can read llms.txt, llms-full.txt or the docs index, or call the MCP server.