---
title: "Check rug risk on up to five pump.fun memecoins, one payment"
method: GET
path: "/v1/check/watchlist"
tags: ["paid"]
---

# Check rug risk on up to five pump.fun memecoins, one payment

`GET /v1/check/watchlist`

## Request

- Base URL: `https://api.loopholetape.com`
- URL: `https://api.loopholetape.com/v1/check/watchlist`
- Auth: none required

Use when you watch two to five pump.fun memecoins and want one payment for all of them; for a single mint the $0.005 single check (GET /v1/check/mint) costs less. One payment checks one to five caller-selected pump.fun mints for observed creator exits, bundle selling, drains and migration state, each with calibrated P(rug within 5 min) and P(true graduation) (/v1/calibration), with compact holder concentration/flow measurements and timestamped evidence. Every mint must have full coverage and feed lag <= 5 s; an unavailable batch is unpaid. Optional cursor: no new watched events is unpaid. Use /v1/check/watch for free update availability. Price is $0.01 total, not per mint. Findings describe observations, not predictions. Exact signed-payment retry cache: 10 minutes. Each item also carries market (USD price, market cap = price x total supply as pump.fun and DexScreener show it, the curve's SOL liquidity in SOL and USD) and authorities (mint, freeze, metadata; the pump.fun program rule).

## Query parameters

- `mints` string, nullable
- `cursor` string, nullable

## Response `200`

Paid compact result or original receipt replay; an unchanged watch cursor returns an unpaid no_new_events result.

- RiskCheck
  - `ok` true, required
  - `schema_version` '2.0', required
  - `generated_at` string, required
  - `t` number, required
  - `coverage` 'full', required
  - `data` union, required
    - object
      - `status` 'flags_observed' | 'no_flags_observed', nullable, required: flags_observed = documented flags exist; no_flags_observed = none of them observed (not a safety verdict); null = the curve is not shown to be SOL-quoted (status_reason quote_not_modelled), so its SOL-denominated flags were not evaluated and no absence of flags is claimed.
      - `status_reason` 'quote_not_modelled', nullable
      - `result_id` string, required
      - `count` integer, required
      - `items` object[], required
        - `mint` string, required
        - `status` 'flags_observed' | 'no_flags_observed', nullable, required: flags_observed = documented flags exist; no_flags_observed = none of them observed (not a safety verdict); null = the curve is not shown to be SOL-quoted (status_reason quote_not_modelled), so its SOL-denominated flags were not evaluated and no absence of flags is claimed.
        - `status_reason` 'quote_not_modelled', nullable: Set when the curve is not modelled.
        - `quote` object, nullable: The curve's quote asset and whether our SOL-denominated flags, labels, verdict and odds are modelled for it (/v1/labels quote). modelled false = those are null with reason quote_not_modelled; structural fields stand.
          - `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.
        - `lifecycle` string, required
        - `risk_label` string, required
        - `findings` object[], required
          - `code` string, required
          - `first_seen_at` number, nullable, required
          - `evidence` object, required
        - `snapshot_slot` integer, nullable, required: Latest observed slot for this mint, not the slot of every finding.
        - `last_trade_at` number, nullable, required
        - `concentration` object, required
          - `top5_share` number, nullable, required
          - `dev_share` number, nullable, required
          - `bundle_share` number, nullable, required
          - `insider_share` number, nullable, required
        - `buyer_flow` object, required
          - `unique_buyers_60s` integer, nullable, required
          - `buys_60s` integer, nullable, required
          - `sells_60s` integer, nullable, required
          - `net_sol_60s` number, nullable, required
          - `inflow_stalled` boolean, nullable, required
        - `curve` object, required
          - `rs_sol` number, nullable, required
          - `peak_rs_sol` number, nullable, required
          - `drawdown_from_peak` number, nullable, required
          - `graduated` boolean, nullable, 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.
        - `probabilities` object, nullable
          - `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
        - `full_card_url` string, required
        - `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.
        - `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
      - `cursor` string, required
      - `watch_events` string[], required
    - object
      - `status` 'no_new_events', required
      - `changed` false, required
      - `count` 0, required
      - `items` unknown[], required
        - unknown
      - `cursor` string, required
      - `charged` false, required
      - `next_check_after_s` integer, 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.
- `410`: Watch cursor expired after 24 hours; initialize a new free watch or omit it for a fresh paid check.
- `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** `eea099d70151`: 1 info
  - added the optional property `data/anyOf[subschema #1: CheckData]/items/items/pool_now` to the response with the `200` status

[Operation history](https://skmtc.dev/loopholetape/apis/loophole-tape/changes/v1/check/watchlist/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/eea099d70151?raw)
