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

# Remove a Signer from a Wallet

> Remove a signer from an existing Crossmint wallet.

Use `removeSigner()` to remove a signer from an existing wallet. This revokes the signer's ability to perform day-to-day operations on behalf of the wallet. The wallet's recovery signer must approve the operation — the SDK handles this automatically.

For an overview of available signer types, see [Wallet Signers](/wallets/concepts/signers).

## Prerequisites

* An existing wallet with at least one signer registered
* **API key** with `wallets:signatures.create` and `wallets:transactions.create` scopes

## Remove a Signer

<Tabs>
  <Tab title="React">
    ```typescript theme={null}
    import { useWallet } from "@crossmint/client-sdk-react-ui";

    const { wallet } = useWallet();

    const result = await wallet.removeSigner({
        type: "external-wallet",
        address: "0x1234...abcd",
    });

    console.log("Signer removed:", result);
    ```
  </Tab>

  <Tab title="Node.js">
    ```typescript theme={null}
    import {
        createCrossmint,
        CrossmintWallets,
    } from "@crossmint/wallets-sdk";

    const crossmint = createCrossmint({
        apiKey: "YOUR_SERVER_API_KEY",
    });
    const crossmintWallets = CrossmintWallets.from(crossmint);

    const wallet = await crossmintWallets.getWallet(
        "<wallet-address>",
        {
            chain: "base-sepolia",
            signer: {
                type: "server",
                secret: process.env.CROSSMINT_SIGNER_SECRET,
            },
        }
    );

    const result = await wallet.removeSigner({
        type: "external-wallet",
        address: "0x1234...abcd",
    });

    console.log("Signer removed:", result);
    ```
  </Tab>

  <Tab title="Flutter">
    ```dart theme={null}
    import 'package:crossmint_flutter/crossmint_flutter_ui.dart';

    final controller = CrossmintWalletContext.of(context).requireWalletController;
    // Returns a runtime handle to the wallet already loaded by the controller —
    // no server-side create happens here.
    final wallet = controller.createEvmWallet();

    await wallet.removeSigner('external-wallet:0x1234...abcd');
    ```

    `removeSigner` takes the signer locator string directly. The SDK approves
    the removal via the wallet's recovery signer.
  </Tab>

  <Tab title="REST">
    When using the REST API, removing signers must be approved by the wallet's recovery signer. You must [approve the transaction](/api-reference/wallets/approve-transaction) to complete the removal.

    <Steps>
      <Step title="Remove the signer">
        Call the [remove signer](/api-reference/wallets/remove-delegated-key) endpoint.

        <CodeGroup>
          ```bash cURL theme={null}
          curl --request DELETE \
              --url 'https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:evm/signers/external-wallet:0x1234567890123456789012345678901234567890?chain=base-sepolia' \
              --header 'X-API-KEY: <x-api-key>'
          ```

          ```js Node.js theme={null}
          const url = 'https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:evm/signers/external-wallet:0x1234567890123456789012345678901234567890?chain=base-sepolia';

          const options = {
              method: 'DELETE',
              headers: {
                  'X-API-KEY': '<x-api-key>'
              }
          };

          try {
              const response = await fetch(url, options);
              const data = await response.json();
              console.log(data);
          } catch (error) {
              console.error(error);
          }
          ```

          ```python Python theme={null}
          import requests

          url = "https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:evm/signers/external-wallet:0x1234567890123456789012345678901234567890?chain=base-sepolia"

          headers = {"X-API-KEY": "<x-api-key>"}

          response = requests.delete(url, headers=headers)

          print(response.json())
          ```
        </CodeGroup>

        See the [API reference](/api-reference/wallets/remove-delegated-key) for more details.
      </Step>

      <Step title="Sign the approval returned in the response">
        Sign the approval message field returned in the response inside `transaction.approvals` using the recovery signer (admin signer).
      </Step>

      <Step title="Approve the transaction to complete the removal">
        Call the [approve transaction](/api-reference/wallets/approve-transaction) endpoint using the signature from the previous step and the transaction id returned in the call from Step 1.

        <CodeGroup>
          ```bash cURL theme={null}
          curl --request POST \
              --url https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:evm/transactions/b984491a-5785-43c0-8811-45d46fe6e520/approvals \
              --header 'Content-Type: application/json' \
              --header 'X-API-KEY: <x-api-key>' \
              --data '{
                  "approvals": [{
                      "signer": "email:user@example.com",
                      "signature": "0x1234567890abcdef..."
                  }]
              }'
          ```

          ```js Node.js theme={null}
          const url = 'https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:evm/transactions/b984491a-5785-43c0-8811-45d46fe6e520/approvals';

          const payload = {
              approvals: [{
                  signer: "email:user@example.com",
                  signature: "0x1234567890abcdef..."
              }]
          };

          const options = {
              method: 'POST',
              headers: {
                  'X-API-KEY': '<x-api-key>',
                  'Content-Type': 'application/json'
              },
              body: JSON.stringify(payload)
          };

          try {
              const response = await fetch(url, options);
              const data = await response.json();
              console.log(data);
          } catch (error) {
              console.error(error);
          }
          ```

          ```python Python theme={null}
          import requests

          url = "https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:evm/transactions/b984491a-5785-43c0-8811-45d46fe6e520/approvals"

          payload = {
              "approvals": [{
                  "signer": "email:user@example.com",
                  "signature": "0x1234567890abcdef..."
              }]
          }
          headers = {
              "X-API-KEY": "<x-api-key>",
              "Content-Type": "application/json"
          }

          response = requests.post(url, json=payload, headers=headers)

          print(response.json())
          ```
        </CodeGroup>

        See the [API reference](/api-reference/wallets/approve-transaction) for more details.
      </Step>
    </Steps>
  </Tab>
</Tabs>

## Next Steps

<CardGroup cols={3}>
  <Card title="List Signers" icon="list" href="/wallets/guides/signers/list-signers">
    View all signers registered on your wallet
  </Card>

  <Card title="Configure Recovery" icon="shield-halved" href="/wallets/guides/signers/configure-recovery">
    Set up recovery signers for your wallets
  </Card>

  <Card title="Transfer Tokens" icon="arrow-right-arrow-left" href="/wallets/guides/transfer-tokens">
    Send tokens from your wallet
  </Card>
</CardGroup>
