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

# Create wallets

> Create one or more wallets associated with a recovery user, so the user can later regain wallet access via the linked accounts. Deprecated; prefer the standard wallet creation flow combined with a separate recovery setup.

<Info>
  Directly managing user authorization keys via the API is an advanced setting. We recommend using
  Privy's SDKs, which internally manage user authorization keys if applicable.
</Info>

This endpoint creates the requested wallets with the associated signer and recovery accounts. After creation, you can make a request to [authenticate](/api-reference/wallets/authenticate) with a valid user JWT to obtain a time-bound user authorization key to use to take actions on the user's wallet.


## OpenAPI

````yaml post /v1/wallets_with_recovery
openapi: 3.1.0
info:
  version: 0.0.1
  title: Privy API
  description: >-
    REST API for Privy's wallet infrastructure — provision and manage wallets
    across EVM, Solana, and Bitcoin, authenticate users, sign transactions, and
    configure programmable policies and authorization intents.
  contact:
    name: Privy
    url: https://www.privy.io/
    email: support@privy.io
servers:
  - url: https://api.privy.io
security: []
tags:
  - name: Accounts
    description: Operations related to asset accounts
  - name: Actions
    description: Operations related to looking up wallet actions across an app
  - name: Aggregations
    description: Operations related to aggregations for tracking and measuring metrics
  - name: Apps
    description: Operations related to app settings and allowlist management
  - name: Cards
    description: Operations related to stablecoin-backed card issuing
  - name: Client Auth
    description: OAuth token exchange and device authorization operations
  - name: Condition Sets
    description: Operations related to condition sets
  - name: Embedded wallets
    description: Operations related to embedded wallet creation and authentication
  - name: Fiat
    description: Operations related to fiat onramping and offramping
  - name: Intents
    description: Operations related to authorization intents for wallet actions
  - name: Key quorums
    description: Operations related to key quorums
  - name: Kraken Embed
    description: >-
      Operations for Kraken Embed integration, including quotes, trades, user
      management, and portfolio operations
  - name: OAuth
    description: >-
      OAuth 2.0 endpoints including Device Authorization Grant (RFC 8628) for
      CLI and limited-input device login flows
  - name: Organizations
    description: Operations related to organizations
  - name: Policies
    description: Operations related to policies
  - name: Shared
    description: Common schemas shared across resources
  - name: Swaps
    description: Operations for swapping tokens within wallets
  - name: Teams
    description: Operations related to dashboard team management
  - name: Transactions
    description: Operations related to transactions
  - name: User signers
    description: Operations related to user signers
  - name: Users
    description: Operations related to users
  - name: Wallet Actions
    description: Operations related to wallet actions
  - name: Wallet Automations
    description: Operations related to wallet automations
  - name: Wallets
    description: Operations related to wallets
  - name: Webhooks
    description: >-
      Webhook events that Privy sends to your configured endpoint when specific
      actions occur in your app
  - name: Yield
    description: >-
      Operations for depositing and withdrawing funds from ERC-4626 yield vaults
      (Morpho, Aave)
paths:
  /v1/wallets_with_recovery:
    post:
      tags:
        - Embedded wallets
      summary: Create wallets with recovery
      description: >-
        Create one or more wallets associated with a recovery user, so the user
        can later regain wallet access via the linked accounts. Deprecated;
        prefer the standard wallet creation flow combined with a separate
        recovery setup.
      operationId: createWalletsWithRecovery
      parameters:
        - schema:
            type: string
            description: ID of your Privy app.
          required: true
          name: privy-app-id
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                wallets:
                  type: array
                  items:
                    type: object
                    properties:
                      chain_type:
                        $ref: '#/components/schemas/WalletChainType'
                      display_name:
                        type: string
                        maxLength: 100
                        description: A human-readable label for the wallet.
                      external_id:
                        type: string
                        maxLength: 64
                        pattern: ^[a-zA-Z0-9_-]+$
                        description: >-
                          A customer-provided identifier for mapping to external
                          systems. URL-safe characters only ([a-zA-Z0-9_-]), max
                          64 chars. Write-once: cannot be changed after
                          creation.
                      policy_ids:
                        allOf:
                          - $ref: '#/components/schemas/PolicyInput'
                          - description: >-
                              List of policy IDs for policies that should be
                              enforced on the wallet. Currently, only one policy
                              is supported per wallet.
                    required:
                      - chain_type
                    additionalProperties: false
                primary_signer:
                  type: object
                  properties:
                    subject_id:
                      type: string
                      description: The JWT subject ID of the user.
                  required:
                    - subject_id
                  additionalProperties: false
                recovery_user:
                  type: object
                  properties:
                    linked_accounts:
                      type: array
                      items:
                        oneOf:
                          - $ref: '#/components/schemas/LinkedAccountEmailInput'
                          - $ref: '#/components/schemas/LinkedAccountCustomJWTInput'
                        discriminator:
                          propertyName: type
                          mapping:
                            email:
                              $ref: '#/components/schemas/LinkedAccountEmailInput'
                            custom_auth:
                              $ref: '#/components/schemas/LinkedAccountCustomJWTInput'
                      minItems: 1
                      maxItems: 2
                  required:
                    - linked_accounts
                  additionalProperties: false
              required:
                - wallets
                - primary_signer
                - recovery_user
              additionalProperties: false
              example:
                wallets:
                  - chain_type: ethereum
                    policy_ids: []
                  - chain_type: solana
                    policy_ids: []
                primary_signer:
                  subject_id: cm7oxq1el000e11o8iwp7d0d0
                recovery_user:
                  linked_accounts:
                    - type: email
                      address: john@doe.com
      responses:
        '200':
          description: Object with user and wallet data.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WalletCreateWalletsWithRecoveryResponse'
              example:
                wallets:
                  - id: ubul5xhljqorce73sf82u0p3
                    address: '0x3DE69Fd93873d40459f27Ce5B74B42536f8d6149'
                    chain_type: ethereum
                    policy_ids: []
                    additional_signers: []
                    created_at: 1744300912643
                    owner_id: lzjb3xnjk2ntod3w1hgwa358
                    exported_at: null
                    imported_at: null
                    archived_at: null
                  - id: sb4y18l68xze8gfszafmyv3q
                    address: 9wtGmqMamnKfz49XBwnJASbjcVnnKnT78qKopCL54TAk
                    chain_type: solana
                    policy_ids: []
                    additional_signers: []
                    created_at: 1744300912644
                    owner_id: lzjb3xnjk2ntod3w1hgwa358
                    exported_at: null
                    imported_at: null
                    archived_at: null
                recovery_user_id: so6bsadjfi3ihhkyt9hlqv6x
      deprecated: true
      security:
        - appSecretAuth: []
