> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getpara.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Request templates

> Ready-to-use Request policies for common standing-access patterns on user-owned wallets

A Request asks the owner of a user-owned wallet for standing access. Once the user consents, matching transactions sign without another prompt. Anything the Request does not cover goes to user review. Each template below includes Developer Portal steps when the forms can express it, and JSON you can publish with the CLI. For app-owned wallets, see [Guardrail templates](/v3/general/permissions-guardrail-templates).

Each policy goes on a Development (beta) API key. Read the [Developer Portal walkthrough](/v3/general/developer-portal-permissions) or the [CLI guide](/v3/cli/permissions) for the full lifecycle. In the CLI commands, replace `KEY_ID` with your key ID and `RECORD_ID` with the `policy.recordId` from the `create` response. Users grant or decline consent through Para; see the [React](/v3/react/guides/permissions) and [React Native](/v3/react-native/guides/permissions) guides to handle it in your app.

<Note>
  Amounts are integer strings in base units: wei for ETH (18 decimals) and 6 decimals for USDC. `10000000000000000` is 0.01 ETH, and `100000000` is 100 USDC.
</Note>

## Small native transfers without a prompt

Lets the app send small amounts of ETH on Base without asking each time. Once the user approves the Request, transfers up to 0.01 ETH sign directly. Larger transfers go to user review.

<Tabs>
  <Tab title="Developer Portal">
    1. Open **Permissions** for your Development key, select the **Requests** tab, and select **Add** (or **New Request** if Requests already exist).
    2. In **User consent request language**, enter `Send up to 0.01 ETH per transfer on Base`. Under **Networks**, select **Base (8453)**, then select **Continue**.
    3. Set the action to **Transfer ETH**. Select **Add Condition**, choose **Transaction amount** and **is at most**, enter `0.01` with the unit set to **ETH**, and keep **per transaction**.
    4. Select **Review**, then **Save Draft**. Select **Activate** on the draft.
  </Tab>

  <Tab title="CLI">
    ```json request-small-native-transfers.json theme={null}
    {
      "id": "base-small-native-transfers",
      "schemaVersion": "permissions.policy.v1",
      "version": "1",
      "selector": {
        "walletType": "EVM",
        "chainId": "8453"
      },
      "rules": [
        {
          "id": "allow-small-native-transfers",
          "effect": "allow",
          "actions": ["transfer_native"],
          "when": {
            "kind": "all",
            "of": [
              { "kind": "compare", "fact": "request.classification", "op": "eq", "value": "native_transfer" },
              { "kind": "compare", "fact": "request.value.baseUnits", "op": "lte", "value": "10000000000000000" }
            ]
          }
        }
      ],
      "metadata": {
        "productMode": "delegation",
        "description": "Send up to 0.01 ETH per transfer on Base"
      }
    }
    ```

    ```bash theme={null}
    para keys permissions validate KEY_ID --file request-small-native-transfers.json --environment beta --json
    para keys permissions create KEY_ID --file request-small-native-transfers.json --environment beta --json
    para keys permissions activate RECORD_ID KEY_ID --environment beta --yes --json
    ```
  </Tab>
</Tabs>

To use another wallet type, select a Solana, Cosmos, Stellar, or Sui network in the Portal and choose **Native transfer**. Amounts use that network's base units, such as lamports on Solana.

## Daily USDC allowance

Gives the app a daily USDC budget on Base. After the user approves the Request, USDC transfers sign directly while the 24-hour total stays at or below 100 USDC. Transfers beyond that total, and transfers of other tokens, go to user review.

