Properties
| Name | Type | Description |
|---|---|---|
| ok | boolean | |
| schema_version | string | |
| generated_at | string | |
| t | number | |
| coverage | string | |
| data | object | |
| meta | object |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/loopholetape-com/json-schema/loopholetape-com-verdict-schema.json",
"title": "VerdictEnvelope",
"x-generated": "2026-10-30",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/loopholetape-com-openapi.json#/components/schemas/Verdict",
"properties": {
"ok": {
"const": true,
"title": "Ok",
"type": "boolean"
},
"schema_version": {
"const": "2.0",
"title": "Schema Version",
"type": "string"
},
"generated_at": {
"title": "Generated At",
"type": "string"
},
"t": {
"title": "T",
"type": "number"
},
"coverage": {
"const": "full",
"title": "Coverage",
"type": "string"
},
"data": {
"properties": {
"mint": {
"title": "Mint",
"type": "string"
},
"verdict": {
"enum": [
"avoid",
"caution",
"no_flags_observed"
],
"title": "Verdict",
"type": "string"
},
"basis": {
"description": "Rule ids that fired; empty for no_flags_observed. The rule is published at /v1/labels.",
"items": {
"type": "string"
},
"title": "Basis",
"type": "array"
},
"reason": {
"title": "Reason",
"type": "string"
},
"probabilities": {
"anyOf": [
{
"properties": {
"model": {
"title": "Model",
"type": "string"
},
"calibration": {
"title": "Calibration",
"type": "string"
},
"horizon_s": {
"title": "Horizon S",
"type": "integer"
},
"rug_within_300s": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Rug Within 300S"
},
"true_graduation": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "True Graduation"
},
"rug_within_300s_reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Rug Within 300S Reason"
},
"true_graduation_reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "True Graduation Reason"
},
"reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Reason"
},
"rug_within_300s_basis": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Rug Within 300S Basis"
},
"base_rate_same_age": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Base Rate Same Age"
},
"recalibration": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Recalibration"
},
"diagnostics": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Diagnostics"
},
"features_used": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Features Used"
}
},
"required": [
"model",
"calibration",
"horizon_s"
],
"title": "Probabilities",
"type": "object"
},
{
"type": "null"
}
],
"description": "The calibrated numbers exactly as the compact check publishes them."
},
"quote": {
"anyOf": [
{
"properties": {
"asset": {
"description": "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).",
"enum": [
"sol",
"usdc",
"pyusd",
"stock",
"other",
"unknown"
],
"title": "Asset",
"type": "string"
},
"mint": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The quote_mint the bonding-curve account holds (the all-zero default 11111111111111111111111111111111 on SOL curves); null when not read.",
"title": "Mint"
},
"modelled": {
"description": "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).",
"title": "Modelled",
"type": "boolean"
},
"is_sol": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "true = SOL-quoted, false = quoted in another asset, null = not established yet.",
"title": "Is Sol"
},
"holder_rewards": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "The curve's is_holder_reward flag (pump.fun Holder Rewards: the creator fee goes to holders); null when the account was not read.",
"title": "Holder Rewards"
},
"basis": {
"description": "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.",
"enum": [
"curve_account",
"curve_stream",
"tape",
"none"
],
"title": "Basis",
"type": "string"
},
"evidence": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The tape evidence behind is_sol (/v1/labels quote.evidence).",
"title": "Evidence"
},
"reason": {
"anyOf": [
{
"const": "quote_not_modelled",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Set when modelled is false.",
"title": "Reason"
}
},
"required": [
"asset",
"modelled",
"basis"
],
"title": "Quote",
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "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)."
},
"odds_caveat": {
"title": "Odds Caveat",
"type": "string"
},
"reasons": {
"description": "Up to three observed flags, earliest first.",
"items": {
"properties": {
"code": {
"title": "Code",
"type": "string"
},
"text": {
"title": "Text",
"type": "string"
},
"first_seen_at": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "First Seen At"
},
"first_seen_after_launch_s": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "First Seen After Launch S"
},
"evidence": {
"additionalProperties": true,
"title": "Evidence",
"type": "object"
}
},
"required": [
"code",
"text",
"first_seen_at",
"first_seen_after_launch_s",
"evidence"
],
"title": "VerdictReason",
"type": "object"
},
"maxItems": 3,
"title": "Reasons",
"type": "array"
},
"reasons_total": {
"minimum": 0,
"title": "Reasons Total",
"type": "integer"
},
"cohorts": {
"anyOf": [
{
"properties": {
"version": {
"const": "cohorts-1",
"title": "Version",
"type": "string"
},
"top1_share": {
"description": "Share of total supply held by the largest wallet in our ledger (the bonding curve and the mayhem agent are not holders).",
"title": "Top1 Share",
"type": "number"
},
"top10_share": {
"description": "Share of total supply held by the 10 largest wallets in our ledger (the bonding curve and the mayhem agent are not holders).",
"title": "Top10 Share",
"type": "number"
},
"union_share": {
"description": "Share of supply held by wallets in at least one cohort, each wallet counted once.",
"title": "Union Share",
"type": "number"
},
"slot_windows": {
"properties": {
"bundlers": {
"description": "Inclusive slot offsets from the create slot.",
"items": {
"type": "integer"
},
"maxItems": 2,
"minItems": 2,
"title": "Bundlers",
"type": "array"
},
"snipers": {
"description": "Inclusive slot offsets from the create slot; the upper end is basis.sniper_max_offset.",
"items": {
"type": "integer"
},
"maxItems": 2,
"minItems": 2,
"title": "Snipers",
"type": "array"
}
},
"required": [
"bundlers",
"snipers"
],
"title": "SlotWindows",
"type": "object"
},
"basis": {
"anyOf": [
{
"properties": {
"slot_ms": {
"description": "The protocol's target slot duration in the slot regime of the mint's create slot (/v1/labels cohorts.slot_regime).",
"title": "Slot Ms",
"type": "integer"
},
"slot_ms_measured": {
"description": "That regime's measured mean slot duration, from mainnet block times.",
"title": "Slot Ms Measured",
"type": "number"
},
"regime_from_slot": {
"description": "First slot of that regime.",
"title": "Regime From Slot",
"type": "integer"
},
"regime_from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Block time of that slot (null for the first regime).",
"title": "Regime From"
},
"regime_by": {
"description": "What the regime was read from.",
"enum": [
"create_slot",
"launch_time",
"current"
],
"title": "Regime By",
"type": "string"
},
"bundle_max_offset": {
"description": "N: bundlers are offsets 0-N.",
"title": "Bundle Max Offset",
"type": "integer"
},
"sniper_window_s": {
"description": "The sniper time window.",
"title": "Sniper Window S",
"type": "number"
},
"sniper_max_offset": {
"description": "K = round(sniper_window_s / slot_ms): snipers are offsets N+1..K.",
"title": "Sniper Max Offset",
"type": "integer"
},
"sniper_window_measured_s": {
"description": "When slot K starts after the create slot at the measured slot duration.",
"title": "Sniper Window Measured S",
"type": "number"
}
},
"required": [
"slot_ms",
"slot_ms_measured",
"regime_from_slot",
"regime_by",
"bundle_max_offset",
"sniper_window_s",
"sniper_max_offset",
"sniper_window_measured_s"
],
"title": "CohortBasis",
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "The slot regime the windows come from and the numbers derived from it (/v1/labels cohorts.basis)."
},
"unbooked_sol": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "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.",
"title": "Unbooked Sol"
},
"shares_complete": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "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.",
"title": "Shares Complete"
},
"sol_complete": {
"description": "True when every cohort SOL figure is exact; false names the reason in sol_reason.",
"title": "Sol Complete",
"type": "boolean"
},
"sol_reason": {
"anyOf": [
{
"enum": [
"tape_truncated",
"quote_not_sol",
"trades_unbooked",
"create_sol_unknown"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sol Reason"
},
"dev": {
"properties": {
"share_of_supply": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Tokens the cohort's wallets hold now / total supply (1B; 2B on a mayhem launch).",
"title": "Share Of Supply"
},
"n_wallets": {
"anyOf": [
{
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Wallets in the cohort, sold-out ones included.",
"title": "N Wallets"
},
"n_holding": {
"anyOf": [
{
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Wallets of the cohort still holding tokens.",
"title": "N Holding"
},
"buy_sol": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "SOL that entered the curve on the cohort's buys (fees paid outside the curve are not in it).",
"title": "Buy Sol"
},
"sell_sol": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "SOL that left the curve on the cohort's sells.",
"title": "Sell Sol"
},
"net_sol": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "buy_sol - sell_sol: negative when the cohort took out more SOL than it put in; null when sol_complete is false for it.",
"title": "Net Sol"
},
"wallets": {
"anyOf": [
{
"items": {
"properties": {
"wallet": {
"title": "Wallet",
"type": "string"
},
"share_of_supply": {
"description": "Tokens this wallet holds now / total supply.",
"title": "Share Of Supply",
"type": "number"
},
"first_slot_offset": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Slots after the create slot when the wallet's first tokens of this mint arrived; null when it never received any.",
"title": "First Slot Offset"
},
"net_sol": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "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.",
"title": "Net Sol"
},
"history": {
"anyOf": [
{
"description": "One wallet's history on OTHER pump.fun mints in our tape since the seam (the mint answered is never counted).",
"properties": {
"mints": {
"description": "Other pump.fun mints this wallet bought in our tape since 2026-09-27T00:18:34Z (the mint answered is never counted).",
"minimum": 0,
"title": "Mints",
"type": "integer"
},
"bundled": {
"description": "Of those, mints where its first tokens arrived in the create slot or the next one (the bundlers rule of the cohort block).",
"minimum": 0,
"title": "Bundled",
"type": "integer"
},
"quick_sells": {
"description": "Of those, mints it sold within 60 s of its first buy.",
"minimum": 0,
"title": "Quick Sells",
"type": "integer"
},
"settled": {
"description": "Of those, mints whose outcome labels have settled (/v1/labels, outcome).",
"minimum": 0,
"title": "Settled",
"type": "integer"
},
"rugged": {
"description": "Of the settled ones, mints labelled rugged_within_300s by the public rule.",
"minimum": 0,
"title": "Rugged",
"type": "integer"
},
"graduated": {
"description": "Of the settled ones, mints that truly graduated.",
"minimum": 0,
"title": "Graduated",
"type": "integer"
}
},
"required": [
"mints",
"bundled",
"quick_sells",
"settled",
"rugged",
"graduated"
],
"title": "WalletHistory",
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "This wallet's history on other pump.fun mints in our tape (mints, bundled, quick_sells, settled, rugged, graduated); null when the reputation is not ready (/v1/labels, reputation)."
}
},
"required": [
"wallet",
"share_of_supply"
],
"title": "CohortWallet",
"type": "object"
},
"maxItems": 10,
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Up to 10 of the cohort's wallets, largest holding first.",
"title": "Wallets"
},
"source": {
"enum": [
"tape",
"tape+funding_capture",
"unavailable"
],
"title": "Source",
"type": "string"
},
"reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Why the cohort's figures are null.",
"title": "Reason"
},
"n_funded_by_creator": {
"description": "Wallets in the dev cohort because our funding capture saw the creator fund them.",
"minimum": 0,
"title": "N Funded By Creator",
"type": "integer"
}
},
"required": [
"share_of_supply",
"source",
"n_funded_by_creator"
],
"title": "DevCohort",
"type": "object"
},
"bundlers": {
"properties": {
"share_of_supply": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Tokens the cohort's wallets hold now / total supply (1B; 2B on a mayhem launch).",
"title": "Share Of Supply"
},
"n_wallets": {
"anyOf": [
{
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Wallets in the cohort, sold-out ones included.",
"title": "N Wallets"
},
"n_holding": {
"anyOf": [
{
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Wallets of the cohort still holding tokens.",
"title": "N Holding"
},
"buy_sol": {
"anyOf": [
{
"type": "number"
},
{
# --- truncated at 32 KB (83 KB total) ---
# Full source: https://artifacts.apis.io/loopholetape-com/json-schema/loopholetape-com-verdict-schema.json
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/loopholetape-com-verdict"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.