Policy structure
Partner and application scope come from the authenticated authoring context. Do not copy internal
layer, partnerId, or appId fields from a resolved policy into CLI input. Activation dates belong to the saved record, not the definition.
Selectors
All provided selector fields must match. An omitted field does not add a restriction, subject to the legacy EVM behavior described below.userId and actorId are not supported fields in partner-authored CLI selectors. Use walletId to target a wallet.
Wallet families and routes
The authoring language also includes
evm.sign_raw, evm.sign_typed_data, evm.sign_authorization, evm.sign_message, and smart_account.user_operation. Use para keys permissions catalog KEY_ID --json to inspect supported facts and operators before targeting a route.
Use separate definitions when chain families need different routes, assets, or facts. A chainId array is useful for compatible networks; it does not convert amounts or combine balances between networks.
Conditions
Comparison operators are
eq, ne, lt, lte, gt, gte, and in; each fact supports a defined subset. Common facts include request.classification, request.to, request.value.baseUnits, request.value.asset, request.token.value.baseUnits, request.contract.address, request.method, and route-specific target or argument facts. A fact available on one signing route is not necessarily available on another.
Combine AND and OR conditions
This condition requires a native transfer, one of two recipients, and an amount at most the limit:when. For an EVM Request, an allow rule can grant matching transfers after consent. For a Guardrail, express the condition that should be denied or require approval. An allow rule does not turn an app-owned wallet’s default into an allowlist.
Amounts and spending windows
Amounts are canonical non-negative integer strings in the asset’s base units. They are not floating-point token amounts or fiat values. For example,10000000 means 0.01 SOL in a SOL transfer but a different quantity for an asset with different decimals.
An EVM native-spend condition can limit cumulative usage rather than just one transaction:
wallet.spend.erc20 with the token contract in asset for supported direct ERC-20 transfers. These are fixed spending windows, not a transaction timelock or a fiat budget. The current request and outstanding reservations matter when evaluating available spend. See the REST guide for metering boundaries.
Effects and multiple active policies
For matched standard rules, precedence is deny, then require approval, then allow. It is not first-match-wins, and adding an allow policy cannot override a denial. When standard rules provide no decision, the baseline behavior applies: app-owned signing is permitted unless restricted, while user-owned signing requires review without standing access. Missing facts that could change the decision can fail closed.
For example, a user may consent to small transfers while a separate policy denies transfers to a restricted recipient. A small transfer to that recipient is still denied. A different rule requiring approval is not bypassed merely because another rule allows the amount.
User-adjustable amounts
Add aparameter to a supported upper amount condition:
request.value.baseUnits, request.token.value.baseUnits, wallet.spend.native, and wallet.spend.erc20. Use lt/lte on an allow rule or gt/gte on a deny or require_approval rule; parameterized conditions cannot be negated.
There are no min or max fields in this declaration. The owner chooses a valid non-negative integer amount; the default is not a ceiling. Fixed conditions remain unchanged. Personal values are separate from immutable policy definitions and do not themselves grant consent.
Integrate consent and adjustable limits
Read, update, and reset personal values, or let users adjust them during Portal consent.
Conditional approval requirements
AttachapprovalRequirement to a require_approval rule. Its when still determines which requests need that workflow.
all requires every eligible person in the stage’s snapshot. For authenticated approvals, the initiating person cannot self-approve, and one person cannot supply approval in multiple stages. Provision enough distinct eligible people for the workflow to complete.
Eligibility clauses are alternatives: matching any clause qualifies a person. Eligibility can reference a role or an attribute: { "kind": "attribute", "name": "region", "operator": "eq", "value": "europe" }, or operator: "in" with a values array. Assignments are trusted backend data scoped to an authorization scope, not client-supplied claims.
Configure declared workflow settings
configurationManagerEligibility identifies users allowed to manage configuration. safeKnobs declares the settings that can change without rewriting the policy:
Amount-dependent stages use amountFact (request.value.baseUnits or request.token.value.baseUnits) and ordered minimumAmount values. A configuration cannot add arbitrary stages or rewrite the rule. These settings are distinct from a user’s personal spending parameters.
Choose the evidence
authenticated_approval records authenticated human decisions. transaction_signature collects verified signatures over the case’s transaction payload. Neither is wallet-owner consent, and collecting signatures is not the same as assembling or submitting an onchain multisig transaction.
A requirement supports 1–5 stages, numeric approval counts from 1–25 or all, and up to 10 eligibility clauses per stage. Validate the complete definition rather than relying only on these individual field limits.
Integrate conditional approvals
Connect this policy to approver UI, workflow configuration, and signature collection.