Wallets API
Wallet balance history over time
How a Solana wallet's total USD holdings value has moved over time — a series of past snapshots, not just today's total.
/api/external/wallet-analysis/wallet-balance-history/{chain}/{address}What it returns
The wallet-keyed history behind wallet-portfolio's current snapshot: a series of past total-holdings valuations rather than one right-now figure. summary is null only when there is no history at all for this address; whenever history has at least one point, summary.currentValueUsd is always populated even if the 24h/30d change figures cannot be.
Chains
- Solana SOL
Request
Send your key in the x-dex-data-key header. Replace each <placeholder> with a real value.
curl -H "x-dex-data-key: $DEXDATA_API_KEY" \ "https://api.dexdata.io/api/external/wallet-analysis/wallet-balance-history/SOL/<address>"
| Parameter | Description |
|---|---|
chainpath · string · required | Solana only; every other chain returns 400, because the wired source computes a USD holdings history for Solana addresses only. |
addresspath · string · required | The wallet address. |
Response fields
A JSON response. Every field is always present; null means the value could not be established, never zero.
| Field | Type | Description |
|---|---|---|
history | object[] | Oldest first. Always an array — empty both when the source has no data for this address and when the address is malformed; the source itself does not distinguish those from each other, so neither does this field. |
history[].date | string | null | YYYY-MM-DD, the source's own snapshot bucket. |
history[].timestampMs | number | null | Unix milliseconds. Derived from date (midnight UTC) whenever the source's own raw timestamp falls outside a plausible range for a Solana snapshot — measured live, that raw value is occasionally corrupted by an exact 1000x factor; falling back keeps the correct day even on the rare corrupted point, at the cost of time-of-day precision only on that one point. Measured at roughly 0.11% of points. There is no flag in this response distinguishing a substituted, date-derived value from one the source supplied directly — the two look identical on the wire. |
history[].valueUsd | number | null | This wallet's TOTAL USD holdings value at this snapshot — every token it held, not one position and not a cost basis. |
history[].changePercent | number | null | Percent change versus the PREVIOUS point in this series (not cumulative from the start of the series), already a percent. null on the very first point — there is nothing before it to compare against, which is different from a later point genuinely reading 0 because the value did not move. |
summary | object | null | null only when history is empty (no data at all for this address). Otherwise always carries a real currentValueUsd, independent of whether the 24h/30d change figures could be established. |
summary.currentValueUsd | number | null | The newest point in history that carries a real valueUsd — usually, but not always, the same as history's last entry. When the last entry's value could not be read, this walks back to the newest one that has a value, so it can name an OLDER instant than history's last entry. |
summary.change24hUsd | number | null | |
summary.change24hPercent | number | null | Can genuinely be null — observed live when the value 24 hours ago was effectively zero, making a percent change undefined rather than infinite. |
summary.change30dUsd | number | null | |
summary.change30dPercent | number | null | Same null case as change24hPercent, over the 30-day window. |
Start building with DexData today
Sign in, create a key and make your first call in a minute. Free credits every month, and you only pay for calls that succeed.
Get a free API key