- Token Balances (
/wallets/{address}/tokens) - Wallet Net Worth (
/wallets/{address}/net-worth) - Cross-Chain Token Balances (
/v1/wallets/{address}/tokens) - Token Price and Token Prices (Batch), which take the price filters
Why values look wrong
Moralis prices tokens from onchain DEX swaps: a token’s price is the last price it traded at in its selected pool (see Token Prices). This is accurate for actively traded tokens. It goes wrong in three cases:
If the inflated value goes away on the next call, the cause is almost always a thin pool. The price really was traded onchain, but in a pool too small to trust. A liquidity threshold stops those prices being used at all.
The filters
exclude_spam
Removes tokens that Moralis flags as possible_spam. Detection uses contract metadata, known spam and phishing patterns, and onchain behaviour, and is updated as new patterns appear. See Spam Filtering.
Recommendation: always set exclude_spam=true for anything shown to users. Hardly any real holdings are flagged, and spam is the most common source of inflated totals.
min_pair_side_liquidity_usd
Sets the minimum USD liquidity a pool must hold on each side before Moralis uses it to price a token. With 1000, a TOKEN/USDC pool counts only if both the TOKEN side and the USDC side hold at least $1,000. Tokens with no qualifying pool are excluded. The default on EVM chains is $50 per side. See Liquidity Filtering.
This is the most effective filter against prices that jump and then correct. Pushing a price up with a single swap costs a lot more in a $1,000-a-side pool than in a $50-a-side pool.
Recommendation: 1000 for consumer wallets and portfolio apps. Use 250 to keep more small-cap tokens, or 10000 or more for reporting, accounting or anything that moves money based on the value. Above $1,000 a side you start losing real but small tokens, so raise it only when a false value costs more than a missing one.
max_token_inactivity
Excludes tokens that have not traded for more than the given number of days.
Recommendation: 7. A price more than a week old isn’t a fair current value for a portfolio. Raise it to 30 if your users hold long-tail tokens that trade rarely and you would rather show a stale price than none.
exclude_unverified_contracts
Keeps only ERC20 tokens verified by CoinGecko (verified_contract: true). See Verified Contracts.
This is the strictest filter. It removes almost all spam and manipulated tokens, along with real tokens that are new or too small to be listed on CoinGecko.
Recommendation: use it for headline numbers that must be defensible, such as a total balance shown on an exchange, a figure used in reporting, or an eligibility check. For a wallet that lists everything the user holds, leave it off and use the verified_contract field instead (see Checks to run on the response).
Recommended settings
Start with the first row. Move to a stricter row if users still report inflated values, and to a looser one if they report missing tokens.
Wallet or portfolio app
Checks to run on the response
The filters cover most cases. For a portfolio that real users rely on, also check these Token Balances fields before showing a value:verified_contract: when unverified tokens are left in, show them in the list but leave them out of the headline total, or label them “unverified”. You get the stricter total without hiding anything.possible_spam: if you don’t useexclude_spam, for example to show spam in a separate “hidden” tab, never count these tokens towards value.percentage_relative_to_total_supply: an ordinary wallet that holds a large share (say more than 1%) of an unverified token’s supply has usually been airdropped it. Real holdings of that size are rare outside the team that issued the token.usd_price_24hr_percent_change: a price that is up several thousand percent in a day, on an unverified token, is more likely a bad print than a real move. Hold it back until it repeats on the next call.portfolio_percentage: if one unverified token suddenly makes up most of a wallet’s value, check it before you show the total.
Endpoint reference
Cross-Chain Token Balances also returns
securityScore on each token, the token’s Token Score. Filtering out low scores is a good extra check on top of the filters above.
On Solana, the wallet endpoints don’t return USD values, and there is no default liquidity threshold. Set excludeSpam=true, use isVerifiedContract the way you would use verified_contract, and apply your own checks to any prices you fetch.
The legacy Token Balances endpoint (
/{address}/erc20) excludes spam by default, but it doesn’t take the price filters. Use Token Balances for anything that shows USD values.
