Prerequisites
- Service account or authenticated user with
Wallets:Createpermission - DFNS SDK installed and configured
- Understanding of wallets and keys
Creating a wallet
Create a wallet on a specific network using the SDK:Request parameters
The example above creates an org-managed (custodial) wallet: your organization holds the signing authority. Just pass
network (plus optional name/tags) and no delegateTo. Do not send a custodial field in the request body — the request body is strict and custodial is only returned in the response (as a boolean indicating the wallet type), not accepted as input. To create a non-custodial wallet owned by an end user, set delegateTo — see Implement delegated wallets.Response
The response includes:Adding a network to an existing wallet
For keys that support multiple networks (e.g., EVM chains), add additional networks to an existing wallet’s key:Reusing a key requires the
Keys:Reuse permission. Pass the key as signingKey.id; a top-level keyId is rejected by the API.Not all key types support all networks. EVM chains share the same key type (secp256k1), so a single key can be used across Ethereum, Polygon, Arbitrum, etc.
Deriving wallets from a master key (HD)
The recommended pattern is independent keys (the default in Creating a wallet) or shared-key reuse (see Adding a network to an existing wallet). HD derivation is intended for cases where you need BIP-32 path semantics, for example to integrate with systems or tooling that assume hierarchical derivation. Each key share is generated independently by the MPC network, with stronger isolation than HD: compromising one key share reveals nothing about another.
signingKey.deriveFrom with a keyId and an optional path. If path is omitted, DFNS auto-generates one.
Path format
Thepath follows BIP-32 syntax: m/<index>(/<index>)*, with non-negative integer indices (e.g., m/0, m/0/1/2). Hardened paths (with ') are not supported.
Each unique path under the same master key derives a distinct wallet with its own address.
Bulk wallet creation
Create up to 1,000,000 custodial wallets in a single batch. Bulk creation is asynchronous: the request mints one master key for the batch, derives every wallet from it via HD derivation, and returns a job handle immediately. Poll the job to follow progress and, once it completes, list the wallets it produced. Supported on EVM networks (Ethereum, BSC, Base, Arbitrum, Optimism, and their testnets), Tron, and Solana. Batch wallets are custodial — delegation is not supported.Start a batch
Bulk create wallets —POST /wallets/bulk-create
Every wallet in the batch shares a name prefix: the wallet at index N is named ${name}${N}. Requires Wallets:Create and Keys:Create (each batch mints a new master key); Wallets:Tags:Add is required if you pass tags.
Request
Response
Track the job
Get bulk wallet job —GET /wallets/bulk-create/{jobId}
Poll the job for its status, completedCount against totalCount, and the masterKeyId the wallets are derived from.
List all of your organization’s batch jobs with List bulk wallet jobs (
GET /wallets/bulk-create).
List the created wallets
List bulk wallet job wallets —GET /wallets/bulk-create/{jobId}/wallets
Once the job has completed, page through the wallets it created, ordered by wallet ID.
Creating wallets with tags
Use tags to organize wallets and target them with policies:Managing wallet tags
Adding tags
Removing tags
Updating wallet metadata
Update the wallet name:Listing wallets
List all wallets in your organization:Filtering by tags
Filter wallets by tags:Getting wallet details
Get details for a specific wallet:Getting wallet assets
Retrieve token balances:Error handling
Handle common errors:Webhooks
Subscribe to wallet events:wallet.created- New wallet createdwallet.activated- Wallet activatedwallet.tags.modified- Wallet tags changed
Related documentation
Wallets API
Complete API reference
Wallets and keys
Understand the wallet model
Create transfers via API
Send transfers from wallets
Display balances
Query wallet assets