Skip to main content
Wallets collect tokens they never asked for. Airdropped spam, dead tokens and tokens that trade in tiny pools can all carry a USD price, and one bad price is enough to inflate a portfolio total. You control how strict Moralis is when it values a wallet. This page explains the filters, recommends values for common use cases, and lists the extra checks worth running on the response. It applies to:
On these endpoints every filter is off by default. If you show balances or net worth to end users, set them explicitly.

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).
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
Use the same values on Token Balances and Net Worth. Then the tokens in the list add up to the total, and users don’t see a figure they can’t reconcile.

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 use exclude_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.
If you store snapshots, compare each token’s value with the previous snapshot. A low-liquidity token that jumps more than about 10x between two calls can safely wait one refresh cycle before you show the new value.

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.