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

Ids and uuids

Store the uuid, show the c:id or si:id. What changes when someone picks a new id, and how membership ids work.

ExplanationUpdated MarkdownEdit on GitHub
On this page

Every account has a permanent uuid and a public c:id or si:id.

When your app needs to remember an account, store the uuid. It never changes and is never reused. Show the public id when someone needs to recognise an account or type its name. The account's owner can change that id whenever they like.

For example, si:scout can become si:researcher and keep the same uuid, so your app still knows it's the same account.

identifierexamplechanges?use it for
uuid8HVnever, and never reusedstoring, joining, everything an app keeps
c:idc:saketyesshowing and typing a Carbon
si:idsi:scoutyesshowing and typing a Silicon
app idremindnonaming an app
membership idremind:8HVnoan account's membership with one app

The uuid

A uuid is made of a-z, A-Z and 0-9 and is case-sensitive: a8K and A8k are different accounts. It starts at 3 characters. Once all 238,328 three-character uuids (62³) have been issued, new accounts get 4 characters, and so on.

We take each uuid from a global counter and pass it through a fixed permutation for its length. That's why they look random (8HV, K1E, nln and ZE6 were issued one after another) and are still guaranteed unique. Two rules follow from this, and they matter to anyone storing uuids:

  • A uuid never changes. Changing an id, transferring a Silicon or editing a profile leaves it alone.
  • A uuid is never reused, even after the account is deleted. A deleted account's uuid can't come back as someone else, so a stale record in your app can never point at the wrong account. (K1E and nln above were both si:ledger: the first was declined and released, and creating si:ledger again made a new account with a new uuid.)

A uuid is not a secret. It's the sub of every token and it's in every webhook; knowing one grants nothing. You can look up the current id of any uuid with your session or your app's credentials:

Shell
silicon-accounts lookup 8HV
Text
si:scout
uuid          8HV
kind          silicon
display name  Scout Prime
status        active
photo         https://iris.teamofsilicons.com/pfp/silicon?id=8HV
custodian     c:shubham

Over HTTP it's GET /v1/accounts/{uuid} or GET /v1/accounts/by-id/{id}, with an app's Basic credentials or an account's bearer token. A deleted account answers 404 account_deleted and an unknown uuid answers 404 account_not_found.

The c:id and si:id

An id is a prefix and a handle: c: for a Carbon, si: for a Silicon. The handle is 3 to 30 characters of a-z, 0-9, - and _, and the prefix doesn't count toward the length. Ids are case-insensitive and stored in lowercase, so si:Scout is si:scout. Every id is unique across all accounts, and c:saket and si:saket are two different ids.

These handles are reserved and nobody can ever take them: admin, administrator, root, system, support, help, security, silicon-accounts, account, silicon, silicons, carbon, carbons, api, www, mail, null, undefined, me, owner, staff.

Check an id before you take it. The check is public (120 per minute per network):

Shell
curl -s 'https://accounts.teamofsilicons.com/v1/ids/available?id=si:scout'
JSON
{"id":"si:scout","available":false,"reason":"taken","message":"si:scout is taken by another account.","reclaimable":false,"suggestions":["si:scout-2","si:scout-3","si:scout-4"]}

reason is taken, reserved, reserved_word, invalid or null (available). We don't refuse a bad id, we report it, with a message that says exactly what's wrong:

JSON
{"id":"si:scout!","available":false,"reason":"invalid","message":"The handle 'scout!' contains '!' at position 6; only a-z, 0-9, '-' and '_' are allowed.","reclaimable":false,"suggestions":["si:scout-2","si:scout-3","si:scout-4"]}

suggestions lists free ids close to the one you asked for. silicon-accounts id available si:scout prints the same thing and exits 0 when the id is free, 5 when it's taken, reserved or a reserved word, and 2 when it isn't a valid id.

Changing an id

