---
title: "Get a rug pull risk verdict for one pump.fun Solana token"
method: GET
path: "/v1/verdict/{mint}"
tags: ["paid"]
---

# Get a rug pull risk verdict for one pump.fun Solana token

`GET /v1/verdict/{mint}`

## Request

- Base URL: `https://api.loopholetape.com`
- URL: `https://api.loopholetape.com/v1/verdict/{mint}`
- Auth: none required

Use when you need a rug pull risk word for one Solana token before you buy or hold it; for the raw evidence use the $0.005 compact check (GET /v1/check/mint), and to find mints use the free /v1/radar. The compact check of one mint as a bounded verdict with a one-line reason, the calibrated P(rug within 5 min) and P(true graduation) exactly as /v1/check/mint publishes them (/v1/calibration), up to three observed flags with first-observed times and evidence, and share_url: a free card page signed at purchase time that anyone can open without paying. The rule is fixed and public (/v1/labels): avoid = a documented rug or close flag observed, or P(rug within 5 min) >= 0.5; caution = P(rug) >= 0.1, concentrated, stalled or mayhem risk label, or odds unavailable; no_flags_observed = none of these, which is not a safety guarantee. P(true graduation) never softens a verdict. Same rules as the compact check: full live coverage and feed lag <= 5 s required; unavailable or stale is unpaid, and so is a curve not quoted in SOL (a pump.fun custom pair: quote_not_modelled). Exact signed-payment retries recover the original result for 10 min. The verdict also carries the compact check's market (USD price, market cap = price x total supply, curve liquidity) and authorities (the pump.fun program rule), and its free card shows the market cap at purchase. The answer also carries the mint's cohorts block (dev, bundlers, snipers, top-1 and top-10 share, and the holders' reputation across tokens) as context for the reasons; the rule does not read it.

## Path parameters

- `mint` string, required

## Response `200`

Paid verdict or original receipt replay; share_url opens the free card.

- Verdict
  - `ok` true, required
  - `schema_version` '2.0', required
  - `generated_at` string, required
  - `t` number, required
  - `coverage` 'full', required
  - `data` object, required
    - `mint` string, required
    - `verdict` 'avoid' | 'caution' | 'no_flags_observed', required
    - `basis` string[], required: Rule ids that fired; empty for no_flags_observed. The rule is published at /v1/labels.
    - `reason` string, required
    - `probabilities` object, nullable, required: The calibrated numbers exactly as the compact check publishes them.
      - `model` string, required
      - `calibration` string, required
      - `horizon_s` integer, required
      - `rug_within_300s` number, nullable
      - `true_graduation` number, nullable
      - `rug_within_300s_reason` string, nullable
      - `true_graduation_reason` string, nullable
      - `reason` string, nullable
      - `rug_within_300s_basis` string, nullable
      - `base_rate_same_age` number, nullable
      - `recalibration` string, nullable
      - `diagnostics` object, nullable
      - `features_used` object, nullable
    - `quote` object, nullable: The curve's quote asset (/v1/labels quote); a verdict is sold only for a SOL-quoted curve, any other is refused unpaid (quote_not_modelled).
      - `asset` 'sol' | 'usdc' | 'pyusd' | 'stock' | 'other' | 'unknown', required: The curve's quote asset: sol, usdc, pyusd, stock (an xStocks tokenized equity), other, or unknown (not read from the curve account; is_sol says what our tape shows).
      - `mint` string, nullable: The quote_mint the bonding-curve account holds (the all-zero default 11111111111111111111111111111111 on SOL curves); null when not read.
      - `modelled` boolean, required: True only for a curve shown to be SOL-quoted: our flags, labels, verdict and odds are measured in SOL. False = those are withheld (reason quote_not_modelled).
      - `is_sol` boolean, nullable: true = SOL-quoted, false = quoted in another asset, null = not established yet.
      - `holder_rewards` boolean, nullable: The curve's is_holder_reward flag (pump.fun Holder Rewards: the creator fee goes to holders); null when the account was not read.
      - `basis` 'curve_account' | 'curve_stream' | 'tape' | 'none', required: curve_account = read from the bonding-curve account over RPC; curve_stream = the same account fields as our capture streams them; tape = our capture's evidence; none = no evidence yet.
      - `evidence` string, nullable: The tape evidence behind is_sol (/v1/labels quote.evidence).
      - `reason` 'quote_not_modelled', nullable: Set when modelled is false.
    - `odds_caveat` string, required
    - `reasons` object[], required: Up to three observed flags, earliest first.
      - `code` string, required
      - `text` string, required
      - `first_seen_at` number, nullable, required
      - `first_seen_after_launch_s` number, nullable, required
      - `evidence` object, required
    - `reasons_total` integer, required
    - `cohorts` object, nullable: Context for the reasons, not part of the rule: who holds the supply now by launch-time role (dev, bundlers, snipers, top-1 and top-10 share), as the holders answer reports it; definitions at /v1/labels (cohorts). Null when it could not be built; the verdict stands.
      - `version` 'cohorts-1', required
      - `top1_share` number, required: Share of total supply held by the largest wallet in our ledger (the bonding curve and the mayhem agent are not holders).
      - `top10_share` number, required: Share of total supply held by the 10 largest wallets in our ledger (the bonding curve and the mayhem agent are not holders).
      - `union_share` number, required: Share of supply held by wallets in at least one cohort, each wallet counted once.
      - `slot_windows` object, required
        - `bundlers` integer[], required: Inclusive slot offsets from the create slot.
        - `snipers` integer[], required: Inclusive slot offsets from the create slot; the upper end is basis.sniper_max_offset.
      - `basis` object, nullable: The slot regime the windows come from and the numbers derived from it (/v1/labels cohorts.basis).
        - `slot_ms` integer, required: The protocol's target slot duration in the slot regime of the mint's create slot (/v1/labels cohorts.slot_regime).
        - `slot_ms_measured` number, required: That regime's measured mean slot duration, from mainnet block times.
        - `regime_from_slot` integer, required: First slot of that regime.
        - `regime_from` string, nullable: Block time of that slot (null for the first regime).
        - `regime_by` 'create_slot' | 'launch_time' | 'current', required: What the regime was read from.
        - `bundle_max_offset` integer, required: N: bundlers are offsets 0-N.
        - `sniper_window_s` number, required: The sniper time window.
        - `sniper_max_offset` integer, required: K = round(sniper_window_s / slot_ms): snipers are offsets N+1..K.
        - `sniper_window_measured_s` number, required: When slot K starts after the create slot at the measured slot duration.
      - `unbooked_sol` number, nullable: The curve's own SOL after the last booked trade minus the net SOL of every booked trade since launch: SOL that moved in trades our tape does not hold; null when it cannot be checked.
      - `shares_complete` boolean, nullable: True when the booked trades account for the curve's SOL (within 0.001 SOL); false when trades are missing, so every share here is a lower bound; null when it cannot be checked.
      - `sol_complete` boolean, required: True when every cohort SOL figure is exact; false names the reason in sol_reason.
      - `sol_reason` 'tape_truncated' | 'quote_not_sol' | 'trades_unbooked' | 'create_sol_unknown', nullable
      - `dev` object, required
        - `share_of_supply` number, nullable, required: Tokens the cohort's wallets hold now / total supply (1B; 2B on a mayhem launch).
        - `n_wallets` integer, nullable: Wallets in the cohort, sold-out ones included.
        - `n_holding` integer, nullable: Wallets of the cohort still holding tokens.
        - `buy_sol` number, nullable: SOL that entered the curve on the cohort's buys (fees paid outside the curve are not in it).
        - `sell_sol` number, nullable: SOL that left the curve on the cohort's sells.
        - `net_sol` number, nullable: buy_sol - sell_sol: negative when the cohort took out more SOL than it put in; null when sol_complete is false for it.
        - `wallets` object[], nullable: Up to 10 of the cohort's wallets, largest holding first.
          - `wallet` string, required
          - `share_of_supply` number, required: Tokens this wallet holds now / total supply.
          - `first_slot_offset` integer, nullable: Slots after the create slot when the wallet's first tokens of this mint arrived; null when it never received any.
          - `net_sol` number, nullable: SOL it put into the curve on its buys minus SOL it took out on its sells; null when the tape cannot give it exactly.
          - `history` object, nullable: One wallet's history on OTHER pump.fun mints in our tape since the seam (the mint answered is never counted).
            - `mints` integer, required: Other pump.fun mints this wallet bought in our tape since 2026-09-27T00:18:34Z (the mint answered is never counted).
            - `bundled` integer, required: Of those, mints where its first tokens arrived in the create slot or the next one (the bundlers rule of the cohort block).
            - `quick_sells` integer, required: Of those, mints it sold within 60 s of its first buy.
            - `settled` integer, required: Of those, mints whose outcome labels have settled (/v1/labels, outcome).
            - `rugged` integer, required: Of the settled ones, mints labelled rugged_within_300s by the public rule.
            - `graduated` integer, required: Of the settled ones, mints that truly graduated.
        - `source` 'tape' | 'tape+funding_capture' | 'unavailable', required
        - `reason` string, nullable: Why the cohort's figures are null.
        - `n_funded_by_creator` integer, required: Wallets in the dev cohort because our funding capture saw the creator fund them.
      - `bundlers` object, required
        - `share_of_supply` number, nullable, required: Tokens the cohort's wallets hold now / total supply (1B; 2B on a mayhem launch).
        - `n_wallets` integer, nullable: Wallets in the cohort, sold-out ones included.
        - `n_holding` integer, nullable: Wallets of the cohort still holding tokens.
        - `buy_sol` number, nullable: SOL that entered the curve on the cohort's buys (fees paid outside the curve are not in it).
        - `sell_sol` number, nullable: SOL that left the curve on the cohort's sells.
        - `net_sol` number, nullable: buy_sol - sell_sol: negative when the cohort took out more SOL than it put in; null when sol_complete is false for it.
        - `wallets` object[], nullable: Up to 10 of the cohort's wallets, largest holding first.
          - `wallet` string, required
          - `share_of_supply` number, required: Tokens this wallet holds now / total supply.
          - `first_slot_offset` integer, nullable: Slots after the create slot when the wallet's first tokens of this mint arrived; null when it never received any.
          - `net_sol` number, nullable: SOL it put into the curve on its buys minus SOL it took out on its sells; null when the tape cannot give it exactly.
          - `history` object, nullable: One wallet's history on OTHER pump.fun mints in our tape since the seam (the mint answered is never counted).
            - `mints` integer, required: Other pump.fun mints this wallet bought in our tape since 2026-09-27T00:18:34Z (the mint answered is never counted).
            - `bundled` integer, required: Of those, mints where its first tokens arrived in the create slot or the next one (the bundlers rule of the cohort block).
            - `quick_sells` integer, required: Of those, mints it sold within 60 s of its first buy.
            - `settled` integer, required: Of those, mints whose outcome labels have settled (/v1/labels, outcome).
            - `rugged` integer, required: Of the settled ones, mints labelled rugged_within_300s by the public rule.
            - `graduated` integer, required: Of the settled ones, mints that truly graduated.
        - `source` 'tape' | 'tape+funding_capture' | 'unavailable', required
        - `reason` string, nullable: Why the cohort's figures are null.
      - `snipers` object, required
        - `share_of_supply` number, nullable, required: Tokens the cohort's wallets hold now / total supply (1B; 2B on a mayhem launch).
        - `n_wallets` integer, nullable: Wallets in the cohort, sold-out ones included.
        - `n_holding` integer, nullable: Wallets of the cohort still holding tokens.
        - `buy_sol` number, nullable: SOL that entered the curve on the cohort's buys (fees paid outside the curve are not in it).
        - `sell_sol` number, nullable: SOL that left the curve on the cohort's sells.
        - `net_sol` number, nullable: buy_sol - sell_sol: negative when the cohort took out more SOL than it put in; null when sol_complete is false for it.
        - `wallets` object[], nullable: Up to 10 of the cohort's wallets, largest holding first.
          - `wallet` string, required
          - `share_of_supply` number, required: Tokens this wallet holds now / total supply.
          - `first_slot_offset` integer, nullable: Slots after the create slot when the wallet's first tokens of this mint arrived; null when it never received any.
          - `net_sol` number, nullable: SOL it put into the curve on its buys minus SOL it took out on its sells; null when the tape cannot give it exactly.
          - `history` object, nullable: One wallet's history on OTHER pump.fun mints in our tape since the seam (the mint answered is never counted).
            - `mints` integer, required: Other pump.fun mints this wallet bought in our tape since 2026-09-27T00:18:34Z (the mint answered is never counted).
            - `bundled` integer, required: Of those, mints where its first tokens arrived in the create slot or the next one (the bundlers rule of the cohort block).
            - `quick_sells` integer, required: Of those, mints it sold within 60 s of its first buy.
            - `settled` integer, required: Of those, mints whose outcome labels have settled (/v1/labels, outcome).
            - `rugged` integer, required: Of the settled ones, mints labelled rugged_within_300s by the public rule.
            - `graduated` integer, required: Of the settled ones, mints that truly graduated.
        - `source` 'tape' | 'tape+funding_capture' | 'unavailable', required
        - `reason` string, nullable: Why the cohort's figures are null.
      - `fresh_wallets` object, required
        - `share_of_supply` number, nullable, required: Tokens the cohort's wallets hold now / total supply (1B; 2B on a mayhem launch).
        - `n_wallets` integer, nullable: Wallets in the cohort, sold-out ones included.
        - `n_holding` integer, nullable: Wallets of the cohort still holding tokens.
        - `buy_sol` number, nullable: SOL that entered the curve on the cohort's buys (fees paid outside the curve are not in it).
        - `sell_sol` number, nullable: SOL that left the curve on the cohort's sells.
        - `net_sol` number, nullable: buy_sol - sell_sol: negative when the cohort took out more SOL than it put in; null when sol_complete is false for it.
        - `wallets` object[], nullable: Up to 10 of the cohort's wallets, largest holding first.
          - `wallet` string, required
          - `share_of_supply` number, required: Tokens this wallet holds now / total supply.
          - `first_slot_offset` integer, nullable: Slots after the create slot when the wallet's first tokens of this mint arrived; null when it never received any.
          - `net_sol` number, nullable: SOL it put into the curve on its buys minus SOL it took out on its sells; null when the tape cannot give it exactly.
          - `history` object, nullable: One wallet's history on OTHER pump.fun mints in our tape since the seam (the mint answered is never counted).
            - `mints` integer, required: Other pump.fun mints this wallet bought in our tape since 2026-09-27T00:18:34Z (the mint answered is never counted).
            - `bundled` integer, required: Of those, mints where its first tokens arrived in the create slot or the next one (the bundlers rule of the cohort block).
            - `quick_sells` integer, required: Of those, mints it sold within 60 s of its first buy.
            - `settled` integer, required: Of those, mints whose outcome labels have settled (/v1/labels, outcome).
            - `rugged` integer, required: Of the settled ones, mints labelled rugged_within_300s by the public rule.
            - `graduated` integer, required: Of the settled ones, mints that truly graduated.
        - `source` 'tape' | 'tape+funding_capture' | 'unavailable', required
        - `reason` string, nullable: Why the cohort's figures are null.
      - `omitted` object, required: Cohorts not served, with the reason.
      - `reputation` object, nullable: Cross-token history of the wallets holding this mint now, from our own trade tape since 2026-09-27T00:18:34Z: known_dumpers_share, repeat_bundlers_share and new_wallets_share of supply, with counts and the basis (hours of tape, gaps); null figures with status and reason when the history store is not ready. Definitions at /v1/labels (reputation).
        - `version` 'reputation-1', required
        - `status` 'ready' | 'warming_up' | 'behind' | 'unavailable' | 'not_enabled' | 'failed', required
        - `known_dumpers_share` number, nullable: Share of supply held by wallets that sold within 60 s of their first buy on at least 3 other mints.
        - `repeat_bundlers_share` number, nullable: Share of supply held by wallets whose first tokens arrived in the create slot or the next one on at least 3 other mints.
        - `new_wallets_share` number, nullable: Share of supply held by wallets with no other mint in our tape since 2026-09-27T00:18:34Z: new to our tape, not necessarily fresh wallets.
        - `n_known_dumpers` integer, nullable
        - `n_repeat_bundlers` integer, nullable
        - `n_new_wallets` integer, nullable
        - `n_holders` integer, nullable: Holders read (every wallet of the ledger holding tokens now).
        - `basis` object, required
          - `tape_since` string, required: Start of the history: the capture seam; no earlier trade is in the store.
          - `history_from` string, nullable: First trade time the store holds (UTC).
          - `history_to` string, nullable: Newest trade time the store holds (UTC).
          - `history_hours` number, nullable: Hours of tape the store holds since tape_since, gaps excluded.
          - `gaps` integer, nullable: Interruptions of the store's intake longer than 120 s (a server restart after more than ~25 min down): trades in them are missing.
          - `store_lag_s` number, nullable: Our newest ingested trade minus the store's newest trade.
          - `quick_sell_s` integer, required
          - `min_prior_mints` integer, required
          - `retention` string, required
          - `labels` string, required
        - `reason` string, nullable: Why the figures are null (status other than ready).
    - `lifecycle` string, required
    - `risk_label` string, required
    - `market` object, nullable: USD price, market cap and curve liquidity (/v1/labels market).
      - `price_sol` number, nullable: SOL per whole token at the bonding curve's marginal price.
      - `price_usd` number, nullable
      - `market_cap_sol` number, nullable
      - `market_cap_usd` number, nullable: price_usd x total supply (1B tokens, 2B on a mayhem launch): the pump.fun and DexScreener convention, equal to FDV.
      - `curve_liquidity_sol` number, nullable: Real SOL held by the bonding curve.
      - `curve_liquidity_usd` number, nullable
      - `sol_usd` number, nullable: The Coinbase SOL-USD spot the USD fields use.
      - `as_of` number, nullable: Unix seconds of that sol_usd read.
      - `reason` string, nullable: Why fields are null; codes at /v1/labels market.reason.
    - `authorities` object, nullable: Mint, freeze and metadata authorities (/v1/labels authorities).
      - `mint_authority` boolean, nullable: true = set (more can be minted), false = none, null = not read.
      - `freeze_authority` boolean, nullable: true = set (accounts can be frozen), false = none, null = not read.
      - `metadata_mutable` boolean, nullable: true = name, symbol or image can still change, false = immutable, null = not read.
      - `source` 'onchain' | 'pumpfun_rule', nullable: pumpfun_rule: pump.fun's program leaves no mint or freeze authority and immutable metadata.
    - `pool_now` object, nullable: Graduated tokens whose PumpSwap pool is inside its first 30 minutes only (null otherwise): the live reserve, peak and pool_draining, with the rule and its measured rate. Context, not part of the verdict.
    - `graduation_timing` object, nullable: Graduated tokens only (null otherwise): launch to the first migration sighting and its instant_bundle / organic label, as on the free graduation list. Context, not part of the verdict.
    - `coverage` 'full', required
    - `age_s` number, nullable, required
    - `generated_at` string, required
    - `t` number, required
    - `result_id` string, required
    - `share_url` string, required: Free card page signed at purchase time; renders this verdict without recomputing or paying.
    - `fresh_verdict_url` string, required
    - `rule` string, required
    - `disclaimer` string, required
    - `links` object, nullable: Open this mint on pump.fun, DexScreener, Jupiter, GMGN, Axiom or Photon through a free redirect; no referral code, no fee.
      - `pumpfun` string, required
      - `dexscreener` string, required
      - `jupiter` string, required
      - `gmgn` string, required
      - `axiom` string, required
      - `photon` string, required
      - `note` string, required
  - `meta` object, required

## Other responses

- `400`: Invalid mint list or cursor; unpaid.
- `402`: Payment required (x402 v2): header PAYMENT-REQUIRED = base64 of the body
- `404`: At least one requested mint lacks full live coverage; unpaid.
- `409`: Payment/request conflict, or original settlement outcome unknown. If charged=null, reconcile before authorizing another payment.
- `422`: Validation Error
- `429`: Request limit reached; retry after the Retry-After interval.
- `503`: Feed lag exceeds 5 s or checks unavailable; no new settlement. A retry-store failure reports charged=null if outcome is uncertain.

## Changes

- **2026-10-20** `5234c3adf39f`: 1 info
  - added the optional property `data/graduation_timing` to the response with the `200` status
- **2026-10-20** `eea099d70151`: 1 info
  - added the optional property `data/pool_now` to the response with the `200` status

[Operation history](https://skmtc.dev/loopholetape/apis/loophole-tape/changes/v1/verdict/:mint/get.md)

---

[API](https://skmtc.dev/loopholetape/apis/loophole-tape.md) · [All operations](https://skmtc.dev/loopholetape/apis/loophole-tape/llms.txt) · [OpenAPI document](https://skmtc.dev/loopholetape/apis/loophole-tape/revisions/5234c3adf39f?raw)