<Tabs>
  <Tab title="Developer Portal">
    1. Open **Permissions** for your Development key, select the **Requests** tab, and select **Add** (or **New Request**).
    2. In **User consent request language**, enter `Send up to 100 USDC per day on Base`. Under **Networks**, select **Base (8453)**, then select **Continue**.
    3. Set the action to **Transfer tokens** and enter `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913` in **Contract Address**. **Function Name** is fixed to `transfer`.
    4. Select **Add Condition**, choose **Transaction amount**, and set the rate to **per time window** with `1` **days**. Choose **is at most** and enter `100000000` in token base units.
    5. Select **Review**, then **Save Draft**. Select **Activate** on the draft.
  </Tab>

  <Tab title="CLI">
    ```json request-daily-usdc-allowance.json theme={null}
    {
      "id": "base-usdc-daily-allowance",
      "schemaVersion": "permissions.policy.v1",
      "version": "1",
      "selector": {
        "walletType": "EVM",
        "chainId": "8453"
      },
      "rules": [
        {
          "id": "allow-daily-usdc",
          "effect": "allow",
          "actions": ["transfer_tokens"],
          "when": {
            "kind": "all",
            "of": [
              { "kind": "compare", "fact": "request.classification", "op": "eq", "value": "erc20_transfer" },
              {
                "kind": "compare",
                "fact": "request.contract.address",
                "op": "eq",
                "value": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
              },
              { "kind": "compare", "fact": "request.method", "op": "eq", "value": "transfer" },
              {
                "kind": "aggregate",
                "fact": "wallet.spend.erc20",
                "op": "lte",
                "value": "100000000",
                "window": "24h",
                "asset": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
              }
            ]
          }
        }
      ],
      "metadata": {
        "productMode": "delegation",
        "description": "Send up to 100 USDC per day on Base"
      }
    }
    ```

    ```bash theme={null}
    para keys permissions validate KEY_ID --file request-daily-usdc-allowance.json --environment beta --json
    para keys permissions create KEY_ID --file request-daily-usdc-allowance.json --environment beta --json
    para keys permissions activate RECORD_ID KEY_ID --environment beta --yes --json
    ```
  </Tab>
</Tabs>

<Info>
  The window is a fixed 24-hour budget per network and token. Smart account user operations do not count toward it, except ERC-20 transfers sent through Para [gas sponsorship](/v3/rest/gas-sponsorship).
</Info>

On Solana, Cosmos, or Stellar, choose **Token transfer** and enter the token in **Token Asset** in the format the field shows, such as `solana:token:<mint>`. Sui has no token transfer action.

## Transfers to known recipients

Covers ETH transfers on Base to a fixed list of addresses. After the user approves the Request, those transfers sign without a prompt. Transfers to any other address go to user review.

<Tabs>
  <Tab title="Developer Portal">
    1. Open **Permissions** for your Development key, select the **Requests** tab, and select **Add** (or **New Request**).
    2. In **User consent request language**, enter `Send ETH on Base to approved recipients`. Under **Networks**, select **Base (8453)**, then select **Continue**.
    3. Set the action to **Transfer ETH**. Select **Add Condition**, choose **Recipient address** and **is one of**, and enter the addresses in lowercase, separated by commas.
    4. Select **Review**, then **Save Draft**. Select **Activate** on the draft.
  </Tab>

  <Tab title="CLI">
    ```json request-known-recipients.json theme={null}
    {
      "id": "base-known-recipients",
      "schemaVersion": "permissions.policy.v1",
      "version": "1",
      "selector": {
        "walletType": "EVM",
        "chainId": "8453"
      },
      "rules": [
        {
          "id": "allow-known-recipients",
          "effect": "allow",
          "actions": ["transfer_native"],
          "when": {
            "kind": "all",
            "of": [
              { "kind": "compare", "fact": "request.classification", "op": "eq", "value": "native_transfer" },
              {
                "kind": "compare",
                "fact": "request.to",
                "op": "in",
                "value": ["0x1111111111111111111111111111111111111111", "0x2222222222222222222222222222222222222222"]
              }
            ]
          }
        }
      ],
      "metadata": {
        "productMode": "delegation",
        "description": "Send ETH on Base to approved recipients"
      }
    }
    ```

    ```bash theme={null}
    para keys permissions validate KEY_ID --file request-known-recipients.json --environment beta --json
    para keys permissions create KEY_ID --file request-known-recipients.json --environment beta --json
    para keys permissions activate RECORD_ID KEY_ID --environment beta --yes --json
    ```
  </Tab>
