Set Up Wallets

Initialize a custody provider and create wallets for signing transactions.

Wallets are Solana keypairs managed by a custody provider. SDP uses them to sign transactions for token deployment, minting, transfers, and other onchain operations. You must initialize a signing provider before creating tokens or executing transactions.

Supported providers

ProviderDescription
PrivyEmbedded wallet infrastructure platform
FireblocksDigital asset infrastructure company
Coinbase CDPEmbedded wallets for developers
ParaWallet and authentication suite
TurnkeyNon-custodial wallet infrastructure platform
DFNSDigital asset wallet infrastructure
AnchorageRegulated institutional crypto custody

1. Navigate to Wallets

Open the sidebar and click Wallets. If you haven't linked your organization yet, complete the organization setup first.

2. Choose a custody provider

The Wallets page shows all supported providers, each with a New wallet button. Pick the provider that fits your setup.

Wallets page showing custody provider cards

3. Create the wallet

Click New wallet on your chosen provider. In the modal, enter a label for the wallet and click Create wallet.

New wallet modal

4. View your wallet

After provisioning, the wallet card appears on the Wallets page with its address, wallet ID, and balance.

Wallets page after wallet creation

To create additional wallets, click Create Wallet in the top right and repeat the process.

5. Provider capabilities

Each provider supports a different set of operations shown as capability chips:

  • Issuance — can deploy and mint tokens
  • Transfers — can sign payment transactions
  • Compliance — can sign freeze/unfreeze instructions

1. Initialize the signing provider

curl -X POST https://api.solana.com/v1/wallets/initialize \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "privy",
    "walletLabel": "Master wallet"
  }'
const response = await fetch("https://api.solana.com/v1/wallets/initialize", {
  method: "POST",
  headers: {
    "Authorization": "Bearer sk_test_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    provider: "privy",
    walletLabel: "Master wallet",
  }),
});
const { data } = await response.json();
// data: { configId, publicKey, walletId }
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/wallets/initialize"))
    .header("Authorization", "Bearer sk_test_...")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString("""
        {
          "provider": "privy",
          "walletLabel": "Master wallet"
        }"""))
    .build();

2. Create additional wallets

curl -X POST https://api.solana.com/v1/wallets \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "label": "Mint authority wallet",
    "purpose": "mint_authority",
    "setDefault": false
  }'
const response = await fetch("https://api.solana.com/v1/wallets", {
  method: "POST",
  headers: {
    "Authorization": "Bearer sk_test_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    label: "Mint authority wallet",
    purpose: "mint_authority",
    setDefault: false,
  }),
});
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/wallets"))
    .header("Authorization", "Bearer sk_test_...")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString("""
        {
          "label": "Mint authority wallet",
          "purpose": "mint_authority",
          "setDefault": false
        }"""))
    .build();

The purpose field is optional metadata in the API. The current dashboard create-wallet flow does not expose wallet-purpose selection.

3. List wallets

curl "https://api.solana.com/v1/wallets?view=summary" \
  -H "Authorization: Bearer sk_test_..."
const response = await fetch("https://api.solana.com/v1/wallets?view=summary", {
  headers: { "Authorization": "Bearer sk_test_..." },
});
const { data } = await response.json();
// data.wallets includes walletId, publicKey, provider, label, purpose, and status
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/wallets?view=summary"))
    .header("Authorization", "Bearer sk_test_...")
    .GET()
    .build();

Use the returned walletId when setting a default wallet or binding wallet-scoped API keys.

4. Set a default wallet

curl -X POST https://api.solana.com/v1/wallets/default-wallet \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "walletId": "wal_xyz789" }'
await fetch("https://api.solana.com/v1/wallets/default-wallet", {
  method: "POST",
  headers: {
    "Authorization": "Bearer sk_test_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ walletId: "wal_xyz789" }),
});
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.solana.com/v1/wallets/default-wallet"))
    .header("Authorization", "Bearer sk_test_...")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString("""
        { "walletId": "wal_xyz789" }"""))
    .build();
Is this page helpful?