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

# Wallet Pregeneration

> Overview of generating pregenerated wallets for Para

export const Link = ({href, label, newTab = false}) => {
  const [isHovered, setIsHovered] = useState(false);
  return <a href={href} target={newTab ? '_blank' : '_self'} rel={newTab ? 'noopener noreferrer' : undefined} className="not-prose inline-block relative text-black font-semibold cursor-pointer border-b-0 no-underline" onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)}>
      {label}
      <span className={`absolute left-0 bottom-0 w-full rounded-sm bg-gradient-to-r from-orange-600 to-purple-600 transition-all duration-300 ${isHovered ? 'h-0.5' : 'h-px'}`} />
    </a>;
};

export const Card = ({imgUrl, title, description, href, horizontal = false, newTab = false}) => {
  const [isHovered, setIsHovered] = useState(false);
  const handleClick = e => {
    e.preventDefault();
    if (newTab) {
      window.open(href, '_blank', 'noopener,noreferrer');
    } else {
      window.location.href = href;
    }
  };
  return <div className={`not-prose relative my-2 p-[1px] rounded-xl transition-all duration-300 ${isHovered ? 'bg-gradient-to-r from-[#FF4E00] to-[#874AE3]' : 'bg-gray-200'}`} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)}>
      <a href={href} onClick={handleClick} className={`not-prose flex ${horizontal ? 'flex-row' : 'flex-col'} font-normal h-full bg-white overflow-hidden w-full cursor-pointer rounded-[11px] no-underline`}>
        {imgUrl && <div className={`relative overflow-hidden flex-shrink-0 ${horizontal ? 'w-[30%] rounded-l-[11px]' : 'w-full'}`} onClick={e => e.stopPropagation()}>
            <img src={imgUrl} alt={title} className="w-full h-full object-cover pointer-events-none select-none" draggable="false" />
            <div className="absolute inset-0 pointer-events-none" />
          </div>}
        <div className={`flex-grow px-6 py-5 ${horizontal ? 'w-[70%]' : 'w-full'} flex flex-col ${horizontal && imgUrl ? 'justify-center' : 'justify-start'}`}>
          {title && <h2 className="font-semibold text-base text-gray-800 m-0">{title}</h2>}
          {description && <div className={`font-normal text-gray-500 re leading-6 ${horizontal || !imgUrl ? 'mt-0' : 'mt-1'}`}>
              <p className="m-0 text-xs">{description}</p>
            </div>}
        </div>
      </a>
    </div>;
};

Wallet pregeneration means creating a wallet before a Para user owns it. The wallet is keyed by an identifier, such as an email, phone number, OAuth ID, or custom ID.

The pregenerated wallet can later be claimed by the user associated with that identifier, transferring ownership to them if your application permits it. To claim a wallet, the wallet's user share must be loaded into the client and the wallet identifier must match the user's authenticating identifier.

<Info>
  If you create a wallet with an internal custom ID, store your own mapping from that ID to the future claimant. Before
  returning the user share for claim, update the wallet identifier to the identifier the user is authenticating with.
</Info>

## Choose Your Approach

### Recommended: REST API

Use REST API by default for new server-created or pre-created wallet integrations. Your backend creates wallets, Para persists shares server-side, and signing happens over HTTP with your API key.

<Card horizontal title="REST API" imgUrl="/images/v3/general-server.png" href="/v3/rest/overview" description="Create, sign, and manage wallets over HTTP. No SDK required. Para's enclave handles key storage." />

### SDK Integrations

Use SDK pregen when your flow depends on direct user-share control, SDK ecosystem signing before claim, or client/Portal private-key export paths. SDK pregen is still valid for those cases, but it is no longer the default for new server-side wallet creation.

<CardGroup cols={2}>
  <Card horizontal title="Web Pregeneration" imgUrl="/images/v3/framework-nextjs.png" href="/v3/react/guides/pregen" description="Implement wallet pregeneration in web applications using Para's Web SDK." />

  <Card horizontal title="Server Pregeneration" imgUrl="/images/v3/framework-node.png" href="/v3/server/guides/pregen" description="Generate wallets server-side before user interactions using Para's Server SDK." />

  <Card horizontal title="React Native Pregeneration" imgUrl="/images/v3/framework-react-native.png" href="/v3/react-native/guides/pregen" description="Pre-create wallets in React Native mobile applications." />

  <Card horizontal title="Swift Pregeneration" imgUrl="/images/v3/framework-swift.png" href="/v3/swift/guides/pregen" description="Implement wallet pregeneration in iOS applications with Para's Swift SDK." />

  <Card horizontal title="Flutter Pregeneration" imgUrl="/images/v3/framework-flutter.png" href="/v3/flutter/guides/pregen" description="Generate wallets in advance for Flutter cross-platform applications." />
</CardGroup>

## Common use cases

The [REST API](/v3/rest/overview) covers all of these:

* **Mass User Onboarding**: Create wallets for your existing user base or email lists instantly
* **Social Integration**: Generate wallets based on social identifiers like Twitter followers
* **Agent-Owned Wallets**: Give AI agents or bots their own wallets for specific functions
* **Server-Side Operations**: Create app-managed wallets to perform operations on behalf of users
* **Airdrops and Rewards**: Preload funds or NFTs into wallets that users can claim later
* **Staged Onboarding**: Let users experience your application before formally creating their wallet

If you already have SDK pregen wallets and want to move server-side signing to REST, use the [migration guide](/v3/rest/migrate-from-sdk-pregen).