</Tabs>

This template sets no amount limit. To cap each transfer, add a **Transaction amount** condition to the same action; all conditions must hold. On other wallet types, choose **Native transfer** and enter addresses in that network's format.

## Standing access to your app's contracts

Covers one function on your contract, such as minting from your collection. Once the user approves the Request, calls to `mint` on that contract sign directly. Calls to other functions or contracts go to user review.

<Tabs>
  <Tab title="Developer Portal">
    1. Open **Permissions** for your Development key, select the **Requests** tab, and select **Add** (or **New Request**).
    2. In **User consent request language**, enter `Mint items from our contract on Base`. Under **Networks**, select **Base (8453)**, then select **Continue**.
    3. Set the action to **Call a contract**. Enter your contract in **Contract Address** in lowercase, and enter `mint` in **Function Name**.
    4. To cover another function or contract, select **Add Action** and repeat step 3.
    5. Select **Review**, then **Save Draft**. Select **Activate** on the draft.
  </Tab>

  <Tab title="CLI">
    ```json request-app-contract-calls.json theme={null}
    {
      "id": "base-app-contract-calls",
      "schemaVersion": "permissions.policy.v1",
      "version": "1",
      "selector": {
        "walletType": "EVM",
        "chainId": "8453"
      },
      "rules": [
        {
          "id": "allow-app-mint",
          "effect": "allow",
          "actions": ["call_contract"],
          "when": {
            "kind": "all",
            "of": [
              { "kind": "compare", "fact": "request.classification", "op": "eq", "value": "decoded_contract_call" },
              {
                "kind": "compare",
                "fact": "request.contract.address",
                "op": "eq",
                "value": "0x3333333333333333333333333333333333333333"
              },
              { "kind": "compare", "fact": "request.method", "op": "eq", "value": "mint" }
            ]
          }
        }
      ],
      "metadata": {
        "productMode": "delegation",
        "description": "Mint items from our contract on Base"
      }
    }
    ```

    ```bash theme={null}
    para keys permissions validate KEY_ID --file request-app-contract-calls.json --environment beta --json
    para keys permissions create KEY_ID --file request-app-contract-calls.json --environment beta --json
    para keys permissions activate RECORD_ID KEY_ID --environment beta --yes --json
    ```
  </Tab>
</Tabs>

<Note>
  Para matches the function by decoding the call with the contract's verified ABI from the network's block explorer. If Para cannot decode a call, for example because the contract is not verified, the call does not match and goes to user review.
</Note>

You can narrow the call further with **Transaction amount** or **Contract argument** conditions. On Solana, Cosmos, Stellar, and Sui, the Portal offers **Execution target** instead. It pins the program or contract the transaction calls, without function or argument conditions.

## Co-signer approval above a threshold

Sends large ETH transfers on Base to a co-signer instead of the wallet owner. Once the user approves the Request, a transfer above 0.1 ETH signs after one person with the `cosigner` role approves it. Transfers of 0.1 ETH or less are not covered and go to user review.

The Developer Portal forms cannot express approval requirements, so publish this template with the CLI. Para must enable conditional approvals for your app first; until then, validation rejects the policy.

