> ## 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.

# Permissions

> Use Permissions V2 Requests and transaction review in React Native apps

Permissions V2 **Requests** let a user grant your application standing permission to perform specific transactions with a user-owned wallet. Matching transactions can sign automatically after consent. Transactions without standing permission require manual review.

<Note>
  Permissions V2 currently evaluates EVM transaction signing. Para plans to add policy support for Cosmos, Solana,
  Stellar, and Sui wallets. Contact the Para team if you need policies for those wallet types.
</Note>

Configure and activate the Request for a Development API key before integrating the review flow. See [Permissions & Access Control](/v3/concepts/permissions) for the Portal workflow and [Permissions Reference](/v3/concepts/permissions-reference) for available actions and conditions.

## User consent

The first transaction that could use an active Request opens the transaction-review flow if the user has not chosen how the app may use that Request. Para shows the description configured in the Developer Portal and asks whether the user wants to grant standing access or keep manual review.

The user still reviews the current transaction. Standing access begins only after that transaction is approved and applies to future matching transactions. This choice is part of Para's review flow, so your app does not need a separate consent screen.

## Configure transaction review

Web applications can open a review popup directly. React Native does not have a browser popup API, so configure how the SDK should open Para's review URL.

### Global handler

Set a global handler when you initialize Para. This covers direct signing calls and library integrations that do not pass a callback for each operation.

```typescript para.ts theme={null}
import { Environment, ParaMobile } from '@getpara/react-native-wallet';
import { openBrowserAsync } from 'expo-web-browser';

const para = new ParaMobile(Environment.BETA, API_KEY, undefined, {
  disableWorkers: true,
});

para.setTransactionReviewHandler((url) => {
  void openBrowserAsync(url);
});

export { para };
```

You can use `expo-web-browser`, `react-native-inappbrowser`, or a custom WebView to open the URL.

### Per-call callback

Pass `onTransactionReviewUrl` to a signing call when one operation needs different review handling. A per-call callback takes precedence over the global handler.

```typescript theme={null}
import { openBrowserAsync } from 'expo-web-browser';

const result = await para.signTransaction({
  walletId,
  chainId,
  rlpEncodedTxBase64,
  onTransactionReviewUrl: (url) => {
    void openBrowserAsync(url);
  },
});
```

## Runtime flow

1. Your app submits a transaction through Para or a supported signer integration.
2. Para checks the transaction against the active Request and the user's grant.
3. A matching transaction signs automatically when the user has already granted standing access.
4. A transaction without standing permission returns a pending transaction and review URL.
5. Your configured handler opens that URL. If an active Request could cover the transaction and the user has not made a choice, Para asks about standing access before showing the current transaction review.
6. The SDK waits for approval or denial, then returns the signature or throws the corresponding review error.

## Handle denial and timeout

```typescript theme={null}
import {
  TransactionReviewDenied,
  TransactionReviewTimeout,
} from '@getpara/react-native-wallet';

try {
  const result = await para.signTransaction({
    walletId,
    chainId,
    rlpEncodedTxBase64,
  });
  console.log('Signature:', result.signature);
} catch (error) {
  if (error instanceof TransactionReviewDenied) {
    console.warn('Transaction denied by user');
  } else if (error instanceof TransactionReviewTimeout) {
    console.warn('Transaction review timed out');
    // error.transactionReviewUrl and error.pendingTransactionId
    // are available for retry.
  }
}
```

<Warning>
  Test one transaction that matches the Request and one that opens manual review. If a native app does not configure either review handler, the user cannot complete an out-of-policy transaction from the app.
</Warning>

## Development and Production

Activating a Development Request affects only that API key. Para reviews the tested Development policy and independently publishes the approved policy for the Production key. Production policy management is read-only in the Developer Portal.

<CardGroup cols={3}>
  <Card title="Permissions setup" icon="lock" href="/v3/concepts/permissions">
    Configure, activate, test, and promote the Request.
  </Card>

  <Card title="Permissions reference" icon="book" href="/v3/concepts/permissions-reference">
    Review selectors, actions, conditions, and generated JSON.
  </Card>

  <Card title="Sign transactions" icon="signature" href="/v3/react-native/guides/evm">
    Sign transactions with the Para React Native SDK.
  </Card>
</CardGroup>
