Skip to content

This page provides a complete reference for policy configuration options, limit types, matchers, statuses, and error codes. For API operations (create, delete, list), see Manage policies.

Quick reference

Limit types

Limit typeAPI valueDuration requiredDescription
Per transactionPER_TXNoMaximum per single transaction
Rolling durationROLLING_DURATIONYesMaximum over a sliding time window
Max total valueCONSTANTNoLifetime cap on total withdrawals

Matcher types

MatcherAPI valueFilters by
Transaction typeTRANSACTION_TYPEType of blockchain transaction
UserUSERUser who initiated the transaction
API credentialAPI_CREDENTIALAPI credential that submitted the request
AddressADDRESS_IDDestination address (from address book)
CounterpartyCOUNTERPARTY_IDCounterparty receiving funds
WalletWALLET_IDRelated wallet reference
Sign forSIGN_FORAddress being signed for (multi-sig)

Duration values

DurationValueNotes
1 hour"3600s"60 × 60 seconds
4 hours"14400s"60 × 60 × 4 seconds
24 hours"86400s"60 × 60 × 24 seconds
7 days"604800s"60 × 60 × 24 × 7 seconds
30 days"2592000s"60 × 60 × 24 × 30 seconds

Limit types

PER_TX

Limits the maximum amount for any single transaction.

FieldValue
limitType"PER_TX"
durationNot used (returns "0s")

Example: Limit single ETH transactions to 10 ETH maximum.

{
  "limitType": "PER_TX",
  "symbol": "ETH",
  "limitQty": "10"
}

ROLLING_DURATION

Limits the cumulative amount over a sliding time window.

FieldValue
limitType"ROLLING_DURATION"
durationRequired. Window size in seconds

Common duration values:

DurationValue
1 hour"3600s"
24 hours"86400s"
7 days"604800s"
30 days"2592000s"

Example: Limit ETH withdrawals to 100 ETH per 24 hours.

{
  "limitType": "ROLLING_DURATION",
  "symbol": "ETH",
  "limitQty": "100",
  "duration": "86400s"
}

CONSTANT

Sets a lifetime cap on total withdrawals. Once reached, no further withdrawals are permitted.

FieldValue
limitType"CONSTANT"
durationNot used (returns "0s")

Example: Limit total ETH withdrawals to 1,000 ETH ever.

{
  "limitType": "CONSTANT",
  "symbol": "ETH",
  "limitQty": "1000"
}

Matchers

Matchers filter which transactions a policy applies to. Add matchers to create policies that target specific scenarios.

Matcher types

TypeDescriptionValue format
TRANSACTION_TYPEFilter by transaction typeTransaction type string
USERFilter by initiating userUser UUID
API_CREDENTIALFilter by API credential usedCredential UUID
ADDRESS_IDFilter by destination addressAddress book entry UUID
COUNTERPARTY_IDFilter by counterpartyCounterparty UUID
WALLET_IDFilter by related walletWallet UUID
SIGN_FORFilter by address being signed forBlockchain address

TRANSACTION_TYPE

Applies the policy only to transactions of a specific type.

Values by blockchain:

BlockchainTransaction types
Ethereum/EVMWITHDRAWAL, TRANSFER
XRP LedgerPayment, OfferCreate, OfferCancel, TrustSet, EscrowCreate, EscrowFinish, AMMCreate, AMMDeposit, AMMWithdraw
BitcoinWITHDRAWAL
XRP Ledger transaction types

XRP Ledger transaction type values are case-sensitive and use PascalCase (for example, OfferCreate, not OFFER_CREATE). EVM and Bitcoin types use uppercase (for example, WITHDRAWAL).

AMM transactions require multi-asset policies

AMMCreate and AMMDeposit transactions withdraw multiple assets from the wallet. The policy engine requires policies for each affected asset. For issued assets (such as RLUSD or USD), the policy must include the issuer. See the AMM APIs changelog for details.

{
  "limitType": "PER_TX",
  "symbol": "XRP",
  "limitQty": "1000",
  "matchers": [
    {
      "type": "TRANSACTION_TYPE",
      "value": "Payment"
    }
  ]
}

USER

Applies the policy only when a specific user initiates the transaction.

{
  "matchers": [
    {
      "type": "USER",
      "value": "8617b5b5-dfcf-4ffc-9f46-f7cec35a88bd"
    }
  ]
}

API_CREDENTIAL

Applies the policy only when a specific API credential submits the transaction.

{
  "matchers": [
    {
      "type": "API_CREDENTIAL",
      "value": "cred-uuid-here"
    }
  ]
}

ADDRESS_ID

Applies the policy only when sending to a specific address from your address book.

{
  "matchers": [
    {
      "type": "ADDRESS_ID",
      "value": "019d1b00-c1f5-77a0-bda7-0a3d09c668b9"
    }
  ]
}

COUNTERPARTY_ID

Applies the policy only when sending to a specific counterparty.

{
  "matchers": [
    {
      "type": "COUNTERPARTY_ID",
      "value": "019d1b00-c1f5-77a0-bda7-0a3d09c668b9"
    }
  ]
}

SIGN_FOR

Applies the policy only when signing for a specific address. Use this matcher for multi-signature scenarios where your wallet signs on behalf of another address.

{
  "matchers": [
    {
      "type": "SIGN_FOR",
      "value": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"
    }
  ]
}
Orphaned matcher references

If you delete a counterparty, address, or user that is referenced by a policy's matcher, the policy continues to exist with the now-invalid reference. No transaction will match the deleted entity, so the policy becomes effectively unmatchable. If it is the only policy for that asset, this silently blocks all matching transactions. Always check for policies referencing an entity before deleting it.

Combining matchers

You can add multiple matchers to a single policy. The transaction must match all matchers for the policy to apply.

Example: Limit a specific user to 50 ETH per transaction when sending to a specific counterparty.

{
  "limitType": "PER_TX",
  "symbol": "ETH",
  "limitQty": "50",
  "matchers": [
    {
      "type": "USER",
      "value": "user-uuid-here"
    },
    {
      "type": "COUNTERPARTY_ID",
      "value": "counterparty-uuid-here"
    }
  ]
}

ERC-20 tokens

For ERC-20 tokens, include the contract field with the token's contract address.

{
  "limitType": "PER_TX",
  "symbol": "USDC",
  "limitQty": "10000",
  "contract": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
}
Contract address required

If you omit the contract field for an ERC-20 token, the API may accept the request but the policy will not match any transactions. Always include the contract address for ERC-20 policies.

Policy statuses

StatusActiveCan deleteDescription
LIMIT_CREATION_APPROVAL_PENDINGNoNoWaiting for creation approval
LIMIT_ENABLEDYesYesActive and enforcing
LIMIT_REJECTEDNoNoCreation rejected; terminal state
LIMIT_DELETION_APPROVAL_PENDINGYesNoWaiting for deletion approval; still enforcing
LIMIT_DELETEDNoNoDeleted; terminal state

Error codes

CodeReasonMessageWhen it occurs
PAL006.023Conflict"limit policy already exists"Creating a policy with the same wallet, limit type, symbol, and matchers as an existing policy (including rejected policies)
PAL006.016Forbidden"action not allowed"Deleting a policy that is still pending approval
PAL000.002Unauthorized"unauthorized request"Missing required API scope or accessing a vault you don't have permission for