# Migrate your signer from Alchemy to Privy

> Overview of migrating the signer for your app and users' embedded wallets from Alchemy's Account Kit to Privy, while keeping Alchemy's transaction infrastructure.

> For the complete documentation index, see [llms.txt](/docs/llms.txt).

This page is the landing guide for moving the **signer** (auth + key custody) for your app from Alchemy's Account Kit to Privy, while continuing to use Alchemy's transaction infrastructure and gas sponsorship. Start here to confirm which sub-guide applies to your app, then drop into it for the step-by-step walkthrough.

<Info>
Pick the detailed guide that matches your app:
* **[React migration](/docs/wallets/wallet-integrations/privy/react-migration)** — the default path. React apps using standard auth methods (email, Google, passkeys, etc.).
* **[JWT auth migration](/docs/wallets/wallet-integrations/privy/jwt-auth-migration)** — special case for apps authenticating users with JWT (JSON Web Token).
</Info>

<Note>
If your migration path does not make use of React or JWT authentication, please [reach out to the team](#get-help) for assistance in the service migration!
</Note>

## What to expect

You swap the signer layer and keep everything else. Users keep their wallet addresses, assets, and history — the only visible change is the login screen switching from Alchemy to Privy. The drop-in migration SDK re-authenticates each user on first login and transfers their keys from Alchemy's TEE to Privy's TEE, invisibly.

At a high level, the React migration is two steps:

<Steps>
  <Step title="Swap the auth SDK and reconnect sending">
    Replace `@account-kit/react` with `@privy-io/react-auth`, then wire Privy wallets back to Alchemy's transaction infrastructure with `@alchemy/wallet-apis` (same Gas Manager policy, same chains).
  </Step>
  <Step title="Migrate existing users' keys">
    Drop in `@privy-io/alchemy-migration` and wrap your app with `MigrationProvider`. The SDK detects users with Alchemy wallets on login and transfers their keys to Privy via end-to-end encryption.
  </Step>
</Steps>

For the full, runnable walkthrough — including user export/import and cleanup — follow the [React migration guide](/docs/wallets/wallet-integrations/privy/react-migration). If you authenticate users with JWT, follow the [JWT auth migration guide](/docs/wallets/wallet-integrations/privy/jwt-auth-migration) instead.

## Prerequisites

Before starting, confirm your setup and have the following ready:

* **Confirm your migration path.** Review the [Edge cases](#edge-cases) below to self-identify which guide applies:
  * Confirm whether you want to use **EIP-7702 or ERC-4337** after migration — the default changed between SDK versions. See [EIP-7702 vs. ERC-4337](#eip-7702-vs-erc-4337) below.
  * Confirm your **account type**. Modular Account v2 (MAv2) is the default; Light Account and MAv1 are also supported on Wallet APIs — reach out to [support@alchemy.com](mailto:support@alchemy.com) to enable these legacy account types.
  * Pick the **migration guide** that matches — React by default, JWT if you authenticate with JSON Web Tokens.
* **Alchemy API key** — From the [Alchemy Dashboard](https://dashboard.alchemy.com/). Use the same app that has your Smart Wallets configuration and Gas Manager policy linked.
* **Gas Manager policy ID** — From the [Gas Manager dashboard](https://dashboard.alchemy.com/services/gas-manager/configuration). Must be linked to the app above.
* **Privy account and app** — Create an app in the [Privy Dashboard](https://dashboard.privy.io/). Enable the same auth methods your Alchemy users originally signed up with.

## Edge cases

The sub-guides assume the Wallet APIs defaults: EIP-7702 delegation to Modular Account v2 (MAv2). The three cases below change the migration path and are worth reviewing before you start.

### EIP-7702 vs. ERC-4337

The `@account-kit/react` package (SDK v4) defaulted to **ERC-4337** with a smart contract account (SMA). The new `@alchemy/wallet-apis` package defaults to **EIP-7702 delegation to Modular Account v2** instead.

* **EIP-7702 delegation (Wallet APIs default).** The signer (EOA) address *is* the account address. Assets live at the signer address, and the EOA is delegated to MAv2.
* **ERC-4337 (SDK v4 default).** The signer is the *owner* of a separate smart contract account. Assets live at the smart contract account address, not at the signer address.

If you want to keep using pure ERC-4337 accounts after migration, you need to request the existing smart contract account type explicitly instead of using the Wallet APIs default. See [How to use non-7702 mode](/docs/wallets/transactions/using-eip-7702#how-to-use-non-7702-mode) for the full flow.

### Account type — non-MAv2 users

Wallet APIs default to Modular Account v2, but Light Account and MAv1 are also supported. If your current app uses one of those account types, reach out to [support@alchemy.com](mailto:support@alchemy.com) to enable it.

### Session keys

If your users have legacy session keys installed onchain through the v4 `@account-kit/wallet-client` integration, they're still supported on Wallet APIs. See the [Use existing session keys](/docs/wallets/reference/wallet-apis-session-keys/legacy-session-keys) reference for the guide.

## Get help

For direct help with your Privy signer migration, reach out through either of the following:

* **Email:** [alchemy@privy.io](mailto:alchemy@privy.io)
* **Slack:** [privy.io/slack](https://privy.io/slack)