# Signers \[The keys in an account's signer set that approve its transactions]

A signer is a [signing key](/members/keys) (a passkey or EOA belonging to a [member](/members)) that has been added to an [account](/accounts)'s signer set. Approvals are counted against the account's [threshold](/accounts/thresholds): a transaction executes once enough signers have signed. The signer set stores public keys onchain; private keys stay with the members.

Managing signers is an onchain edit to one account's signer set (see [Editing](/accounts/editing)), and is separate from managing a member's [signing keys](/members/keys) in personal settings: adding or removing a key changes no account's signer set, and removing a signer from an account doesn't delete the member's key.

## Signers vs membership

Signing authority is separate from [membership](/members) and [roles](/teams/roles). The two often overlap 1:1, but are distinct:

| | Team member | Signer |
| --- | --- | --- |
| Stored | Offchain | Onchain (account's signer set) |
| Scoped to | A team | An account |
| What it is | A person's association with a team | A signing key belonging to a member |
| Grants | Visibility + [role](/teams/roles) capabilities | Authority to approve transactions, counted against the account's threshold |
| Managed in | [Settings > Members](https://app.splits.org/settings/team/members/) | Account settings > Signers ([how](/accounts/editing#changing-signers-and-thresholds)) |

Two rules connect them:

1. **Every signer on a team's accounts must be a member of that team.**
2. **Neither membership nor any role ever makes someone a signer.** Adding a signer is a separate, onchain action.

## Recovery signers

The [Root account](/accounts#root)'s signers are the team's recovery signers: EOAs chosen at team setup that can reset every other account's signers. See [Recovery](/teams/recovery#recovery-signers).

## Programmatic access

Via the [Splits CLI / MCP](/introduction/agents):

* `splits accounts signers <address>`: an account's signers and threshold (**Read** scope)
* `splits accounts update-signers <address> ...`: propose signer/threshold changes; approval happens in the web UI (**Owner** scope)
* `splits members signers <userId>`: a member's passkey IDs, for adding them as a signer (**Read** scope)
