expiresAt field denies the signer after a given timestamp.
For an overview of signer types and roles, see Signers. To register a signer without scopes, see Add Signers to a Wallet.
Prerequisites
- Wallet: Create a wallet on EVM, Solana, or Stellar
- Recovery signer: The recovery signer must be available to approve the registration transaction
- API key with the
wallets.createscope. In staging, all scopes are included by default.
What Scopes Restrict
A scope applies to a single token on a single chain and can combine two optional restrictions:- Spending limit: a maximum amount the signer can transfer, optionally resetting on a fixed interval
- Recipient whitelist: a list of addresses or wallet locators the signer is allowed to transfer to
transfer. A signer with no scopes has unrestricted token spending; a signer with one or more scopes can only transfer the tokens listed in its scopes, and only within the configured restrictions.
In addition to scopes, the signer accepts a top-level expiresAt (ISO 8601) after which every transaction from the signer is rejected. expiresAt is not a scope field. It sits alongside the scopes array in the request body.
Scopes are checked before the transaction is broadcast onchain. A transfer that exceeds the spending limit, targets a non-whitelisted recipient, or is signed after
expiresAt is rejected at validation time.Add a Signer with Scopes
Two ways to attach scopes to a signer:@crossmint/wallets-sdk: pass ascopesarray toaddSigner(). The SDK handles approval through the wallet’s recovery signer automatically.expiresAtand wallet-creation-time scope registration require the REST API- REST API: direct control over the full registration request, including
expiresAtand registering scopes at wallet creation time
Using the SDK
UseaddSigner() and pass scopes in the options object. The wallet’s chain is inferred from the wallet itself; only the tokenLocator needs to match.
Node.js
chain: "solana" when fetching the wallet and a solana:<symbol-or-mint> token locator (for example, solana:usdc). For Stellar, use chain: "stellar" and a stellar:<symbol-or-contract-id> locator. To set expiresAt or to attach scopes at wallet creation, use the REST API below.
Using the REST API
Use REST when you needexpiresAt or when registering scopes at wallet creation.
- EVM
- Solana
- Stellar
Call the register delegated key endpoint with a The response includes a Amounts in
scopes array. Each scope’s tokenLocator must target the same EVM chain as the wallet.Register the scoped signer
transaction object with an approvals field describing what must be signed by the recovery signer.Sign the approval message with the recovery signer
Sign the message field returned under
transaction.approvals using the wallet’s recovery signer.Submit the approval
Call the approve transaction endpoint with the signature from the previous step and the transaction ID returned in step 1. The signer becomes active once the transaction is confirmed onchain.
spendingLimit.amount are decimal strings expressed in the token’s display units (for example, "10" USDC means 10 USDC, not 10 base units). Crossmint reads the token’s decimals() onchain to convert to the wei amount the policy contract expects.Add Scopes at Wallet Creation
Scopes andexpiresAt can also be set on each signer entry when creating a wallet. The signer is registered alongside the wallet. No separate approval call is required because the recovery signer authorizes the wallet creation.
The REST API uses
adminSigner and delegatedSigners as field names. These map to recovery and signers in the SDK. See the V1 migration guide for details.- EVM
- Solana
- Stellar
Common Patterns
One-Time Spending Allowance
Omitinterval to set an absolute, non-resetting cap. Once the signer has spent up to amount, every subsequent transfer is rejected until the signer is removed and re-registered.
Recurring Daily Allowance
Setinterval to the number of seconds in the period (for example, 86400 for 24 hours). The counter resets the first time the signer transfers after the interval elapses, measured from the moment the scope was registered onchain.
Recipient Whitelist
Pass a non-emptyrecipients array to restrict transfers to specific addresses. Wallet locators (for example, "email:user@example.com:evm") are supported in addition to raw addresses. An empty or omitted recipients array allows any recipient.
Restrict the Token Without Capping the Amount
Atransfer scope with no spendingLimit and no recipients restricts the signer to that one token but otherwise allows unlimited transfers of it. This is useful when the spending limit is enforced off-chain by your application.
Expire the Signer
SetexpiresAt at the signer level (not inside a scope). After the timestamp, every transaction signed by this signer is rejected.
See Also
- Add Signers to a Wallet: register a signer without scopes
- Remove a Signer: revoke a signer
- Register delegated key API reference: full request and response schema
- V1 Migration Guide: SDK and REST API terminology mapping
- Create wallet API reference: set scopes at wallet creation under
config.delegatedSigners

