Farbeam
Docs / Data

Token checks

A token report returns a list of checks. Each one reads a public field and applies a fixed threshold. There is no composite score, by design. You read each check and decide what it means for your use.

JSON
{
  "id": "top10",
  "title": "Top 10 holder share",
  "status": "warn",
  "detail": "46.2% (contracts and exchanges are included).",
  "source": "goplus",
  "field": "holders[].percent"
}
StatusMeaning
passThe field was read and it is within the threshold. It is not a statement that the token is safe.
warnThe field was read and it crosses the softer threshold, or the feature exists and has legitimate uses.
failThe field was read and it crosses the harder threshold.
unknownThe field was absent, or the source failed. Unknown is never a pass.

counts holds the number of checks per status. sources[] shows each call with ok and ms.

#Market checks (all chains)

These two run on EVM and Solana, using the pools DexScreener returns for the token.

IdTitlepasswarnfailunknown whenSource and field
liquidityDEX liquidity$100,000 or more$10,000 to below $100,000Below $10,000No pool datadexscreener, liquidity.usd
pool_ageOldest pool age7 days or more1 day to below 7 daysBelow 1 dayCreation time absentdexscreener, pairCreatedAt

Liquidity is the sum across pools. DexScreener returned at most 30 pools per token in every capture, so very widely traded tokens are undercounted.

Each check also holds checked_at, the UTC time of the check. A cached report keeps the time of the first read. Pools whose implied token price is more than 1.5 times away from the median are left out of the sums. This removes spoofed pools that report large liquidity against junk tokens. The detail text and market.outlier_pools_excluded give the count.

#EVM checks

All of these read the GoPlus token_security result for the chain.

IdTitlepass whenOtherwiseField
open_sourceContract source publishedValue is 1failis_open_source
honeypotHoneypot simulationValue is 0failis_honeypot
mintableOwner can mintValue is 0warnis_mintable
proxyUpgradeable proxyValue is 0warnis_proxy
balance_changeOwner can change balancesValue is 0failowner_change_balance
hidden_ownerHidden ownerValue is 0failhidden_owner
pausableTransfers can pauseValue is 0warntransfer_pausable
blacklistBlacklist functionValue is 0warnis_blacklisted

Each reads unknown when the field is absent.

The next four have numeric thresholds.

IdTitlepasswarnfailField
buy_taxBuy tax1% or lowerAbove 1%, below 10%10% or morebuy_tax
sell_taxSell tax1% or lowerAbove 1%, below 10%10% or moresell_tax
top10Top 10 holder share40% or lowerAbove 40%, up to 70%Above 70%holders[].percent
lp_lockedLP tokens locked50% or moreBelow 50%Neverlp_holders[].is_locked

top10 sums the first 10 holders GoPlus returns, including contracts and exchanges. A token held mainly by exchange wallets or a staking contract can show warn or fail for ordinary reasons. Read holders[], which shows is_contract and label.

lp_locked reads unknown when lp_holders is empty or absent. This can happen for tokens that trade in pools with no LP token, such as concentrated liquidity pools.

#Solana checks

IdTitlepasswarnfailSource and field
mint_authorityMint authorityRevokedStill setNeversolana-rpc, mintAuthority
freeze_authorityFreeze authorityRevokedStill setNeversolana-rpc, freezeAuthority
top10Top 10 token accounts share70% or lowerAbove 70%Neversolana-rpc, getTokenLargestAccounts
closableAccounts can be closed by authorityStatus 0Status 1Nevergoplus, closable
balance_mutableBalance can be changed by authorityStatus 0NeverStatus 1goplus, balance_mutable_authority
non_transferableNon-transferable tokenStatus 0NeverStatus 1goplus, non_transferable
rugcheckRugCheck normalised scoreBelow 5050 or moreNeverrugcheck, score_normalised, or score when absent

Each reads unknown when its field or source is absent.

Solana top10 counts token accounts, not owners. Pool vaults are token accounts and are included, so a share can look high because of a pool. getTokenLargestAccounts also fails at the RPC for some large tokens, which gives unknown.

The RugCheck value is passed through as reported: a higher score means more risk flags at that source. Farbeam does not control how RugCheck computes it.

#What the checks do not do

  • They do not predict price. The report's note field says so on each response.
  • They do not audit code. They read fields from third parties, which can be wrong or late.
  • honeypot is a simulation by GoPlus. A contract can behave differently later, or for other addresses.
  • A pass on a mint check does not rule out other paths to new supply, such as a proxy upgrade.
  • A set of passes does not make a token safe, and a fail does not make it a scam. Major stablecoins show warnings for admin powers.

Read reading token reports for worked examples.

#Handling results in code

Key by id, because the order can change and items can be added. Handle unknown as its own branch.

curl -s "https://farbeamlabs.com/api/v1/tokens/ethereum/0xdAC17F958D2ee523a2206206994597C13D831ec7" \
  | jq '.data.checks[] | select(.status != "pass") | {id, status, detail}'
const url = "https://farbeamlabs.com/api/v1/tokens/ethereum/0xdAC17F958D2ee523a2206206994597C13D831ec7";
const { data } = await (await fetch(url)).json();
const byId = Object.fromEntries(data.checks.map((c) => [c.id, c]));
console.log(byId.honeypot?.status, data.counts);
import requests

url = "https://farbeamlabs.com/api/v1/tokens/ethereum/0xdAC17F958D2ee523a2206206994597C13D831ec7"
data = requests.get(url, timeout=30).json()["data"]
by_id = {c["id"]: c for c in data["checks"]}
print(by_id["honeypot"]["status"], data["counts"])

Checks are information only and are not financial advice. See the disclaimer.