If you're running a sniper bot off the DEX firehose or a fresh-mint scanner off /v1/tokens, you've hit this: the bot fires a buy on what it thinks is a fresh memecoin and you find out a minute later you just bought 0.4 SOL of USDT, or wrapped SOL, or jitoSOL. The mint has the right primary_dex, the right mc_change_pct.1h, the right volume — everything looks like a momentum signal — but the token isn't a memecoin, it's a piece of DeFi plumbing that happens to show up in your filter set.
These are structural false-positives. They're not bugs; they're real swaps on real DEX pools, just on the wrong category of token. The fix isn't smarter client-side logic — it's a data-layer flag that says "this mint is not a tradeable memecoin, skip it."
That's what is_blacklisted and blacklist_category are on the MadeOnSol API. Every /v1/token/{mint} and /v1/token/batch response carries the pair, and four categories cover the cases that come up: stablecoin, wrapped_sol, lst, rug-flagged. This post walks through what each one filters, when to use the guard, and the recommended client pattern.
The fields
Two fields on every token response:
{
"token": {
"mint": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
"price_usd": 1.001,
"market_cap": 4_812_000_000,
"is_blacklisted": true,
"blacklist_category": "stablecoin",
...
}
}
is_blacklisted is true for any mint that has a row in token_blacklist. blacklist_category carries which category. When is_blacklisted is false, the category is null. That's the whole shape.
The four categories
stablecoin
Major USD-pegged stables: USDC, USDT, USD1, and a few others. These mints show up in dex-stream events because they're the quote leg of every memecoin swap. A naive "look for new tokens trading" pipeline picks them up because their pools are active 24/7.
Filtering on blacklist_category === "stablecoin" is the cleanest way to drop them. Quote-mint filtering inside mc-tracker also rejects them upstream, but the blacklist is your defense in depth — if a stable somehow leaks through, the consumer-side guard catches it.
wrapped_sol
So11111111111111111111111111111111111111112 and historical wrapped-SOL variants. Like stablecoins, WSOL appears as a swap leg constantly. Filter it out for the same reason.
lst
Liquid-staking tokens: jitoSOL, mSOL, bSOL, jupSOL, INF, etc. These are real tradeable tokens with meaningful market caps, but they're DeFi assets, not memecoins. If your sniper is built for memecoins, you don't want it sizing into jitoSOL because the chart looks healthy.
Different from stables in one important way: LSTs have memecoin-like price action (modest daily ranges, no peg), so the is_blacklisted flag is what tells your bot "this is staking infrastructure, not memecoin alpha." Without the flag, an LST with 3% daily move and steady volume looks like an ideal sniper target.
rug-flagged
Mints that admins have manually flagged after a rug or scam. The criteria are deliberately conservative — we don't flag every drawdown — but tokens whose deployers withdraw liquidity, freeze trading, or pull a soft rug get added here.
The other three categories are mostly static (the stablecoin and LST list grows slowly). rug-flagged is the only one that grows in real time as incidents happen. It's also the only one where a previously-clean mint can become blacklisted after-the-fact.
When to use the guard
Three places where the check earns its keep:
-
Sniper bots subscribing to the DEX firehose. Before sizing a trade on a fresh mint, hit /v1/token/{mint} and reject anything where is_blacklisted === true. The check costs you nothing in latency (single mint, sub-100ms response) and saves you from buying structural noise.
-
Scanner consumers. /v1/tokens doesn't currently filter blacklisted mints by default (so you can see them if you want — auditing the blacklist is itself a use case). When you're consuming for a trading bot, drop them client-side or set up a per-row check.
-
Wallet-tracker and copy-trade webhook handlers. If you're auto-mirroring a KOL's trades, a guard rejecting blacklisted mints prevents you from copying a KOL's stablecoin route as a memecoin entry.
A worked example: pre-trade guard for a sniper bot
import { MadeOnSol } from "madeonsol";
const client = new MadeOnSol({ apiKey: process.env.MADEONSOL_API_KEY! });
async function shouldTradeMint(mint: string) {
const { token } = await client.token.get(mint);
if (token.is_blacklisted) {
console.log(`[guard] skipping ${mint} — ${token.blacklist_category}`);
return false;
}
// Continue with other filters...
if ((token.liquidity_usd ?? 0) < 5000) return false;
if ((token.market_cap ?? 0) < 50_000) return false;
if (token.deployer?.tier === "cold") return false;
return true;
}
The blacklist check is the first reject — cheapest to evaluate, eliminates the most categories of false-positive at once.
In batch form, for a set of mints from your scanner:
async function filterTradeable(mints: string[]) {
const { tokens } = await client.token.batch({ mints });
return tokens.filter((t) => !t.is_blacklisted);
}
One API call gives you the blacklist verdict for up to 50 mints at once. If your bot fans out these guard checks aggressively, keep an eye on your remaining call budget — the cleanest way is self-throttling against your /v1/me quota rather than parsing rate-limit headers after the fact.
What's NOT in the blacklist
A few categories that you might assume are blacklisted but aren't:
- Token-2022 mints with transfer fees. These are not blacklisted — they're real memecoins with a 2022-extension fee. Use the
exclude_token2022 filter on /v1/tokens if you want to skip them. They're checked separately because the population includes both legitimate fee-bearing tokens and certain rug-friendly variants.
- Tokens with authority still live. Not blacklisted. Use
authority_revoked=true on /v1/tokens if you want only fully-revoked tokens.
- Low-liquidity tokens. Not blacklisted. The default
min_liq=2000 on /v1/tokens filters them at the scanner level.
- Old, dead tokens. Not blacklisted (no specific category for "no recent volume"). Use
active_h on the scanner.
The blacklist is for structural exclusions — categories of mint that shouldn't be treated as memecoin trading targets — not for general filtering.
Edge cases
- A KOL trades a blacklisted mint. The trade still appears in
/v1/kol/feed and /v1/copytrade/signals — we don't filter the source-of-truth feed because KOLs occasionally route through stables or LSTs as part of a larger strategy, and dropping those rows would corrupt their P&L math. Your copy-trade bot should apply the guard.