Skip to main content
Codex assesses tokens for scam and rug signals and returns one answer: a verdict, the score behind it, how much contract analysis it rests on, and the reasons that fired. Use it to warn users and build your own screening. It is a warning signal, not a safety guarantee.

Where to read it

Pair fields describe the pair’s token of interest (the one named by quoteToken), not the pool itself. A null risk, or a null field inside it, means Codex has no assessment. Treat it as unknown, never as safe.

Verdicts

SCAM, VERIFIED and VERIFIED_CONTESTED come from proof or a human decision, not the score, so their score is usually null. A high score alone never produces SCAM.

Score

Each reason adds points, and a 15-point bonus applies when reasons from three or more families fire together. The total is capped at 100. The score is a weighted heuristic, not a probability: 70 does not mean a 70% chance of a scam. Not every reason adds points. Authority reasons (AUTH_*), such as a Solana mint or freeze authority, report a capability without scoring it, so you can’t rebuild the score by counting reasons.

Coverage

Coverage says how much contract analysis (simulated buys and sells, static checks) the verdict rests on. It doesn’t say what the analysis concluded. A NEUTRAL token with NOT_ANALYZED coverage has had no honeypot or tax check. Show that differently from NEUTRAL + ANALYZED.

Reasons

RiskReasonCode values are grouped by prefix: New codes are added over time. Handle unknown codes gracefully, and don’t treat an empty list as proof the token is clean.

Freshness

Codex re-assesses tokens in the background as new data arrives; queries read the latest stored result. flaggedAt is the Unix time the assessment last changed. A re-check that reaches the same result doesn’t update it.

Examples

Read one token

Hide risky tokens from a list

Values inside one filter are ORed; different filters are ANDed. Filtering by verdict also drops unassessed tokens.

Find likely honeypots among pairs

filterTokens and filterPairs both accept riskVerdicts, riskCoverages, riskReasons, riskScore and riskFlaggedAt filters, and both can rank by riskScore or riskFlaggedAt.

Get the actual tax numbers

risk tells you that a token has a high tax or failed a sell. The numbers behind those reasons come from the contract simulator, which runs a buy and a sell against the token’s pool and records what happened.
The simulator is in beta. Each run analyzes one pool, and pools with custom logic such as Uniswap V4 hooks are still being refined.
  1. Submit an analysis with simulateTokenContract. It returns a simulationId at once and the analysis runs in the background.
  2. Read the outcome with getSimulateTokenContractResults, passing that simulationId, or subscribe to onSimulateTokenContract for the token.
Reading a result:
  • verdict is the answer: TRADEABLE, HONEYPOT, or INDETERMINATE with a verdictReason such as no sell route or an unsupported venue. status only tracks the pipeline, and buySuccess / sellSuccess are true on indeterminate rows too, so read verdict first.
  • swap.buyTax and swap.sellTax are decimal fractions as strings. "0.05" is 5% and "1" is 100%. A honeypot usually shows sellTax: "1" with sellSuccess: false.
  • liquidity.pairAddress is the pool the run traded through. Tax is a property of the pool, so two runs on the same token can differ when they route through different pools. On Uniswap V4 this is a 32-byte pool ID.
  • A submission writes a PENDING row first. The finished result lands as a second row under the same uuid, usually within seconds. Read the row that has a verdict.
  • Omit simulationId to read every stored analysis for the token, newest block first. An empty list means the token has never been analyzed, so submit one. Rows from before the 2026 rebuild can have status: FAILURE and no verdict.
  • One submission per token and network every five minutes. A second one returns a TOO_MANY_REQUESTS error naming the retry time.
The three simulator endpoints need a Growth or Enterprise plan.

How this relates to isScam and potentialScam

Risk filters are opt-in. They don’t change the existing scam filters:
  • filterTokens hides tokens with isScam: true by default. Pass includeScams: true to include them, which you’ll need when filtering for SCAM verdicts.
  • isVerified: true keeps only tokens with isScam: false. It isn’t the same as riskVerdicts: [VERIFIED].
  • potentialScam and potentialScamReasons are an older automated flag. They’re still available, but risk is the more complete signal.
Last modified on September 23, 2026