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.

GET/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>"
Parameters
ParameterDescription
chain

path · string · required

Solana only; every other chain returns 400, because the wired source computes a USD holdings history for Solana addresses only.
address

path · 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.

Response fields of Wallet balance history over time
FieldTypeDescription
historyobject[]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[].datestring | nullYYYY-MM-DD, the source's own snapshot bucket.
history[].timestampMsnumber | nullUnix 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[].valueUsdnumber | nullThis wallet's TOTAL USD holdings value at this snapshot — every token it held, not one position and not a cost basis.
history[].changePercentnumber | nullPercent 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.
summaryobject | nullnull 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.currentValueUsdnumber | nullThe 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.change24hUsdnumber | null
summary.change24hPercentnumber | nullCan genuinely be null — observed live when the value 24 hours ago was effectively zero, making a percent change undefined rather than infinite.
summary.change30dUsdnumber | null
summary.change30dPercentnumber | nullSame 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