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 walletvia REST API, make a POST request to:
https://api.privy.io/v1/custodial_wallets

Body

chain_type
'ethereum'
required
The blockchain type for the custodial wallet. An ethereum type wallet will create a custodial wallet on Base.
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
string
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.