removeSigner() to remove an operational signer from an existing wallet. This revokes the signer’s ability to perform day-to-day operations on behalf of the wallet. One of the wallet’s recovery methods must approve the operation — the SDK handles this automatically. A wallet with several recovery methods needs one selected with useRecoveryMethod() first; see Manage Recovery Methods.
Signer removal is supported on EVM, Solana, and Stellar. For more context on signer roles and removal, see Operational Signers.
Prerequisites
- An existing wallet with at least one signer registered
- API key with
wallets:signatures.createandwallets:transactions.createscopes
Remove a Signer
- React
- Node.js
- Flutter
- REST
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);
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);
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 selected recovery method.When using the REST API, removing signers must be approved by one of the wallet’s recovery methods. You must approve the transaction to complete the removal.
1
Remove the signer
Call the remove signer endpoint. Replace the wallet locator and signer locator with your own values.EVM — include the Solana — omit the Set the
The signer locator (e.g.
external-wallet:0x… or server:0x…) is returned in the response when you add a signer. You can also retrieve it by listing the wallet’s signers.chain query parameter: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&approver=email:user@example.com' \
--header 'X-API-KEY: <x-api-key>'
const url = 'https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:evm/signers/external-wallet:0x1234567890123456789012345678901234567890?chain=base-sepolia&approver=email:user@example.com';
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);
}
import requests
url = "https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:evm/signers/external-wallet:0x1234567890123456789012345678901234567890?chain=base-sepolia&approver=email:user@example.com"
headers = {"X-API-KEY": "<x-api-key>"}
response = requests.delete(url, headers=headers)
print(response.json())
chain query parameter; the wallet locator must include solana as the chain type:const url = 'https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:solana/signers/server:SERVER_SIGNER_ADDRESS?approver=email:user@example.com';
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);
}
curl --request DELETE \
--url 'https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:solana/signers/server:SERVER_SIGNER_ADDRESS?approver=email:user@example.com' \
--header 'X-API-KEY: <x-api-key>'
import requests
url = "https://staging.crossmint.com/api/2025-06-09/wallets/email:user@example.com:solana/signers/server:SERVER_SIGNER_ADDRESS?approver=email:user@example.com"
headers = {"X-API-KEY": "<x-api-key>"}
response = requests.delete(url, headers=headers)
print(response.json())
approver query parameter to the locator of the recovery method that authorizes the removal.See the API reference for more details.2
Sign the approval returned in the response
Sign the approval message field returned in the response inside
transaction.approvals using the recovery method.3
Approve the transaction to complete the removal
Call the approve transaction endpoint using the signature from the previous step and the transaction ID returned from the remove-signer call. Replace the wallet locator in the URL with the one you used in Step 1 (for example, use See the API reference for more details.
:solana instead of :evm for Solana wallets).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..."
}]
}'
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);
}
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())
Next Steps
List Signers
View all signers registered on your wallet
Configure Recovery
Set up recovery methods for your wallets
Transfer Tokens
Send tokens from your wallet

