Your setup workflow
Here’s the end-to-end path from zero to live product:Submit assets
Add the DeFi positions you want in your strategy. Each asset goes through Blend’s review pipeline. See Assets.
Create a Basket
Build a strategy template from your approved assets. Set target allocation percentages. See Baskets.
Create an Account Type
Create a product offering (e.g., “Savings”, “Growth”) and link it to your Basket. See Account Types.
Deploy user accounts
Use the SDK to create accounts and deploy Safes for your users. See User Accounts.
Manage flow plans
When positions drift from target allocations, approve or cancel flow plans to rebalance. See Flow Plans.
You can also use a Basket from an external Risk Architect instead of building your own.
The operating model
| Entity | What it represents | Managed by |
|---|---|---|
Asset | A DeFi position (Morpho vault, Euler market, Pendle PT, etc.) | You submit, Blend reviews |
Basket | Your strategy template with target allocations | You |
Account Type | Your product configuration for end users | You |
Account | A single end-user account under one Account Type | Created per user |
Safe | The deterministic Gnosis Safe tied to that account | Blend + on-chain deployment |
No omnibus structures
This section is for informational purposes only and does not constitute legal or financial advice. Consult qualified legal counsel for guidance on regulatory compliance.
What your application owns
Your application is responsible for:- creating and managing the user experience
- collecting the user’s EOA address
- calling Blend with your API key,
neobankId, andaccountTypeId - persisting any product-specific mappings between your internal user IDs and Blend
accountIds - executing deposit quote payloads and withdrawal calldata payloads in your wallet or relay layer
- account creation and account-scoped API reads
- deterministic Safe addressing
- Safe deployment requests and validation
- deposit quote generation
- withdrawal calldata generation
- flow plan generation when positions drift
Recommended request flow
In the current public SDK, the normal lifecycle is:- Instantiate one
BlendClientper neobank plus account type - Call
client.safe.account(userEoa)to get the user’saccountIdand Safe address - Use
account.accountIdfor balances, positions, returns, and deposit quotes - Use
client.withdraw.getCalldata(...)when the user wants to exit funds
Safe lifecycle
The Safe-related endpoints are intentionally split:safe.account(address): returns the Blend account record and deterministic Safe addresssafe.resolve(accountId, chainId): checks whether the Safe is already deployed on a specific chainsafe.request(accountId, chainId): requests Safe deployment on a specific chain
HTTP vs RPC: what requires what
This is the most important architectural distinction in the SDK. Getting this wrong is the most common integration mistake.Group 1 - Pure backend HTTP calls: no wallet, no RPC, no user signature needed
Every method in this group makes an Axios HTTP request to the Blend backend. They work from a Node.js server, a Next.js API route, or a browser. The user does not need to connect their wallet for any of these.| SDK method | What it does |
|---|---|
client.safe.account(eoa) | Gets or creates the account record. Returns accountId, safeAddress, chainsDeployed. |
client.safe.resolve(accountId, chainId) | Checks Safe deployment status on a specific chain. |
client.safe.request(accountId, chainId) | Requests Safe deployment on a new chain. |
client.balance.get(accountId) | Per-chain balances and total USD. |
client.balance.getHistory(accountId, params?) | Historical balance snapshots. |
client.positions.get(accountId) | All deposit, withdraw, and rebalance events. |
client.returns.get(accountId) | Cumulative return metrics. |
client.yield.get() | Current yield breakdown for the account type. No accountId needed. |
client.deposit.getChains() | Supported EVM chains for deposits. Cached server-side. |
client.deposit.getTokens(chainId, eoa?) | Token catalog. With eoa, returns wallet holdings with balances. No RPC needed. |
client.deposit.getQuote(params) | Relay-backed deposit route quote. Returns a quote payload for your bridge execution UI. |
client.withdraw.getCalldata(params) | Pre-built, ABI-encoded withdrawal calldata across chains. Returns calldata only, does not execute it. |
Group 2 - On-chain execution: requires Viem transports and a paymaster
Thetransports and paymasterTransport fields in BlendClientConfig exist solely for on-chain execution. They are not used by any of the read or quote methods above.
| Scenario | What you need |
|---|---|
Submitting calldata from withdraw.getCalldata() via a relay or TransactionHandler | paymasterTransport (e.g. Pimlico) |
Enabling a Safe module via TransactionHandler.submitEnableModuleTransaction() | Viem WalletClient, PublicClient, and paymasterTransport |
Executing action plans via TransactionHandler.submitActionPlan() | Viem WalletClient, PublicClient, and paymasterTransport |
transports is keyed by chain ID and points to your RPC provider (e.g. Alchemy). paymasterTransport points to your ERC-4337 bundler (e.g. Pimlico). Both are required in BlendClientConfig even if you only use read methods, because they are part of the config shape. They are only exercised when executing on-chain transactions.Summary
Use these namespaces for reads, quotes, and calldata generation. No wallet connection needed:client.safeclient.balanceclient.positionsclient.returnsclient.yieldclient.depositclient.withdraw(returns calldata only)
TransactionHandler and SafeMultisendManager when you need to submit UserOperations on-chain. You execute the deposit quote from client.deposit.getQuote() via your Relay integration, not the SDK.
There is no public client-built deposit() action in the current @blend-money/sdk surface. Deposits use quote APIs and withdrawals use server-built calldata payloads.
Integration risks to design around
accountIdis required forclient.deposit.getQuote()because Blend resolves the destination Safe from account contextclient.deposit.getTokens(chainId, eoa?)returns a flatDepositToken[]array. Witheoa, tokens includebalanceandamountUsdfieldsclient.safe.request()returns{ message }, not a status wrapper insidedataclient.withdraw.getCalldata()returns payloads with astepsarray. Each step has akinddiscriminator- For max withdrawals,
bridgesteps may be omitted because the final amount is not known until settlement
Next steps
API Reference
Interactive API reference for all integration endpoints.
Blend SDK
Learn the current public SDK surface.
Cross-chain Deposits
Implement asset discovery and deposit quote flows.
Deposit & Withdraw
See the recommended end-to-end flow split for deposits and withdrawals.
Onboarding
Apply to become an integration partner.