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
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.
- Submit an analysis with
simulateTokenContract. It returns asimulationIdat once and the analysis runs in the background. - Read the outcome with
getSimulateTokenContractResults, passing thatsimulationId, or subscribe toonSimulateTokenContractfor the token.
verdictis the answer:TRADEABLE,HONEYPOT, orINDETERMINATEwith averdictReasonsuch as no sell route or an unsupported venue.statusonly tracks the pipeline, andbuySuccess/sellSuccessare true on indeterminate rows too, so readverdictfirst.swap.buyTaxandswap.sellTaxare decimal fractions as strings."0.05"is 5% and"1"is 100%. A honeypot usually showssellTax: "1"withsellSuccess: false.liquidity.pairAddressis 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
PENDINGrow first. The finished result lands as a second row under the sameuuid, usually within seconds. Read the row that has averdict. - Omit
simulationIdto 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 havestatus: FAILUREand noverdict. - One submission per token and network every five minutes. A second one returns a
TOO_MANY_REQUESTSerror naming the retry time.
How this relates to isScam and potentialScam
Risk filters are opt-in. They don’t change the existing scam filters:
filterTokenshides tokens withisScam: trueby default. PassincludeScams: trueto include them, which you’ll need when filtering forSCAMverdicts.isVerified: truekeeps only tokens withisScam: false. It isn’t the same asriskVerdicts: [VERIFIED].potentialScamandpotentialScamReasonsare an older automated flag. They’re still available, butriskis the more complete signal.