---
title: "Create wallets in batch"
method: POST
path: "/v1/wallets/batch"
tags: ["Wallets"]
---

# Create wallets in batch

`POST /v1/wallets/batch`

Creates multiple wallets in a single request. Each wallet creation is independent; failures for one wallet do not affect others. Maximum batch size is 100 wallets.

## Headers

- `privy-app-id` string, required — ID of your Privy app.

## Request body

- WalletBatchCreateInput — Request body for batch wallet creation.
  - `wallets` WalletBatchItemInput[], required — Array of wallet creation requests. Minimum 1, maximum 100.
    - `additional_signers` AdditionalSignerItemInput[] — Additional signers for the wallet.
      - `override_policy_ids` string[] — An optional list of up to one policy ID to enforce on the wallet.
      - `signer_id` string, cuid2, required — A unique identifier for a key quorum.
    - `chain_type` 'ethereum' | 'solana' | 'cosmos' | 'stellar' | 'sui' | 'aptos' | 'movement' | 'tron' | 'bitcoin-segwit' | 'bitcoin-taproot' | 'pearl' | 'near' | 'ton' | 'starknet' | 'spark', required — The wallet chain types.
    - `display_name` string — A human-readable label for the wallet.
    - `external_id` string — 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.
    - `owner` union — The owner of the resource, specified as a Privy user ID, a P-256 public key, or null to remove the current owner.
      - object — Owner input specifying a Privy user ID.
        - `user_id` string, required
      - object — Owner input specifying a P-256 public key.
        - `public_key` string, required — A P-256 (secp256r1) public key.
    - `owner_id` string, cuid2, nullable — The key quorum ID to set as the owner of the resource. If you provide this, do not specify an owner.
    - `policy_ids` string[] — List of policy IDs for policies that should be enforced on the wallet. Currently, only one policy is supported per wallet.

## Response `200`

Batch creation results. Always returns 200 with a results array containing success/failure status for each wallet.

- WalletBatchCreateResponse — Response for a batch wallet creation request.
  - `results` WalletBatchCreateResult[], required — Array of results for each wallet creation request, in the same order as input.
    - union — A single result from a batch wallet creation operation.
      - object — A successful wallet creation result within a batch operation.
        - `index` number, required — The index of the wallet in the original request array.
        - `success` true, required
        - `wallet` Wallet, required — A wallet managed by Privy's wallet infrastructure.
          - `additional_signers` WalletAdditionalSignerItem[], required — Additional signers for the wallet.
            - `override_policy_ids` string[] — An optional list of up to one policy ID to enforce on the wallet.
            - `signer_id` string, cuid2, required — A unique identifier for a key quorum.
          - `address` string, required — Address of the wallet.
          - `archived_at` number, nullable — Unix timestamp of when the wallet was archived in milliseconds, or null if the wallet is active.
          - `authorization_threshold` number — The number of keys that must sign for an action to be valid.
          - `chain_type` 'ethereum' | 'solana' | 'cosmos' | 'stellar' | 'sui' | 'aptos' | 'movement' | 'tron' | 'bitcoin-segwit' | 'bitcoin-taproot' | 'pearl' | 'near' | 'ton' | 'starknet' | 'spark', required — The wallet chain types.
          - `created_at` number, required — Unix timestamp of when the wallet was created in milliseconds.
          - `custody` WalletCustodian — Information about the custodian managing this wallet.
            - `provider` string, required — The custodian responsible for the wallet.
            - `provider_user_id` string, required — The resource ID of the beneficiary of the custodial wallet.
          - `display_name` string — A human-readable label for the wallet.
          - `exported_at` number, nullable, required — Unix timestamp of when the wallet was exported in milliseconds, if the wallet was exported.
          - `external_id` string — A customer-provided identifier for mapping to external systems. Write-once, set only at creation.
          - `id` string, required — Unique ID of the wallet. This will be the primary identifier when using the wallet in the future.
          - `imported_at` number, nullable, required — Unix timestamp of when the wallet was imported in milliseconds, if the wallet was imported.
          - `owner_id` string, cuid2, nullable, required — The key quorum ID of the owner of the wallet.
          - `policy_ids` string[], required — List of policy IDs for policies that are enforced on the wallet.
          - `public_key` string — The compressed, raw public key for the wallet along the chain cryptographic curve.
      - object — A failed wallet creation result within a batch operation.
        - `code` string, required — A PrivyErrorCode string identifying the error type (e.g., "invalid_data", "resource_conflict").
        - `error` string, required — A human-readable error message with details about what went wrong.
        - `index` number, required — The index of the wallet in the original request array.
        - `success` false, required

---

[API](https://skmtc.net/privy-io/apis/privy-api.md) · [All operations](https://skmtc.net/privy-io/apis/privy-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/privy-io/privy-api/revisions/bb2eb34156cc/schema)
