TokensAPI

Risk-aware search

The judgment pipeline behind /v2/search and /v2/resolve — policies, gate overrides, and the reasons, warnings and suppressedBy codes that explain every result.

GET /v2/search and GET /v2/resolve share one pipeline. This page explains how it judges; the routes are on Search & Resolve.

The judgment pipeline

Candidates come from three sources, merged and deduped by mint: a live market-data provider for long-tail coverage, the token index, and the curated asset registry. Each candidate then passes through four stages:

  1. Intent classification — is the query a mint address, a ticker or a name? (interpretation.intent). A mint address is a lookup, never fuzzy.
  2. Hard gates — a policy decides which candidates are suppressed. Suppressed rows are returned under suppressed[] with the gate that fired; nothing is silently hidden.
  3. Weighted score — the survivors are ranked (score.total, score.components).
  4. Explanations — every ranked result carries reasons, warnings and badges; every suppressed row carries suppressedBy.

Policies and overrides

A policy is a declarative bundle of hard gates, score weights and a refusal bar. Presets:

Gatestrictdefaultdegen
minLiquidityUsd10 0001 000none
requireMarketDatatruefalsefalse
suppressImpersonationtruetruefalse
minMarketScorenonenonenone
minAgeDays1nonenone
requireRegistry (verifiedOnly)falsefalsefalse

/v2/search and /v2/resolve default to default; the curator search GET /v2/lists/search-tokens defaults to strict.

Each gate can be overridden per request:

ParamAcceptsEffect
minLiquidityUsdnumber ≥ 0, or noneSuppress below this liquidity (gate_min_liquidity). Registry-attested mints are exempt
minAgeDaysinteger ≥ 0, or noneSuppress tokens younger than this (gate_new_token)
minMarketScoreinteger 0–100, or noneSuppress tokens whose known score is below this (gate_min_market_score)
requireMarketDatatrue, falseSuppress tokens with no market snapshot (gate_no_market_data)
suppressImpersonationtrue, falseSuppress likely impersonators of a protected symbol (gate_impersonation)
verifiedOnlytrue, falseSuppress mints without a curated-registry variant (gate_unverified)

none, null and off all disable a numeric gate; booleans also accept 1/0 and yes/no. Out-of-range numbers and unknown policy values are 400s; an invalid policy echoes the valid ids in details.policies.

Overrides change only the gate you name; score weights and the refusal bar always come from the preset. The response's policy.gates is the effective document and policy.overrides lists what you changed, so any result is reproducible from its own envelope.

Two rules are not overridable under any preset:

  • Advisory gates: mints carrying a blocked or compromised advisory are always suppressed (gate_advisory_blocked, gate_advisory_compromised). A caution advisory is a warning, not a gate. See Advisories.
  • Tombstones: mints editorially deleted from the corpus are always suppressed (gate_tombstoned).

Registry-attested assets bypass the liquidity gate: it exists to filter scams and unknowns, not to hide verified assets that settle off-AMM (RFQ or primary-issuance tokenized stocks and funds). Thin tradability on those shows as a low_liquidity warning instead.

Reading the output

  • reasons explain rank. warnings are caution signals on a token that is still ranked. suppressed[].suppressedBy names the gate that removed a candidate. All three vocabularies are enumerated below and are a stable contract: new codes may be added, existing ones are not renamed.
  • suppressed rows are never truncated by limit. Loosen the gate, or switch to degen, to see them ranked instead.
  • badges are free-form labels: curated:<list> for curated membership, tier1, tier2, tier3, grade:A|B|C (the same market grade v1 exposes, computed from the token's own liquidity, market cap, holders, volume and age) and advisory:<status>. A token with too little market data to score carries no grade: badge.
  • claims.attestations are the evidence behind claim credibility: curated_list, registry_variant, market_dominance, deep_liquidity, sustained_activity, established_age, broad_holder_base, each with a human-readable detail.
  • verified is true when a curated-registry variant exists for the mint.

Explanation codes

reasons

CodeMeaning
mint_matchQuery was this exact mint address
exact_symbol_matchSymbol equals the normalized query
exact_name_matchName equals the normalized query
symbol_prefix_matchSymbol starts with the query
name_matchName contains the query
alias_matchReserved for alias matches; not emitted
curated_list_memberMint is in one of the curated lists
registry_variantMint is a curated-registry variant
market_leaderDominant market among the candidates claiming this symbol
deep_liquidityLiquidity of at least $1M
high_activity24h volume of at least $250k
established_tokenFirst seen at least 90 days ago
strong_execution_qualityExecution-quality score of at least 70 (tight, deep markets)

warnings

CodeMeaning
low_liquidityLiquidity below $10k, still ranked (the mint is registry-attested or the gate is off)
no_market_dataNo market snapshot available
possible_impersonationClaims a protected symbol, is not the protected holder, is not registry-attested, and is young or shallow
symbol_collisionClaims a protected symbol without being its holder, but is established enough not to look like an impersonator
suspicious_charactersHomoglyphs or invisible characters in the symbol or name
new_tokenYounger than 7 days
stale_dataMarket data older than 30 minutes
high_bot_volumeMore than 60% of volume attributed to bots
concentrated_holdersTop-10 holders own more than 50% of supply (registry-attested mints exempt)
unverifiedNo curated-registry variant for this mint
weak_market_scoreKnown market score below 40
advisory_cautionThe mint carries a caution advisory; see Advisories

suppressedBy

CodeGateOverridable
gate_tombstonedMint editorially deleted from the corpusno
gate_advisory_blockedMint carries a blocked advisoryno
gate_advisory_compromisedMint carries a compromised advisoryno
gate_min_liquidityBelow minLiquidityUsd (registry-attested mints exempt)minLiquidityUsd
gate_no_market_dataNo market snapshot and requireMarketData is onrequireMarketData
gate_impersonationLikely impersonator of a protected symbolsuppressImpersonation
gate_min_market_scoreKnown market score below minMarketScoreminMarketScore
gate_new_tokenYounger than minAgeDaysminAgeDays
gate_unverifiedNot in the curated registry and verifiedOnly=trueverifiedOnly

Resolve: confidence or refusal

GET /v2/resolve runs the same pipeline over a fixed candidate window and answers with one of three statuses, always with HTTP 200 when the request is valid:

  • resolved — the best candidate clears the policy's refusal bar and beats the runner-up by a margin. best.confidence is 0–1; an exact mint paste is 1.
  • ambiguous — several credible claimers exist, typical for an unprotected symbol shared by unrelated tokens. Show candidates (at most 5, best first) and let the user pick.
  • no_confident_match — nothing clears the bar. A confident-looking wrong answer is the worst possible output, so "I don't know" is a first-class response.

Each policy has its own refusal bar: strict refuses most readily, degen least.

Cost

Unique queries can reach the live provider, so /v2/search, /v2/resolve and /v2/lists/search-tokens share a per-key budget of 120 calls per 10 minutes by default. Identical queries within the 30-second cache window do not count. See Provider lookup budget.