> ## Documentation Index
> Fetch the complete documentation index at: https://www.dynamic.xyz/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Manage Signers

> Grant and revoke the ability to sign with a business-account wallet.

<Note>
  Business Accounts are in **early access**. See the [overview](/docs/javascript/reference/business-accounts/overview) for the model.
</Note>

A **signer** can approve transactions and messages with a specific wallet. Signing access is separate from [membership roles](/docs/javascript/reference/business-accounts/members-and-roles). Adding a signer grants them access; removing one only revokes theirs — the wallet and other signers stay intact.

<Info>
  Only an owner or admin can add signers, and the caller must already be an **active signer** on that wallet. This operation requires [step-up authentication](/docs/javascript/reference/business-accounts/step-up-auth).
</Info>

## Add a signer

`addBusinessAccountSigner` grants signing access to a user and returns a `shareSetId`. Identify them by a known `userId`, or by an `identifier` + `identifierType` (for example an email — the user is created if they don't exist yet).

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"system"}
    import { addBusinessAccountSigner } from '@dynamic-labs-sdk/client/waas';

    const { shareSetId } = await addBusinessAccountSigner({
      businessAccountId: account.id,
      walletAccount,                 // a WalletAccount the caller can sign with
      signerType: 'endUser',
      targetIdentity: { identifier: 'teammate@acme.com', identifierType: 'email' },
    });
    ```
  </Tab>

  <Tab title="React">
    ```tsx theme={"system"}
    import { useAddBusinessAccountSigner } from '@dynamic-labs-sdk/react-hooks';

    const AddSigner = ({ walletAccount, businessAccountId }) => {
      const { mutate, isPending } = useAddBusinessAccountSigner();
      return (
        <button
          disabled={isPending}
          onClick={() =>
            mutate({
              businessAccountId,
              walletAccount,
              signerType: 'endUser',
              targetIdentity: { userId: 'user-123' },
            })
          }
        >
          Add signer
        </button>
      );
    };
    ```
  </Tab>
</Tabs>

<ParamField path="walletAccount" type="WalletAccount" required>
  The wallet to add a signer to, from the caller's `getWalletAccounts()`.
</ParamField>

<ParamField path="targetIdentity" type="{ userId } | { identifier, identifierType }" required>
  Who to add — a known `userId`, or an `identifier` (e.g. email) plus its `identifierType`.
</ParamField>

<ParamField path="signerType" type="'endUser' | 'server'">
  Whether the new signer is an end user or a server signer.
</ParamField>

<ParamField path="password" type="string">
  Passphrase for the target's key share, when your environment encrypts shares.
</ParamField>

## Remove a signer

`removeBusinessAccountSigner` revokes a signer's access to a wallet. The wallet and every other signer are untouched.

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"system"}
    import { removeBusinessAccountSigner } from '@dynamic-labs-sdk/client/waas';

    await removeBusinessAccountSigner({
      businessAccountId: account.id,
      walletId,
      signerId,
    });
    ```
  </Tab>

  <Tab title="React">
    ```tsx theme={"system"}
    import { useRemoveBusinessAccountSigner } from '@dynamic-labs-sdk/react-hooks';

    const { mutate } = useRemoveBusinessAccountSigner();
    mutate({ businessAccountId, walletId, signerId });
    ```
  </Tab>
</Tabs>

<Warning>
  You can't remove the **last active signer** on a wallet — otherwise no one could approve transactions. Add another signer, or remove the wallet, first.
</Warning>

## Next steps

<CardGroup cols={2}>
  <Card title="Members & roles" icon="users" href="/docs/javascript/reference/business-accounts/members-and-roles">
    Administer who can manage the account.
  </Card>

  <Card title="Sign transactions" icon="signature" href="/docs/javascript/reference/business-accounts/signing">
    Use a signer's share to sign.
  </Card>
</CardGroup>
