Authenticate and select the beta key
Install the CLI, then authenticate with your developer account. These commands require access to the selected organization and project, not just possession of its public API key.Use the key’s ID for
KEY_ID. The catalog describes the available authoring language; state returns the current policy records. Use para keys permissions state to manage these policies; the parent command returns a legacy status view.Start with a Solana transfer Request
Save this document as This selector applies to every Solana wallet under the selected API key. Add
solana-transfers.json. It asks a user for standing access to native SOL transfers up to 0.01 SOL. 10000000 is an integer amount in lamports, not a dollar amount. actions limits the rule to native transfers, and the asset condition pins the transfer to native SOL.solana-transfers.json
walletId to limit it to specific wallets, or chainId (for example "solana:mainnet") to limit it to one network. For an app-owned wallet, design a Guardrail with the appropriate deny/approval rules instead of assuming this user-consent Request has the same meaning.Validate, save, and activate
policy.recordId from the create response, then activate that record:--effective-from <utc-iso> or --effective-until <utc-iso> to create or replace. Without --json, validate, create, and replace print a warning for each active policy that overlaps this one.Validation checks the policy against the trusted project/key context. Creating a draft does not enable its behavior. Activation enables policy enforcement and supersedes an active version with the same logical policy ID.Exercise the user flow
Use the normal Solana signer integration with a user-owned wallet. Grant the Request through Portal, then test an amount below the limit and one above it. The first can use standing access; the second does not receive permission from this rule and follows the remaining policies and review flow.
Integrate consent and adjustable limits
Update or retire the policy
To replace a policy, keep itsid, selector, and metadata.productMode, and set version to the next integer. A different selector is a separate policy, so create it instead. Replacing an active record takes effect immediately; replacing a draft keeps the replacement in draft. Without activation flags, the replacement keeps the current activation window.