REST API
DeBank-compatible API paths and JSON responses. Change your client's API root to https://splash.dudidum.com. Any AccessKey value is accepted, including no key.
Replace the DeBank API root
curl --fail-with-body \ 'https://splash.dudidum.com/v1/user/complex_app_list?id=0xdfc24b077bc1425ad1dea75bcb6f8158e10df303' \ -H 'AccessKey: anything'
Keep DeBank's /v1/... paths, query names, methods and response parsing. Compatibility responses are unwrapped arrays or objects and use JSON numbers for amounts, following DeBank's contract. Access keys are ignored, never stored or forwarded. Browser CORS preflight accepts AccessKey.
Hyperliquid is returned as an app through /v1/app_protocol/list and /v1/user/complex_app_list. Spot balances, perpetual account equity, vaults and staking use DeBank's common portfolio detail format. These requests query exactly the given address; they do not resolve agent wallets or add subaccounts. Per-position analytics remain available through Splash's native endpoints below.
/v1/user/total_balance combines HyperCore equity, net lending and native/curated ERC20 wallets. Its chain_list contains these covered EVM subtotals. This is not complete token discovery; unknown ERC20s, receipts, rewards and other protocols remain excluded. HyperCore is not fabricated as an EVM chain.
| Endpoint | Current coverage |
|---|---|
GET /v1/app_protocol/list | Hyperliquid app metadata. |
GET /v1/user/complex_app_list?id=... | Live Hyperliquid app portfolios; prices and valuation may be partial. |
GET /v1/user/total_balance?id=... | HyperCore equity plus wallets plus supplies minus debt. Fails with 503 if a covered source is unavailable. |
| Chain and protocol discovery | Aave V1/V2/V3/V4 and Compound V2/III across the registered EVM mainnets. |
GET /v1/user/all_complex_protocol_list?id=... | Live lending positions with supply, collateral, debt and USD net value. Supports chain_ids. |
GET /v1/user/protocol?id=...&protocol_id=aave3 | One version and chain, all its market pools. V1 uses protocol_id=aave and includes origination fees in debt. |
GET /v1/user/token_list?id=...&chain_id=eth | Native and curated major ERC20 balances. Also supports all_token_list, single user token, token metadata and metadata by IDs. |
| Used chains and chain balances | Covered native/major-token wallets plus net lending. Not an exhaustive wallet index. |
| Unsupported list endpoints | []. Includes NFTs, net curves and approvals. |
| Unsupported object endpoints | Typed empties: {"usd_value":0}, history dictionaries with history_list:[], metadata placeholders, or NFT approvals with empty tokens and contracts. These mean unsupported coverage. |
POST /v1/wallet/pre_exec_tx | Explicit success:false for pre-execution, balance changes and gas. No transaction simulation is performed. |
POST /v1/wallet/explain_tx | Empty ABI parameters and actions; no transaction decoding. |
GET /v1/account/units | Unmetered virtual-unit sentinel 2147483647 with empty stats. These are not DeBank credits; upstream request limits still apply. |
Coverage and errors
All 35 documented Cloud Open API and units routes have explicit handlers. See the coverage matrix or the OpenAPI download for the route list. Unknown paths remain HTTP 404; invalid inputs remain HTTP 400. A failed covered portfolio query returns HTTP 503 instead of an empty holdings list.
Responses include X-Splash-Coverage: hypercore-only, lending-only, curated-wallet, lending-and-curated-wallet, hypercore-lending-curated-wallet, empty-unsupported, unmetered or unavailable. X-Splash-Data-Scope states the limits. Valued results add X-Splash-Valuation: estimated-usd or partial-priced-subtotal. An empty unsupported response is not evidence that the wallet holds nothing.
DeBank Connect OAuth, social/messaging APIs and genuine DeBank account credits are outside this compatibility layer. DeBank user API reference.
Aave and Compound lending
Portfolio explorer supports single addresses and pasted batches, with wallet, supply, debt and net totals. The lending registry has 83 markets on 24 EVM mainnets: Aave V1/V2/V3/V4 and Compound V2/III. Exact coverage and registry sources are available at /v1/splash/coverage.
/v1/lending/addresses/{address}?chain_ids=eth,arbOptional chain_ids and protocol_id filters. Native results include protocols, per-source status, complete and decimal-string summary.supplyUsd, debtUsd, totalValueUsd. Partial native results retain known positions but set totalValueUsd to null. DeBank-compatible protocol endpoints instead return 503 on covered-source failure.
/v1/lending/batchesBody: {"addresses":["0x..."]}, or pasted address text in the addresses field. Maximum 100 unique addresses. Poll or cancel using GET / DELETE /v1/lending/batches/{id}. Job IDs are separate from Hyperliquid batches. Jobs expire one hour after completion and are cleared on process restart.
Protocol IDs group a version on a chain: aave3, arb_aave3, compound3, uni_compound3. All Ethereum V3 Lido/EtherFi/Horizon pools share aave3; AMM/Arc share aave2. This differs from clients expecting separately named submarket IDs. Arc's arc chain ID is a Splash extension. Unknown wrapped-native addresses and unmeasured protocol TVL are not fabricated.
The lending-only API excludes wallet balances. Aptos, testnets, unclaimed rewards and transaction history remain excluded. Sources are official Aave APIs and read-only EVM contract calls. No signed transactions are submitted.
Wallet and combined portfolio
/v1/portfolio/addresses/{address}?chain_ids=eth,arbCombines native and curated ERC20 wallets with net Aave/Compound lending, excluding HyperCore. The wallet registry covers 24 native assets and 176 major ERC20 contracts from official deployments. wallet.discoveryComplete and summary.walletDiscoveryComplete are always false. is_all=true on DeBank token lists does not enable arbitrary token discovery.
Wallet entries retain exact rawAmount and decimal amount strings. priceUsd and valueUsd are null when unpriced. summary.knownWalletUsd is the wallet subtotal; knownValueUsd combines wallet plus supply minus debt. Failed balances or unpriced holdings make totalValueUsd null.
/v1/portfolio/batchesBody: {"addresses":["0x..."]}, or pasted text in addresses. Same 100-address deduplication and poll/cancel contract under /v1/portfolio/batches/{id}. Batch IDs are separate from lending-only and Hyperliquid jobs. Jobs are cleared on restart.
Aave/Compound receipt tokens are excluded from wallet totals. Native ERC20 aliases such as Arc USDC and Celo CELO are counted once; querying the alias directly returns its native balance in the alias decimal units. Wrapped tokens remain separate holdings.
Current wallet prices use Nobi Labs for explicit asset mappings. USDT quotes are converted through Nobi's actual USDT/USD rate; wrapped assets retain their own market prices. Unsupported, stale or unmapped quotes use contract-specific DefiLlama fallback, subject to confidence at least 0.8 and age at most one hour. Nobi response timestamps older than two minutes are rejected. Source details appear in wallet.tokens[].pricing, including provider, market code, timestamp and fallback reason. Lending protocol oracle valuations and HyperCore marks are unchanged.
Missing prices preserve token quantities. DeBank responses use price:0 and the partial valuation header; native responses use null prices. No stablecoin dollar peg is assumed for wallets. DeBank raw_amount remains a JSON number and can lose JavaScript integer precision; use native rawAmount for exact quantities. Nobi credentials stay server-side; incoming AccessKey values are never forwarded.
Splash extension: address lookup
/v1/addresses/{address}Returns current portfolio components, evidence of activity, related subaccounts and per-source coverage. Agent addresses resolve to their associated trading account.
| Parameter | Location | Value |
|---|---|---|
address | Path, required | 0x plus 40 hexadecimal characters. Case insensitive. |
includeSubaccounts | Query, optional | true or false. Default: true. |
cURL
curl --fail-with-body \ 'https://splash.dudidum.com/v1/addresses/0xdfc24b077bc1425ad1dea75bcb6f8158e10df303?includeSubaccounts=true'
JavaScript
const address = '0xdfc24b077bc1425ad1dea75bcb6f8158e10df303';
const response = await fetch(
`https://splash.dudidum.com/v1/addresses/${address}`
);
const data = await response.json();
if (!response.ok) throw new Error(data.error?.message ?? 'Lookup unavailable');
console.log(data.hasHoldingsNow);
console.log(data.accounts);
console.log(data.coverage.failedSources);This native example runs in Node.js or from splash.dudidum.com. Cross-origin browser access is enabled for DeBank-compatible routes; native Splash extensions remain same-origin.
Response fields
| Field | Meaning |
|---|---|
status | active_portfolio, activity_found, no_activity_found or unknown. |
hasHoldingsNow | true if a checked account has a balance or position; false if checks succeeded and found none; null when a negative result cannot be established. |
hasObservedActivity | Evidence of returned trades, orders, ledger or staking events. Also nullable. It is not proof that the owner intentionally traded. |
hasHyperliquidFootprint | Combined holdings or activity result. Also nullable. |
requestedAddress / resolvedAddress | Normalized input and the trading account it resolves to. |
accounts[] | Portfolio components, valuation and inspected history for each checked account. Monetary amounts are decimal strings. |
summary | totalValueUsd, grossPositionValueUsd, unrealizedPnlUsd and positionCount, summed across unique accounts. An incomplete total is null; knownValueUsd and knownGrossPositionValueUsd retain priced subtotals. |
evidence[] | Observed record or holding counts by account and kind; not lifetime totals. |
sources[] | Each query's status, count and any error. An error differs from an empty successful result. |
coverage | Accounts, markets, skipped scope, failed checks and historical limits. |
cache | Cache hit and TTL. Successful lookups are cached for 30 seconds. |
Batch addresses
/v1/batchesSubmit up to 100 unique addresses as a JSON array or a pasted string separated by new lines, commas, semicolons or spaces. Duplicate addresses are removed. Optional includeSubaccounts is a boolean, defaulting to true.
curl --fail-with-body \
'https://splash.dudidum.com/v1/batches' \
-H 'Content-Type: application/json' \
-d '{"addresses":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303","0x0000000000000000000000000000000000000001"],"includeSubaccounts":true}'Returns HTTP 202 with the job ID, progress, incremental results, and a Location header. Jobs wait for the shared upstream budget. Poll the job URL for new results; polling does not consume Hyperliquid requests.
/v1/batches/{id}Returns running, completed or cancelled, plus progress, compact per-address results and a combined summary. The combined summary counts each underlying account once, even if a master, its subaccount, or an agent appear in multiple rows. While incomplete, totals are partial.
/v1/batches/{id}Cancels remaining work and retains completed results. Up to two batches run at once. Results are kept in memory for up to one hour after completion; only 20 jobs are retained, and restarts clear them. Batch addresses are snapshots taken as processed, not at a single instant.
Valuation
All USD values are estimates using USDC=$1. Spot mark prices are converted through quote-token pairs. Other stablecoins use their observed price, rather than a $1 assumption. Perpetual account equity and notional are converted using that market's collateral token.
Standard accounts add spot, perpetual equity, vault equity and staked HYPE. Unified and portfolio-margin accounts use spot balances as the trading-balance source and do not add shared perpetual equity again. Gross position exposure sums absolute open notionals and is separate from equity.
Unpriced assets, failed balance queries, missing account modes, skipped scope and active borrow/lend balances needing reconciliation produce partial totals. Inspect accounts[].portfolio.valuation.missing. Price snapshots are cached for 30 seconds. Derived values use decimal arithmetic and remain strings.
Coverage and limits
HyperCore mainnet only. Includes native and builder perpetual markets, spot, vaults, staking and Core borrow/lend. Checks are capped at 5 accounts and 32 markets; skipped scope is explicit.
Up to 2,000 recent fills and 2,000 historical orders are inspected; up to 25 of each are returned per account. Ledger and staking history are one response each. There is no complete backfill. An empty result does not prove lifetime inactivity.
The shared upstream budget is 1,100 weighted units per minute. At most four distinct lookups run concurrently. Single lookups may return partial results when that budget is exhausted; batches wait. Check sources and coverage even after HTTP 200. HyperEVM DeFi is excluded.
HTTP status codes
| Status | Meaning |
|---|---|
200 | Lookup or job snapshot returned. May include partial failures or incomplete coverage. |
202 | Batch accepted; poll the Location URL. |
400 | Invalid address, query or batch payload. |
404 | Route or job not found; jobs can expire. |
405 | Method not allowed; use the method listed for the route. |
413 | Batch payload exceeds 64 KiB. |
415 | Batch requests require application/json. |
503 | Lookup or batch capacity exceeded, or every upstream source failed. Total upstream failure retains the lookup-shaped response; capacity errors use the error envelope. |
500 | Unexpected server failure. |
{
"error": {
"code": "INVALID_ADDRESS",
"message": "Address must be 0x followed by 40 hexadecimal characters"
}
}Service health
/healthReturns {"status":"ok","service":"hyperliquid-lookup"}. This checks the service process, not Hyperliquid availability.