> ## 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 from Unity.

<Note>
  Business Accounts are in **early access**. See the [overview](/docs/unity/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/unity/business-accounts/members-and-roles). Adding a signer grants them access, and removing one revokes only theirs, so 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.
</Info>

## Add a signer

`AddSigner` grants signing access to a user, and returns an `AddBusinessAccountSignerResponse` with the new `ShareSetId`. Identify the target with a `TargetIdentity`: a known `UserId`, or an `Identifier` plus `IdentifierType` (for example an email, in which case the user is created if they do not exist yet).

```csharp theme={"system"}
using System.Linq;
using DynamicSDK.Models.BusinessAccounts;
using UnityEngine;

var wallet = DynamicSDK.Instance.Wallets.UserWallets.FirstOrDefault();
if (wallet == null) return;

var response = await DynamicSDK.Instance.BusinessAccounts.AddSigner(
    accountAddress: wallet.Address,
    chainName: wallet.Chain,
    targetSignerIdentity: new TargetIdentity
    {
        Identifier = "teammate@acme.com",
        IdentifierType = BusinessAccountSignerIdentifierType.Email
    },
    businessAccountId: account.Id,
    walletId: wallet.Id,
    signerType: BusinessAccountSignerType.EndUser);

Debug.Log(response.ShareSetId);
```

<ParamField path="accountAddress" type="string" required>
  Address of the wallet the caller signs with, from `wallet.Address`.
</ParamField>

<ParamField path="chainName" type="string" required>
  Chain of that wallet, from `wallet.Chain` (for example `EVM` or `SOL`).
</ParamField>

<ParamField path="targetSignerIdentity" type="TargetIdentity" required>
  Who to add. Set `UserId` for a known user, or `Identifier` plus `IdentifierType`. For a phone number, also set `SmsCountryCode`; for a social account, set `SocialProvider`.
</ParamField>

<ParamField path="businessAccountId" type="string">
  The account that owns the wallet.
</ParamField>

<ParamField path="walletId" type="string">
  The wallet to add the signer to.
</ParamField>

<ParamField path="signerType" type="BusinessAccountSignerType?">
  `EndUser` for a person, `Server` for a server signer.
</ParamField>

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

`IdentifierType` is a `BusinessAccountSignerIdentifierType`: `Email`, `PhoneNumber`, `ExternalUserId`, `SocialUsername`, `SocialAccountId`, or `Id`.

## Read the current signers

`Get` returns the account with its signers, so you can show who can sign and get the signer ID needed for removal.

```csharp theme={"system"}
var detail = await DynamicSDK.Instance.BusinessAccounts.Get(account.Id);

foreach (var signer in detail.Signers.Where(s => s.WalletId == wallet.Id))
{
    Debug.Log($"{signer.Id}, type: {signer.Type}, user: {signer.UserId}");
}
```

## Remove a signer

`RemoveSigner` revokes a signer's access to one wallet, and returns the removed `BusinessAccountSigner`.

```csharp theme={"system"}
var removed = await DynamicSDK.Instance.BusinessAccounts.RemoveSigner(
    account.Id, wallet.Id, signerId);
```

<Warning>
  You cannot remove the **last active signer** on a wallet, because nobody could then approve transactions. Add another signer, or [remove the wallet](/docs/unity/business-accounts/add-wallets), first.
</Warning>

## Next steps

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

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