{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-products/wallet/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Manage policy rules via the API","description":"User guides, API reference, and support resources.","siteUrl":"https://docs.ripple.com","lang":"en-US","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"manage-policy-rules-via-the-api","__idx":0},"children":["Manage policy rules via the API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide shows you how to create, list, get, and delete a wallet's policy rules through the Ripple Custody (Wallet) API. A policy rule has a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["kind"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]}," rules let a wallet send up to an amount, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVAL"]}," rules hold large transfers for named approvers, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TRAVEL_RULE"]}," rules require a Travel Rule data exchange. A wallet can't send an asset until a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]}," rule applies to it."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For how the rule kinds work together, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies#how-the-rule-kinds-work-together"},"children":["Policies"]},". To manage rules in the console instead, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/manage-policies"},"children":["Manage policies via the console"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"policy-actions","__idx":1},"children":["Policy actions"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Action"},"children":["Action"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Console role"},"children":["Console role"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Console procedure"},"children":["Console procedure"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"API procedure"},"children":["API procedure"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Create a limit, approval, or Travel Rule rule"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Owner, Administrator"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/manage-policies#create-a-policy-via-the-console"},"children":["Create a policy"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#create-a-policy-rule-via-the-api"},"children":["Create a policy rule"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Check rule status"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["All except Viewer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/manage-policies#view-policy-status-via-the-console"},"children":["View policy status"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#list-a-wallets-policy-rules-via-the-api"},"children":["List a wallet's policy rules"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Get a policy rule"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["All except Viewer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Open the wallet's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Policy"]}," tab."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#get-a-policy-rule-via-the-api"},"children":["Get a policy rule"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Change a rule"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Owner, Administrator"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/manage-policies#modify-a-policy-via-the-console"},"children":["Modify a policy"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#change-a-policy-rule-via-the-api"},"children":["Change a policy rule"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Delete a rule"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Owner, Administrator"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/manage-policies#delete-a-policy-via-the-console"},"children":["Delete a policy"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#delete-a-policy-rule-via-the-api"},"children":["Delete a policy rule"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Manage wallet limits"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["-"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["-"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#use-the-wallet-limits-endpoints-via-the-api"},"children":["Use the wallet limits endpoints"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Permissions:"]}," In the console, owners and administrators can create and delete policy rules. Owners, administrators, proposers, and approvers can approve them, and every role except viewer can view them. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/organization-and-access/users-and-roles#policies"},"children":["User roles and permissions"]},". The API procedures need an API credential of type ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CONTROLS"]},". See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#prerequisites"},"children":["Prerequisites"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prerequisites","__idx":2},"children":["Prerequisites"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["An API credential of type ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CONTROLS"]},"."]}," Grant it the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["policy:create"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["policy:read"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["policy:delete"]}," permissions at organization, vault, or wallet scope. The older wallet limits endpoints use the separate ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["keylimit:create"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["keylimit:read"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["keylimit:delete"]}," permissions. Without the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["policy:*"]}," permissions, the policy rules endpoints return HTTP 403 with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAL000.002"]},", even when the wallet limits endpoints work. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/organization-and-access/api-credentials"},"children":["API credentials overview"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/organization-and-access/api-credentials/manage-api-credentials"},"children":["Manage API credentials"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["An access token."]}," Exchange your credential's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clientId"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clientSecret"]}," for a token. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/get-started/use-the-api#step-2-authenticate"},"children":["Getting started with the API"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A vault and wallet."]}," Policy rules belong to one wallet. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/get-started/console/create-your-first-vault"},"children":["Create your first vault"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/get-started/console/create-your-first-wallet"},"children":["Create your first wallet"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The asset's ID."]}," Policy rules identify the asset by its registry ID, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["3::XRP"]},". Read ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["asset.id"]}," from the wallet's balances (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v2/vaults/{vaultId}/wallets/{walletId}/balances"]},", which needs a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WALLETS"]}," credential), or list assets from the registry. For example, to find a native asset, filter by blockchain and standard: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v2/registry/assets?filter.blockchain.eq=<blockchain>&filter.standard.eq=NATIVE"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For the base URLs, token lifetime, pagination, filtering, and error format that every endpoint shares, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-and-developer-experience/api-conventions"},"children":["API conventions"]},"."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Policy rule approvals"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If your organization has a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Policy rules"]}," approval group, a rule that you create or delete through the API waits for approvers before the change takes effect. A new rule has status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RULE_CREATION_APPROVAL_PENDING"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["active: false"]}," until approvers approve it. Approvers act on the request in the console."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"create-a-policy-rule-via-the-api","__idx":3},"children":["Create a policy rule via the API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["API reference:"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_createpolicyrule"},"children":["Create a policy rule"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Required permission:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["policy:create"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Send a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST"]}," request to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/v2/vaults/{vaultId}/wallets/{walletId}/policy-rules"]},". Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["definition.kind"]}," to the rule kind, and include only the matching object: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limit"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["approval"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["travelRule"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This example creates a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]}," rule that caps payments to any counterparty at 10,000 XRP in a rolling 24-hour window:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/policy-rules \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"trigger\": \"OUTBOUND_INITIATED\",\n    \"assetId\": \"3::XRP\",\n    \"matchers\": [\n      { \"type\": \"ALL_COUNTERPARTIES\", \"values\": [] }\n    ],\n    \"definition\": {\n      \"kind\": \"LIMIT\",\n      \"limit\": {\n        \"amount\": {\n          \"threshold\": \"10000\",\n          \"operator\": \"GT\",\n          \"aggregation\": \"ROLLING\",\n          \"duration\": \"86400s\"\n        }\n      }\n    }\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVAL"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TRAVEL_RULE"]}," rules, use the same request with a different ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["definition"]},". See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/approvals/step-up-approvals#create-a-step-up-approval-rule-via-the-api"},"children":["Create a step-up approval rule via the API"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/compliance/travel-rule/set-up-travel-rule#create-a-travel-rule-policy-rule-via-the-api"},"children":["Create a Travel Rule policy rule via the API"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"request-body","__idx":4},"children":["Request body"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Required"},"children":["Required"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["trigger"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OUTBOUND_INITIATED"]}," for transactions the wallet sends, or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INBOUND_DETECTED"]}," for deposits into the wallet. Only ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TRAVEL_RULE"]}," rules support ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INBOUND_DETECTED"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["assetId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Conditional"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The asset's registry ID. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVAL"]}," rules require it. To apply a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TRAVEL_RULE"]}," rule with no amount condition to all assets, leave it out. The asset's blockchain must match the wallet's blockchain."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["matchers"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["array"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Filters that narrow which transactions the rule applies to. Send each matcher as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ \"type\": \"...\", \"values\": [\"...\"] }"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVAL"]}," rules don't support matchers. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/policy-reference#matchers"},"children":["Matchers"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["definition"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The rule kind and its settings. Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["definition.kind"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVAL"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TRAVEL_RULE"]},", and include only the matching object: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limit"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["approval"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["travelRule"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"amount-condition","__idx":5},"children":["Amount condition"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVAL"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TRAVEL_RULE"]}," rules use the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amount"]}," object, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["definition.limit.amount"]},":"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["threshold"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Decimal amount in the asset's units, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"10000\""]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"0.5\""]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"0\""]}," is valid. A negative amount returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAL000.020"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["operator"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GT"]}," (greater than). The schema also lists ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GTE"]},", but Ripple Custody (Wallet) doesn't support it yet and rejects it."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["aggregation"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SINGLE_TX"]}," compares each transaction on its own. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING"]}," compares the total the wallet sent during the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["duration"]}," window. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TOTAL"]}," compares the total the wallet ever sent."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["duration"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The window length in seconds, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"86400s\""]}," for 24 hours. Must be less than one year. Use it only with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING"]},", which requires it. A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING"]}," rule without it, or another aggregation with it, returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAL006.040"]},". A window of one year or more returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAL000.020"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Kind"},"children":["Kind"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Supported aggregation values"},"children":["Supported ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["aggregation"]}," values"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SINGLE_TX"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TOTAL"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVAL"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SINGLE_TX"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TRAVEL_RULE"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SINGLE_TX"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"CHAIN_ID matchers reject natively integrated chains"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CHAIN_ID"]}," matcher authorizes ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/transactions/raw-signing#cross-chain-raw-signing-evm"},"children":["cross-chain raw signing"]}," for an EVM chain that Ripple Custody (Wallet) doesn't natively integrate. If the value is the chain ID of a natively integrated chain, for example Ethereum mainnet ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1"]},", Ripple Custody (Wallet) rejects the request. Ripple Custody (Wallet) doesn't check ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CHAIN_ID"]}," values on non-EVM wallets: it accepts a rule with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CHAIN_ID"]}," of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1"]}," on an XRP Ledger wallet. Add ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CHAIN_ID"]}," matchers only to EVM wallets."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"response","__idx":6},"children":["Response"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The response is the new rule. With a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Policy rules"]}," approval group, it has status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RULE_CREATION_APPROVAL_PENDING"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["active: false"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": \"0199a1c2-5d3e-7a10-9b2f-4c8e1d6f0a21\",\n  \"organizationId\": \"a9a1de05-0b19-4fca-8597-1199353bd569\",\n  \"vaultId\": \"019be892-2834-7435-be18-bc13ac4c73ce\",\n  \"walletId\": \"019bec51-ab18-7284-907a-dd7747277116\",\n  \"createdBy\": \"8617b5b5-dfcf-4ffc-9f46-f7cec35a88bd\",\n  \"trigger\": \"OUTBOUND_INITIATED\",\n  \"assetId\": \"3::XRP\",\n  \"matchers\": [\n    { \"type\": \"ALL_COUNTERPARTIES\", \"value\": \"\", \"values\": [] }\n  ],\n  \"status\": \"RULE_CREATION_APPROVAL_PENDING\",\n  \"active\": false,\n  \"createdAt\": \"2026-09-24T12:00:00Z\",\n  \"updatedAt\": \"2026-09-24T12:00:00Z\",\n  \"definition\": {\n    \"kind\": \"LIMIT\",\n    \"limit\": {\n      \"amount\": {\n        \"threshold\": \"10000\",\n        \"operator\": \"GT\",\n        \"aggregation\": \"ROLLING\",\n        \"duration\": \"86400s\"\n      }\n    }\n  },\n  \"scope\": \"WALLET\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The response echoes each matcher with both ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["values"]}," and the deprecated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["value"]}," string, and includes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["duration"]}," only for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING"]}," rules. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scope"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WALLET"]}," for rules that you create. For each status, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/policy-reference#rule-statuses"},"children":["Rule statuses"]},". For error codes, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/policy-reference#error-codes"},"children":["Policy reference"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"list-a-wallets-policy-rules-via-the-api","__idx":7},"children":["List a wallet's policy rules via the API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["API reference:"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_listpolicyrules"},"children":["List policy rules"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_listpolicyrules2"},"children":["List policy rules with a request body"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Required permission:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["policy:read"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl \"https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/policy-rules?filter.kind=LIMIT&filter.active.eq=true\" \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Paging:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pagination.pageSize"]}," (default 50, maximum 1,000) and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pagination.pageToken"]},". Pass ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.nextPageToken"]}," from the response as the next ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pagination.pageToken"]},". The top-level ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pageSize"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pageToken"]}," also work on their own, but a request that sends both returns HTTP 400, so use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pagination.*"]}," form."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Filters:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.kind"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.trigger"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.status"]}," take one enum value, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.status=RULE_ENABLED"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.vaultId"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.walletId"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.assetId"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.active"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.createdAt"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.updatedAt"]}," take an operator, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.assetId.eq=3::XRP"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.createdAt.after=2026-09-01T00:00:00Z"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eq"]}," is case-sensitive."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Search:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["search"]}," matches the rule ID, vault ID, wallet ID, and asset ID, without regard to case."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sorting:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pagination.orderBy"]}," takes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["kind"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["trigger"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["active"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["created_at"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updated_at"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pagination.order"]}," takes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SORT_ORDER_ASC"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SORT_ORDER_DESC"]},". Field names are in snake case: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createdAt"]}," returns HTTP 400. By default, the newest rule comes first."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To send the filters in a JSON body instead, use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v2/vaults/{vaultId}/wallets/{walletId}/policy-rules:list"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The response holds the rules in a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["policyRules"]}," array, with each rule in the same shape as the create response. This example is abridged:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"filter\": {\n    \"nextPageToken\": \"cGFnZV9zaXplPTEwJnBhZ2VfdG9rZW49MjA=\",\n    \"total\": 3\n  },\n  \"policyRules\": [\n    {\n      \"id\": \"0199a1c2-5d3e-7a10-9b2f-4c8e1d6f0a21\",\n      \"vaultId\": \"019be892-2834-7435-be18-bc13ac4c73ce\",\n      \"walletId\": \"019bec51-ab18-7284-907a-dd7747277116\",\n      \"trigger\": \"OUTBOUND_INITIATED\",\n      \"assetId\": \"3::XRP\",\n      \"status\": \"RULE_ENABLED\",\n      \"active\": true,\n      \"definition\": {\n        \"kind\": \"LIMIT\",\n        \"limit\": {\n          \"amount\": {\n            \"threshold\": \"10000\",\n            \"operator\": \"GT\",\n            \"aggregation\": \"ROLLING\",\n            \"duration\": \"86400s\"\n          }\n        }\n      }\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"get-a-policy-rule-via-the-api","__idx":8},"children":["Get a policy rule via the API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["API reference:"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_getpolicyrule"},"children":["Get a policy rule"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Required permission:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["policy:read"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/policy-rules/$RULE_ID \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The response is the rule, in the same shape as the create response. A rule belongs to one wallet. If the rule doesn't exist on the wallet in the path, the API returns HTTP 404 with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAL006.041"]},", even when the rule exists on another wallet."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"change-a-policy-rule-via-the-api","__idx":9},"children":["Change a policy rule via the API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["There is no update operation, so you can't edit a rule. To change one, create the new rule first, wait for it to become active, and then delete the old one. This order keeps the wallet protected throughout the change."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"delete-a-policy-rule-via-the-api","__idx":10},"children":["Delete a policy rule via the API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["API reference:"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_deletepolicyrule"},"children":["Delete a policy rule"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Required permission:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["policy:delete"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X DELETE https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/policy-rules/$RULE_ID \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A successful request returns an empty JSON object. With a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Policy rules"]}," approval group, the rule moves to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RULE_DELETION_APPROVAL_PENDING"]}," and keeps enforcing until approvers approve the deletion. For every status, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/policy-reference#rule-statuses"},"children":["Rule statuses"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can't delete a rule that is waiting for creation or deletion approval: the API returns HTTP 400 with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAL006.016"]},". A rule ID that doesn't exist on the wallet returns HTTP 404 with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAL006.041"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"use-the-wallet-limits-endpoints-via-the-api","__idx":11},"children":["Use the wallet limits endpoints via the API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["API reference:"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_createwalletlimit"},"children":["Create a wallet limit policy"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_listwalletlimits"},"children":["List wallet limit policies"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_listwalletlimits2"},"children":["List wallet limit policies with a request body"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_getwalletlimit"},"children":["Get a wallet limit policy"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_deletewalletlimit"},"children":["Delete a wallet limit policy"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_listglobalwalletlimits"},"children":["List organization wallet limits"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api/policies/policyservice_listglobalwalletlimits2"},"children":["List organization wallet limits with a request body"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The wallet limits endpoints predate the policy rules API and keep working. They manage ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]}," rules only, and use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["keylimit:*"]}," permissions."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Both APIs read and write the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]}," rules. A wallet limit appears in the policy rules API as a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]}," rule with the same ID, and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT"]}," rule that you create with the policy rules API appears in the wallet limits endpoints. Duplicate checks span both APIs. The two APIs show the same rule in different shapes:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Wallet limits field"},"children":["Wallet limits field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Policy rules field"},"children":["Policy rules field"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limitType"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PER_TX"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING_DURATION"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CONSTANT"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["definition.limit.amount.aggregation"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SINGLE_TX"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TOTAL"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limitQty"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["definition.limit.amount.threshold"]},", with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["operator"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GT"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["duration"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"0s\""]}," when unused"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["definition.limit.amount.duration"]},", present only for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["asset"]}," object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["assetId"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT_*"]}," values"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]},": the matching ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RULE_*"]}," value, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT_CREATION_APPROVAL_PENDING"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RULE_CREATION_APPROVAL_PENDING"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No equivalent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["trigger"]}," (always ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OUTBOUND_INITIATED"]},") and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scope"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The wallet limits endpoints are ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST …/limits:list"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/v2/vaults/{vaultId}/wallets/{walletId}/policy-rules/limits"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/v2/vaults/{vaultId}/wallets/{walletId}/policy-rules/limits/{id}"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v2/policy-rules/limits"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v2/policy-rules/limits:list"]}," across the organization."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To create a wallet limit, send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limitQty"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limitType"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["symbol"]},". Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limitType"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PER_TX"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CONSTANT"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING_DURATION"]},", and set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["duration"]}," for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING_DURATION"]},". The window must be less than one year. Always set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["duration"]}," for a rolling limit: the API doesn't require it, and creates a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING_DURATION"]}," limit without one with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["duration"]}," of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"0s\""]},". For a token, also set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["contract"]}," to the token contract or issuing address. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["blockchain"]}," defaults to the wallet's blockchain."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X PUT https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/policy-rules/limits \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"limitQty\": \"200.00\",\n    \"limitType\": \"ROLLING_DURATION\",\n    \"duration\": \"86400s\",\n    \"symbol\": \"XRP\",\n    \"matchers\": [\n      {\n        \"type\": \"COUNTERPARTY_ID\",\n        \"values\": [\"ce4918bf-a199-4ce2-85a3-d0d296855384\"]\n      }\n    ]\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The response is the new wallet limit, with the asset as an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["asset"]}," object (abridged in this example). Ripple Custody (Wallet) normalizes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limitQty"]},", so ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"200.00\""]}," comes back as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"200\""]},", and echoes each matcher with both ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["value"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["values"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": \"f1dc7bc7-107c-40df-b254-50f2e041e575\",\n  \"createdBy\": \"8617b5b5-dfcf-4ffc-9f46-f7cec35a88bd\",\n  \"organizationId\": \"a9a1de05-0b19-4fca-8597-1199353bd569\",\n  \"walletId\": \"019bec51-ab18-7284-907a-dd7747277116\",\n  \"vaultId\": \"019be892-2834-7435-be18-bc13ac4c73ce\",\n  \"limitQty\": \"200\",\n  \"duration\": \"86400s\",\n  \"limitType\": \"ROLLING_DURATION\",\n  \"createdAt\": \"2026-09-24T12:00:00Z\",\n  \"updatedAt\": \"2026-09-24T12:00:00Z\",\n  \"asset\": {\n    \"id\": \"3::XRP\",\n    \"standard\": \"NATIVE\",\n    \"symbol\": \"XRP\",\n    \"name\": \"XRP\",\n    \"blockchain\": \"XRP_LEDGER\",\n    \"decimals\": 6,\n    \"contract\": \"\"\n  },\n  \"matchers\": [\n    {\n      \"type\": \"COUNTERPARTY_ID\",\n      \"value\": \"ce4918bf-a199-4ce2-85a3-d0d296855384\",\n      \"values\": [\"ce4918bf-a199-4ce2-85a3-d0d296855384\"]\n    }\n  ],\n  \"status\": \"LIMIT_CREATION_APPROVAL_PENDING\",\n  \"active\": false\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To audit limits across every vault and wallet, use the organization-level list. It supports ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pageSize"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pageToken"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["search"]}," (wallet limit ID, vault ID, wallet ID, and asset symbol), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.limitType"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.status"]},", and operator filters such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.walletId.eq"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.assetSymbol.eq"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter.blockchain.eq"]},". The response holds the limits in a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["walletLimits"]}," array."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl \"https://api.sandbox.palisade.co/v2/policy-rules/limits?filter.status=LIMIT_ENABLED&filter.assetSymbol.eq=XRP\" \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For what each status means, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/policy-reference#rule-statuses"},"children":["Rule statuses"]},": a wallet limit in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LIMIT_ENABLED"]}," is a rule in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RULE_ENABLED"]},", and so on. For error codes, including ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAL006.023"]}," from these endpoints, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/policy-reference#error-codes"},"children":["Policy reference"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related-documentation","__idx":12},"children":["Related documentation"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies"},"children":["Policies"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/manage-policies"},"children":["Manage policies via the console"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/governance-and-controls/policies/policy-reference"},"children":["Policy reference"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api"},"children":["Ripple Custody (Wallet) API reference"]}]}]}]},"headings":[{"value":"Manage policy rules via the API","id":"manage-policy-rules-via-the-api","depth":1},{"value":"Policy actions","id":"policy-actions","depth":2},{"value":"Prerequisites","id":"prerequisites","depth":2},{"value":"Create a policy rule via the API","id":"create-a-policy-rule-via-the-api","depth":2},{"value":"Request body","id":"request-body","depth":3},{"value":"Amount condition","id":"amount-condition","depth":3},{"value":"Response","id":"response","depth":3},{"value":"List a wallet's policy rules via the API","id":"list-a-wallets-policy-rules-via-the-api","depth":2},{"value":"Get a policy rule via the API","id":"get-a-policy-rule-via-the-api","depth":2},{"value":"Change a policy rule via the API","id":"change-a-policy-rule-via-the-api","depth":2},{"value":"Delete a policy rule via the API","id":"delete-a-policy-rule-via-the-api","depth":2},{"value":"Use the wallet limits endpoints via the API","id":"use-the-wallet-limits-endpoints-via-the-api","depth":2},{"value":"Related documentation","id":"related-documentation","depth":2}],"frontmatter":{"title":"Manage policy rules via the API","seo":{"title":"Manage policy rules via the API"}},"lastModified":"2026-10-09T11:28:55.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/products/wallet/governance-and-controls/policies/manage-policies-api","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}