<Tabs>
  <Tab title="CLI">
    ```json request-cosigner-approval.json theme={null}
    {
      "id": "base-cosigner-large-transfers",
      "schemaVersion": "permissions.policy.v1",
      "version": "1",
      "selector": {
        "walletType": "EVM",
        "chainId": "8453"
      },
      "rules": [
        {
          "id": "cosigner-large-transfers",
          "effect": "require_approval",
          "actions": ["transfer_native"],
          "when": {
            "kind": "all",
            "of": [
              { "kind": "compare", "fact": "request.classification", "op": "eq", "value": "native_transfer" },
              { "kind": "compare", "fact": "request.value.baseUnits", "op": "gt", "value": "100000000000000000" }
            ]
          },
          "approvalRequirement": {
            "id": "cosigner-approval",
            "evidence": "authenticated_approval",
            "stages": [
              {
                "id": "cosigner",
                "requiredApprovals": 1,
                "eligibility": [{ "kind": "role", "name": "cosigner" }]
              }
            ]
          }
        }
      ],
      "metadata": {
        "productMode": "delegation",
        "description": "Send more than 0.1 ETH on Base after a co-signer approves"
      }
    }
    ```

    ```bash theme={null}
    para keys permissions validate KEY_ID --file request-cosigner-approval.json --environment beta --json
    para keys permissions create KEY_ID --file request-cosigner-approval.json --environment beta --json
    para keys permissions activate RECORD_ID KEY_ID --environment beta --yes --json
    ```
  </Tab>
</Tabs>

Your backend assigns the `cosigner` role and binds the wallet to the authorization scope that holds that assignment; see [permissions administration](/v3/rest/permissions-administration). The person who starts the transfer cannot approve it, so the co-signer must be a different user. To let smaller transfers sign without a prompt, add the rule from the first template to this policy. See [conditional approvals](/v3/react/guides/conditional-approvals) to build the approver experience.

## User-adjustable daily limit

Lets the user choose how much ETH the app can send on Base each day. Once the user approves the Request, native transfers sign directly while the 24-hour total stays within the user's limit, which starts at 0.05 ETH. Transfers beyond it go to user review.

The Developer Portal forms cannot declare adjustable amounts, so publish this template with the CLI. Para must enable user-adjustable limits for your app first; until then, validation rejects the policy.

<Tabs>
  <Tab title="CLI">
    ```json request-adjustable-daily-limit.json theme={null}
    {
      "id": "base-adjustable-daily-limit",
      "schemaVersion": "permissions.policy.v1",
      "version": "1",
      "selector": {
        "walletType": "EVM",
        "chainId": "8453"
      },
      "rules": [
        {
          "id": "allow-daily-native-transfers",
          "effect": "allow",
          "actions": ["transfer_native"],
          "when": {
            "kind": "all",
            "of": [
              { "kind": "compare", "fact": "request.classification", "op": "eq", "value": "native_transfer" },
              {
                "kind": "aggregate",
                "fact": "wallet.spend.native",
                "op": "lte",
                "value": "50000000000000000",
                "window": "24h",
                "parameter": { "id": "daily-eth-limit", "label": "Daily ETH limit" }
              }
            ]
          }
        }
      ],
      "metadata": {
        "productMode": "delegation",
        "description": "Send ETH on Base up to a daily limit you choose"
      }
    }
    ```

    ```bash theme={null}
    para keys permissions validate KEY_ID --file request-adjustable-daily-limit.json --environment beta --json
    para keys permissions create KEY_ID --file request-adjustable-daily-limit.json --environment beta --json
    para keys permissions activate RECORD_ID KEY_ID --environment beta --yes --json
    ```
  </Tab>
</Tabs>

The `parameter` makes the 24-hour amount adjustable, and `value` is its default. The default is not a ceiling: the user can choose any non-negative integer amount in wei. Para's consent screen shows an input for the limit, and your app can read and update it for the signed-in user. See [adjust personal limits](/v3/react/guides/permissions#adjust-personal-limits) for React. React Native apps open the same hosted consent flow; see [open standalone permissions flows](/v3/react-native/guides/permissions#open-standalone-permissions-flows). The [JSON reference](/v3/references/permissions/policy-json#user-adjustable-amounts) lists the other amounts you can make adjustable.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.