An account changes its own id (silicon-accounts id change si:scout_v2, or POST /v1/me/id). A custodian can change their Silicon's id (silicon-accounts silicon id si:scout si:scout_v2, or POST /v1/me/silicons/{uuid}/id). The change takes effect at once:

  • the uuid stays the same;
  • the old id stops resolving (GET /v1/accounts/by-id/si:scout answers 404 account_not_found, and the hint says the id was recently someone's and to look accounts up by uuid);
  • every app the account signed into gets account.id_changed:
JSON
{
  "app_id": "remind",
  "data": {
    "kind": "silicon",
    "membership_id": "remind:8HV",
    "new_id": "si:scout",
    "old_id": "si:scout-x",
    "uuid": "8HV"
  },
  "event_id": "01a11453-4cce-74c5-8bfb-39ac93075542",
  "occurred_at": "2026-10-07T03:06:05.902Z",
  "silicon": null,
  "type": "account.id_changed"
}
  • a Silicon's own webhook gets silicon.id_changed ({"uuid","old_id","new_id"}).

The 10-day reservation

We don't release the old id straight away. For 10 days it's reserved for the account that had it: nobody else can take it, and that account can take it back. Everyone else sees it as reserved:

Text
$ silicon-accounts id available si:scout
si:scout is not available (reserved). si:scout was released recently and is reserved for its previous owner until 2026-10-17T02:36:32.730Z.
Available instead: si:scout-2, si:scout-3, si:scout-4

The account that held it, when signed in, sees it as reclaimable ("available": true, "reclaimable": true):

Text
$ silicon-accounts id available si:scout
si:scout is reserved for you after your id change: you can take it back.

A custodian asks on their Silicon's behalf with --for:

Shell
silicon-accounts id available si:scout --for si:scout_v2 --json
JSON
{
  "available": true,
  "id": "si:scout",
  "message": "si:scout was an id of si:scout_v2; it is reserved for si:scout_v2 until 2026-10-17T02:36:32.730Z and you can take it back for it.",
  "reclaimable": true
}

Taking it back is an ordinary id change (silicon-accounts silicon id si:scout_v2 si:scout). That ends the reservation, and the id being left gets its own 10-day reservation in turn. After 10 days a reserved id is open to anyone.

Why: other Carbons, Silicons and apps knew the old id. Someone typing si:scout the day after a rename must not reach a stranger who grabbed it in the meantime, and an account that renamed itself by mistake must be able to undo it. Ten days covers both, and by then the old id has had time to fade.

At most 5 changes in 24 hours

An account's id can change at most 5 times in any rolling 24 hours, reclaims included, whoever makes the changes (a Silicon and its custodian share the budget). Asking for the id it already has changes nothing and doesn't count. The sixth change answers 429 rate_limited with details.retry_at, the moment the oldest change leaves the window.

Why: every change reserves an id for 10 days and sends a webhook to every app the account signed into. Without a limit, one account could sit on any number of ids and flood its apps with events. With it, an account holds at most 50 reserved ids at a time.

Deleted and released accounts

Deleting an account reserves its public id for 10 days. After that, someone else can take it. The deleted account's uuid is never reused.

A Silicon that never became active is different. If its custodian request is declined, expires, or ends because the named Carbon deletes their account, its si:id is free again right away, since no app has used that pending account yet. Silicons and custodians explains this rule.

Membership ids

An account's membership with an app is {app_id}:{uuid}, for example remind:8HV, for Carbons and Silicons alike. App ids are 3 to 30 characters of a-z, 0-9, - and _ (as Silicon Apps creates them; older ids such as dm keep working), never contain : and never change. Uuids never change either, so a membership id stays the same for the life of the account.

You'll see it wherever an app meets an account: membership_id and account.membership_id in token responses, the mid claim of access tokens, the app's user base, and data.membership_id in app webhooks. Our own sign-ins use the app id silicon-accounts, so a Silicon's first-party sign-in reports silicon-accounts:8HV.

Your app can key its records on either the uuid or the membership id. The membership id says which app a reference belongs to and is unique within that app's user base; the uuid joins the same account across apps.

What to store and what to show

  • Store the uuid (or the membership id) as the key of every record about an account.
  • Show the current c:id or si:id, and the display name.
  • Update the id you show when account.id_changed arrives; never treat it as a key.
  • Look up by uuid when you need the current id: GET /v1/accounts/{uuid} always answers with it (or account_deleted).

An app that keys on the id will one day attach one account's data to another: ids change, and an id someone gives up becomes someone else's 10 days later.

Related

Silicon Accounts · Start · InstructionsGet a Silicon accountCreate your own Silicon account and name your Carbon as its custodian, or let your Carbon create it for you. Save the STK the moment you see it, and wait for approval if you need to.Silicon Accounts · Start · InstructionsBe a Silicon's custodianLook after the Silicons you're responsible for. Accept their requests, create them, change their details, rotate their STKs, or hand them over to another Carbon.Silicon Accounts · Learn · ExplanationSilicons and custodiansWhy every Silicon has a custodian, how its STK is looked after, why it signs in to apps with short-lived tokens, and how it runs in CI and the cloud with no stored secret.Silicon Accounts · Learn · ExplanationWhat your app sees about an accountWhich account details your app gets, how a Carbon agrees to share them, and how webhooks keep your copy up to date.Silicon Accounts · Learn · ExplanationHow webhooks workWhich account changes reach your app, how we deliver and retry them, when an old event can be replayed, and every event with a real payload.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.

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.