Skip to main content
Privy enables you to create custodial wallets that are managed through licensed custody partners. Custodial wallets provide institutional-grade custody controls while maintaining the same programmability and policy enforcement as standard embedded wallets.

Usage

To create a custodial wallet via REST API, make a POST request to:
https://api.privy.io/v1/custodial_wallets

Body

chain_type
'ethereum' | 'solana'
required
The blockchain type for the custodial wallet. An ethereum type wallet creates a custodial wallet on Base, solana on Solana mainnet.
provider
'bridge'
required
The custodian of the wallet.
provider_user_id
string
required
The user ID of the beneficiary of the custodial wallet, provided by the licensing provider after KYC.
owner
{user_id: string} | {public_key: string}
The entity that can authorize transactions from the custodial wallet and configure additional signers.
additional_signers
{signer_id: string, override_policy_ids: string[]}[]
Additional signers for the custodial wallet. Each signer can have a list of policy IDs that override the base policy IDs set on the wallet.
policy_ids
string[]
List of policy IDs to enforce on the wallet.

Example

curl --request POST https://api.privy.io/v1/custodial_wallets \
  -u "<your-privy-app-id>:<your-privy-app-secret>" \
  -H "privy-app-id: <your-privy-app-id>" \
  -H 'Content-Type: application/json' \
  -d '{
    "chain_type": "ethereum",
    "provider": "bridge",
    "provider_user_id": "user_xxxxx",
    "owner": {
      "public_key": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbL2Fl6Um/Ne6hXJl1i7oCU4tqmnR\nFWd4b9xVc6cGYFaqGgvEb/4+GCFsJu+bX+uvQvGvbXQCijIWpmIHwpRpkg==\n-----END PUBLIC KEY-----"
    }
  }'

Response

The response will include the following fields:
id
string
Unique ID of the created wallet. This will be the primary identifier when using the wallet in the future.
address
string
Address of the created wallet.
chain_type
'ethereum' | 'solana'
Chain type of the created wallet.
provider
string
The custodian of the wallet.
owner_id
string
The key quorum ID of the owner of the wallet. If an owner was passed in, this field will be populated.
additional_signers
string[]
The key quorum IDs of the additional signers for the wallet.
policy_ids
string[]
List of policy IDs for policies that are enforced on the wallet.
created_at
number
The creation date of the wallet, in milliseconds since midnight, January 1, 1970 UTC.
{
  "id": "p12aj1whizzmklph0b36xk6n",
  "address": "0x9f284C7Eaf97b0f9B5542d83Af7F785D12E803a",
  "chain_type": "ethereum",
  "provider": "bridge",
  "owner_id": "owner_xxxxx",
  "additional_signers": [],
  "policy_ids": [],
  "created_at": 1733923425155
}

Next steps

Now that you have created a custodial wallet, you can send funds from a custodial wallet.

Send funds

Execute transactions and send funds from custodial wallets

Transaction lifecycle

Learn about the transaction lifecycle for custodial wallets

Authorization controls

Configure policies and additional security measures for custodial wallets