Apps can use Privy policies to restrict which transfer actions a wallet or signer can take. For transfers, Privy evaluates policies against the original request body sent to theDocumentation Index
Fetch the complete documentation index at: https://docs.privy.io/llms.txt
Use this file to discover all available pages before exploring further.
transfer endpoint before it prepares the underlying
transactions.
That means transfer rules should match request-body fields like source.asset, source.amount,
source.chain, and destination.address.
Supported methods
Transfer policies support a single rule method:transfer
Supported conditions
Transfer rules supportaction_request_body conditions for the fields below:
| Field source | Field | Supported operators | Notes |
|---|---|---|---|
action_request_body | source.asset | eq, in, in_condition_set | Matches a named asset such as “USDC” or “ETH”. |
action_request_body | source.asset_address | eq, in, in_condition_set | Matches a custom token contract address. |
action_request_body | source.amount | eq, gt, gte, lt, lte | Value must be a positive decimal string, such as “10.5”. |
action_request_body | source.chain | eq, in, in_condition_set | Matches the source chain, such as “base” or “solana”. |
action_request_body | destination.address | eq, in, in_condition_set | Matches the recipient wallet address. |
action_request_body | destination.asset | eq, in, in_condition_set | Matches the destination asset for cross-asset transfers. |
action_request_body | destination.chain | eq, in, in_condition_set | Matches the destination chain for cross-chain transfers. |
system conditions, such as current_unix_timestamp, for
time-based controls.
Transfer policies support both
chain_type: "ethereum" and chain_type: "solana". For transfer
methods, the policy engine only accepts action_request_body and system conditions.Choose source.asset or source.asset_address
Use source.asset if your app sends named assets like "USDC" or "ETH". Use
source.asset_address if your app sends custom token contract addresses.
This also affects runtime matching:
- A rule using
source.assetwill not match a request that sendssource.asset_address. - A rule using
source.asset_addresswill not match a request that sendssource.asset.
Example
The example below allows:- transfers of USDC up to
1000units to an approved destination address - transfers on the Base chain only
policy_ids. For signer-specific transfer
permissions, attach the policy as an override policy on a signer instead.
- Node SDK
- REST API
owner_id, the wallet update must be authorized by that owner.Common patterns
- Restrict transfers to an allowlist of destination addresses with
destination.address: inordestination.address: in_condition_set. - Limit which assets can be transferred with
source.assetorsource.asset_address. - Enforce maximum transfer size with
source.amount. - Lock transfers to a specific chain with
source.chain. - Add time-based controls with
system.current_unix_timestamp. - Combine chain and destination controls for cross-chain transfer restrictions.
Next steps
Create a policy
Learn more about creating and managing policy objects.
Conditional policies per signer
Apply different transfer permissions to different signers on the same wallet.