components:
  schemas:
    WalletChainType:
      type: string
      enum:
        - ethereum
        - solana
        - cosmos
        - stellar
        - sui
        - aptos
        - movement
        - tron
        - bitcoin-segwit
        - bitcoin-taproot
        - pearl
        - near
        - ton
        - starknet
        - xrpl
        - spark
      description: The wallet chain types.
      title: WalletChainType
      x-stainless-model: wallets.wallet_chain_type
    PolicyInput:
      type: array
      items:
        type: string
        minLength: 24
        maxLength: 24
        format: cuid2
      maxItems: 1
      description: An optional list of up to one policy ID to enforce on the wallet.
      title: PolicyInput
      x-stainless-model: wallets.policy_input
    LinkedAccountEmailInput:
      type: object
      properties:
        type:
          type: string
          enum:
            - email
        address:
          type: string
          format: email
      required:
        - type
        - address
      description: The payload for importing an email account.
      title: LinkedAccountEmailInput
      x-stainless-model: users.linked_account_email_input
    LinkedAccountCustomJWTInput:
      type: object
      properties:
        type:
          type: string
          enum:
            - custom_auth
        custom_user_id:
          type: string
          minLength: 1
          maxLength: 256
      required:
        - type
        - custom_user_id
      additionalProperties: false
      description: The payload for importing a Custom JWT account.
      title: LinkedAccountCustomJWTInput
      x-stainless-model: users.linked_account_custom_jwt_input
    WalletCreateWalletsWithRecoveryResponse:
      type: object
      properties:
        wallets:
          type: array
          items:
            $ref: '#/components/schemas/Wallet'
          description: The wallets that were created.
        recovery_user_id:
          type: string
          description: The ID of the created user.
      required:
        - wallets
        - recovery_user_id
      description: The response from creating wallets with an associated recovery user.
      title: WalletCreateWalletsWithRecoveryResponse
      x-stainless-model: wallets.wallet_create_wallets_with_recovery_response
    Wallet:
      type: object
      properties:
        id:
          type: string
          description: >-
            Unique ID of the wallet. This will be the primary identifier when
            using the wallet in the future.
        address:
          type: string
          description: Address of the wallet.
        display_name:
          type: string
          description: A human-readable label for the wallet.
        external_id:
          type: string
          maxLength: 64
          pattern: ^[a-zA-Z0-9_-]+$
          description: >-
            A customer-provided identifier for mapping to external systems.
            URL-safe characters only ([a-zA-Z0-9_-]), max 64 chars. Write-once:
            cannot be changed once set.
        public_key:
          type: string
          description: >-
            The compressed, raw public key for the wallet along the chain
            cryptographic curve.
        created_at:
          type: number
          description: Unix timestamp of when the wallet was created in milliseconds.
        chain_type:
          $ref: '#/components/schemas/WalletChainType'
        policy_ids:
          type: array
          items:
            type: string
          description: List of policy IDs for policies that are enforced on the wallet.
        owner_id:
          type:
            - string
            - 'null'
          format: cuid2
          description: The key quorum ID of the owner of the wallet.
        entity:
          default: null
          description: The entity the wallet is attributed to.
          anyOf:
            - $ref: '#/components/schemas/WalletEntity'
            - type: 'null'
        additional_signers:
          $ref: '#/components/schemas/WalletAdditionalSigner'
        exported_at:
          type:
            - number
            - 'null'
          description: >-
            Unix timestamp of when the wallet was exported in milliseconds, if
            the wallet was exported.
        imported_at:
          type:
            - number
            - 'null'
          description: >-
            Unix timestamp of when the wallet was imported in milliseconds, if
            the wallet was imported.
        authorization_threshold:
          type: number
          description: The number of keys that must sign for an action to be valid.
        automations:
          type: array
          items:
            $ref: '#/components/schemas/AttachedWalletAutomation'
          description: Automations attached to the wallet, including disabled ones.
        archived_at:
          type:
            - number
            - 'null'
          default: null
          description: >-
            Unix timestamp of when the wallet was archived in milliseconds, or
            null if the wallet is active.
        chain:
          allOf:
            - $ref: '#/components/schemas/CustodialWalletChain'
            - description: The chain of this wallet, only present for custodial wallets.
        custody:
          $ref: '#/components/schemas/WalletCustodian'
      required:
        - id
        - address
        - created_at
        - chain_type
        - policy_ids
        - owner_id
        - additional_signers
        - exported_at
        - imported_at
      description: A wallet managed by Privy's wallet infrastructure.
      title: Wallet
      example:
        id: id2tptkqrxd39qo9j423etij
        address: '0xF1DBff66C993EE895C8cb176c30b07A559d76496'
        display_name: Treasury
        external_id: my-order-123
        chain_type: ethereum
        policy_ids: []
        additional_signers: []
        owner_id: rkiz0ivz254drv1xw982v3jq
        entity:
          id: jorpjo4rfxj62nx1itt8y1zt
          type: user
        created_at: 1741834854578
        exported_at: null
        imported_at: null
        archived_at: null
      x-stainless-model: wallets.wallet
    WalletEntity:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/EntityId'
        type:
          $ref: '#/components/schemas/WalletEntityType'
      required:
        - id
        - type
      additionalProperties: false
      description: The entity a wallet is attributed to.
      title: WalletEntity
      example:
        id: jorpjo4rfxj62nx1itt8y1zt
        type: user
      x-stainless-model: wallets.wallet_entity
    WalletAdditionalSigner:
      type: array
      items:
        $ref: '#/components/schemas/WalletAdditionalSignerItem'
      description: Additional signers for the wallet.
      title: WalletAdditionalSigner
      x-stainless-model: wallets.wallet_additional_signer
    AttachedWalletAutomation:
      type: object
      properties:
        id:
          type: string
          description: ID of the automation.
        enabled:
          type: boolean
          description: >-
            Whether this attachment is currently active — true only if both the
            attachment and the underlying automation are enabled.
      required:
        - id
        - enabled
      additionalProperties: false
      description: A summary of an automation attached to a wallet.
      title: AttachedWalletAutomation
      example:
        id: id2tptkqrxd39qo9j423etij
        enabled: true
      x-stainless-model: wallets.attached_wallet_automation
    CustodialWalletChain:
      type: string
      enum:
        - base
        - solana
        - tempo
      description: The chain of the custodial wallet.
      title: CustodialWalletChain
      example: tempo
      x-stainless-model: wallets.custodial_wallet_chain
    WalletCustodian:
      type: object
      properties:
        provider:
          type: string
          description: The custodian responsible for the wallet.
        provider_user_id:
          type: string
          description: The resource ID of the beneficiary of the custodial wallet.
      required:
        - provider
        - provider_user_id
      description: Information about the custodian managing this wallet.
      title: WalletCustodian
      x-stainless-model: wallets.wallet_custodian
    EntityId:
      type: string
      minLength: 1
      description: A Privy entity ID.
      title: EntityId
      example: jorpjo4rfxj62nx1itt8y1zt
      x-stainless-model: wallets.entity_id
    WalletEntityType:
      type: string
      enum:
        - user
        - organization
      description: The type of entity a wallet is attributed to.
      title: WalletEntityType
      example: user
      x-stainless-model: wallets.wallet_entity_type
    WalletAdditionalSignerItem:
      type: object
      properties:
        signer_id:
          $ref: '#/components/schemas/KeyQuorumId'
        override_policy_ids:
          $ref: '#/components/schemas/PolicyInput'
      required:
        - signer_id
      additionalProperties: false
      description: >-
        A single additional signer on a wallet, with an optional policy
        override.
      title: WalletAdditionalSignerItem
      x-stainless-model: wallets.wallet_additional_signer_item
    KeyQuorumId:
      type: string
      format: cuid2
      description: A unique identifier for a key quorum.
      title: KeyQuorumId
      x-stainless-model: shared.key_quorum_id
  securitySchemes:
    appSecretAuth:
      type: http
      scheme: basic
      description: >-
        Basic Auth header with your app ID as the username and your app secret
        as the password.

````