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.
Signer removal is supported on EVM, Solana, and Stellar. For more context on signer roles and removal, see Wallet 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 recovery signer.When using the REST API, removing signers must be approved by the wallet’s recovery signer. You must approve the transaction to complete the removal.
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 See the API reference for more details.
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' \
--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';
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"
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';
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' \
--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"
headers = {"X-API-KEY": "<x-api-key>"}
response = requests.delete(url, headers=headers)
print(response.json())
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).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 signers for your wallets
Transfer Tokens
Send tokens from your wallet

