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.
A replacement keeps the policy’s id, selector, and metadata.productMode. To change the selector or mode, create a separate policy.
Selectors
All provided selector fields must match. An omitted optional field does not add a restriction. The selector accepts only these fields:walletId and userId cannot be combined in one selector.
actions decide which kinds of requests the rule governs.
Network identifiers
A
chainId list matches any listed network. It does not convert amounts or combine balances between networks.
Rules
Actions by wallet type
Each fact in
when must be available for every action the rule names. For example, on a Solana policy wallet.spend.native is available for transfer_native but not for transfer_tokens. An "all" rule can read only facts available for every action, so name specific actions to compare request details.
A
raw_signature rule can read only para.wallet.* facts. Use para keys permissions catalog KEY_ID --json to inspect supported facts and operators.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.target, request.value.baseUnits, request.value.asset, request.token.value.baseUnits, request.token.asset, request.contract.address, request.method, and decoded argument facts. Each fact is available only for certain wallet types and actions.
Each rule’s
when nests at most 6 levels and contains at most 12 conditions, counting all, any, and not groups.Combine AND and OR conditions
This EVM Request rule covers native transfers and allows one of two recipients with an amount at most the limit:allow rule can grant matching transfers after consent. In a Guardrail, express the condition that should be denied or require approval. A Guardrail allow rule can only permit raw signatures, so it 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.
Spend facts limit cumulative usage rather than one transaction. Use them only in aggregate conditions with lt, lte, gt, or gte and a window: a positive integer followed by ms, m, h, or d, such as 24h.
On a Solana policy, this condition limits USDC spend to 100 USDC per 24-hour window. Use it in a rule whose
actions are ["transfer_tokens"]:
Effects and multiple active policies
The policy mode limits which effects a rule can use:
For matched 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 no rule provides a decision, the default behavior applies: app-owned signing is permitted unless restricted, and user-owned signing requires review without standing access. Missing facts that could change the decision can fail closed.
While Permissions is on, Para denies raw signatures for app-owned and user-owned wallets unless an active policy that applies to the wallet has a rule allowing the
raw_signature action. Raw signatures include sign-raw requests and message signing from wallets that cannot sign as EVM, such as Solana, Stellar, and Sui wallets. The Developer Portal forms cannot create this rule; use JSON authoring.
For example, a Request may allow small transfers while another of its rules requires approval for transfers to a specific recipient. A small transfer to that recipient still requires approval. In Guardrails, a matching deny rule wins over a matching require_approval rule.
User-adjustable amounts
Add aparameter to a supported upper amount condition:
request.value.baseUnits, request.token.value.baseUnits, wallet.spend.native, wallet.spend.erc20, and wallet.spend.token. 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.
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 and requires a Request policy. 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.