# loophole tape > Real-time pump.fun / PumpSwap analytics for agents, derived from public on-chain activity and observed launch history. Pay per request in USDC on Solana mainnet with x402 v2 (exact scheme, PayAI facilitator, no account, no API key). 0.5-2.5 cents per call. Compact checks require full live coverage and feed lag <= 5 s; each response reports freshness. Base URL: https://api.loopholetape.com Payment: x402 v2, network solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp, asset USDC EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v, payTo 9HkwyUhDMyjbpSpnyu5xuZ9vRaFQeajnJsavhie7XcsT, facilitator https://facilitator.payai.network. Flow: GET a paid route -> 402 with header PAYMENT-REQUIRED (base64 JSON: accepts[], resource) and the same JSON in the body -> sign a USDC transfer after checking recipient, network, asset and amount against your budget with an x402 v2 client (Python or TypeScript examples in the public repo) -> retry with header PAYMENT-SIGNATURE -> 200 with header PAYMENT-RESPONSE (settlement). The facilitator pays the Solana fee; you only need USDC. Every response: {ok, schema_version: 2.0, generated_at, t, coverage: full|thin, data, meta{feed_lag_s, is_stale, last_slot, price_usd, next}}. Unavailable measurements are null; labels describe observations, not a guarantee of safety. ## Start with a compact risk check - Check your own mint list for free: GET /v1/check/coverage?mints=MINT1,MINT2 (MCP: check_coverage with mints array). - Buy one compact check: GET /v1/check/mint/MINT ($0.005; MCP: check_pumpfun_risk). Buy up to five: GET /v1/check/watchlist?mints=MINT1,MINT2 ($0.01 total; MCP: check_watchlist_risk). - Invalid arguments, missing full coverage or feed lag > 5 s are rejected before payment. Eligibility is checked again after verification and before settlement. - The five-second eligibility limit is checked at result generation, before settlement. Settlement/transit can add delay. meta.result_age_s and delivery-aged feed_lag_s/is_stale include settlement time; compare t with your own clock after receipt. - Initialize a free watch: GET /v1/check/watch?mints=... (MCP: watchlist_updates). Poll with its cursor every 15 s or slower. Only new documented flags or lifecycle transitions signal an update; individual trades and changing counts do not. - Pass that cursor to the paid check to buy new event details and receive an updated cursor. No new watched events returns 200 / a successful MCP result with data.status=no_new_events and charged=false, without payment. Omit cursor to purchase the current snapshot regardless of events. Cursors bind to the exact mint set and expire after 24 h. - Retry a lost paid response using the EXACT original PAYMENT-SIGNATURE (MCP: x402/payment) and original arguments on the same transport. For 10 min the original result and receipt are replayed without a second settlement. meta.replayed/result_age_s and aged feed_lag_s identify cached data. An optional payment-identifier is supported; an identifier alone cannot recover a result. - payment_outcome_unknown (charged=null) means stop and reconcile the original transaction before authorizing another payment. Do not repeatedly create new signatures after a timeout. - Budgeted Python and TypeScript clients: https://github.com/gosadu/loophole-tape. Full risk card remains $0.025; existing free tools remain free. ## Paid resources (GET, JSON) - [GET /v1/mint/:mint](https://api.loopholetape.com/v1/mint/{mint}): $0.025 USDC. Risk card for one pump.fun mint (live microstructure or thin on-chain card). Path: mint (base58 SPL mint address (32-44 chars); pump.fun mints usually end in 'pump'). Handler latency estimate in ms (excludes payment): {'full': 15, 'thin': 300}. Freshness: {'full': 2, 'thin': 1} s. MCP tool: mint_risk_card. - [GET /v1/launches/recent](https://api.loopholetape.com/v1/launches/recent): $0.01 USDC. Recent pump.fun launches with compact risk labels. Query: limit (optional), max_age_s (optional), exclude_mayhem (optional), min_rs (optional), only_alive (optional). Handler latency estimate in ms (excludes payment): {'full': 25}. Freshness: {'full': 2} s. MCP tool: recent_launches. - [GET /v1/rugs/recent](https://api.loopholetape.com/v1/rugs/recent): $0.02 USDC. Recent rug / close flags with mechanism labels. Query: limit (optional), window_s (optional). Handler latency estimate in ms (excludes payment): {'full': 10}. Freshness: {'full': 2} s. MCP tool: recent_rugs. - [GET /v1/graduations/recent](https://api.loopholetape.com/v1/graduations/recent): $0.02 USDC. Recent migrations labelled true graduation vs below-threshold close. Query: limit (optional), window_s (optional). Handler latency estimate in ms (excludes payment): {'full': 15}. Freshness: {'full': 2} s. MCP tool: recent_graduations. - [GET /v1/creator/:address](https://api.loopholetape.com/v1/creator/{address}): $0.02 USDC. Creator reputation over our full launch history. Path: address (base58 wallet address). Handler latency estimate in ms (excludes payment): {'full': 20}. Freshness: {'full': 2} s. MCP tool: creator_reputation. - [GET /v1/wallet/:address](https://api.loopholetape.com/v1/wallet/{address}): $0.02 USDC. Wallet class from our rolling PnL leaderboard + live holdings. Path: address (base58 wallet address). Handler latency estimate in ms (excludes payment): {'full': 20}. Freshness: {'full': 2} s. MCP tool: wallet_profile. - [GET /v1/rhc/launches/recent](https://api.loopholetape.com/v1/rhc/launches/recent): $0.01 USDC. Robinhood Chain (Pons V2) recent launches with holder / route / cluster structure. Query: limit (optional), max_age_s (optional), pair (optional), only_live (optional), min_buys (optional). Handler latency estimate in ms (excludes payment): {'full': 60}. Freshness: {'full': 3} s. MCP tool: rhc_recent_launches. - [GET /v1/rhc/curve/:address](https://api.loopholetape.com/v1/rhc/curve/{address}): $0.02 USDC. Robinhood Chain (Pons V2) curve structure card for one curve or token address. Path: address (0x-prefixed 40-hex Pons V2 curve OR token address on Robinhood Chain). Handler latency estimate in ms (excludes payment): {'full': 20}. Freshness: {'full': 3} s. MCP tool: rhc_curve_card. - [GET /v1/check/mint/:mint](https://api.loopholetape.com/v1/check/mint/{mint}): $0.005 USDC. Check one pump.fun mint for observed launch risks ($0.005). Path: mint (A pump.fun mint with full live coverage; check /v1/check/coverage first.). Query: cursor (optional). End-to-end payment latency is not benchmarked. Freshness: {'full': 5} s. MCP tool: check_pumpfun_risk. - [GET /v1/check/watchlist](https://api.loopholetape.com/v1/check/watchlist): $0.01 USDC. Check up to five pump.fun mints for $0.01 total. Query: mints (required), cursor (optional). End-to-end payment latency is not benchmarked. Freshness: {'full': 5} s. MCP tool: check_watchlist_risk. ## Free resources - [/v1/check/coverage](https://api.loopholetape.com/v1/check/coverage): free coverage and freshness check for one to five mints; quotes single and batch prices - [/v1/check/watch](https://api.loopholetape.com/v1/check/watch): free availability of new risk/lifecycle events for a watchlist; opaque cursor, no event details - [/](https://api.loopholetape.com/): this index - [/health](https://api.loopholetape.com/health): feed health: seconds behind the chain, last slot, mints tracked, counters - [/v1/market/regime](https://api.loopholetape.com/v1/market/regime): market-wide regime meter: launch rate, mayhem share, buy/sell flow, fail share, migrations vs true graduations, rug flags (free) - [/v1/sample/launches](https://api.loopholetape.com/v1/sample/launches): free 3-item sample of /v1/launches/recent, delayed >= 300 s - [/v1/sample/rugs](https://api.loopholetape.com/v1/sample/rugs): free 3-item sample of /v1/rugs/recent, delayed >= 300 s - [/v1/sample/mint](https://api.loopholetape.com/v1/sample/mint): free full risk card of one mint aged >= 300 s (the exact paid shape) - [/v1/x402/resources](https://api.loopholetape.com/v1/x402/resources): machine-readable list of paid resources: prices, payment terms, input schema, output example - [/v1/labels](https://api.loopholetape.com/v1/labels): semantics of every label, flag and field (coverage, status, risk_label, confidence, rug flags, history, rhc) - [/v1/rhc/regime](https://api.loopholetape.com/v1/rhc/regime): Robinhood Chain (Pons V2) regime meter: launches/h, graduations/h and rate, median launch-to-graduation seconds, curve buys/sells per minute, unique buyers (free) - [/.well-known/x402](https://api.loopholetape.com/.well-known/x402): x402 discovery manifest (IETF draft-hawkins-x402-dns-discovery + x402scan shapes) - [/openapi.json](https://api.loopholetape.com/openapi.json): OpenAPI 3 schema with x-payment-info per paid operation - [/llms.txt](https://api.loopholetape.com/llms.txt): plain-text description for LLM agents (llms.txt convention) - [/mcp](https://api.loopholetape.com/mcp): MCP server (streamable HTTP, stateless, JSON responses); paid tools use x402 over MCP - [/terms](https://api.loopholetape.com/terms): terms of use ## MCP - [MCP endpoint](https://api.loopholetape.com/mcp): streamable HTTP, stateless, JSON responses. Tools: catalog, health, market_regime, sample_mint, rhc_regime, check_coverage, watchlist_updates (free); mint_risk_card, recent_launches, recent_rugs, recent_graduations, creator_reputation, wallet_profile, rhc_recent_launches, rhc_curve_card, check_pumpfun_risk, check_watchlist_risk (paid, x402 over MCP: the first call returns the PaymentRequired as an isError result; pay and retry with _meta['x402/payment']). Registry id io.github.gosadu/loophole-tape. ## Label semantics - coverage: full = the mint is inside our live window (created while our capture was up, still tracked): every field is computed from our own per-event tape, typically < 2 s behind the chain.; thin = the mint is not in the live window (older than ~2 h of silence, created during a capture gap, or not a pump.fun mint): the card carries only what can be computed now — our resolved launch record if we have one, the current on-chain mint + bonding-curve state read from RPC, the creator's prior, and market base rates. Fields we cannot compute are null with a reason. Never a guess. - status: live_curve = bonding curve still open (not complete, not migrated); curve_complete = the curve reported complete; migration to PumpSwap pending or unobserved; migrated_graduated = migrated to a pool AND the curve was witnessed at >= 84 SOL (a true graduation); migrated_below_grad = migrated to a pool without an observed curve balance of at least 84 SOL; classified as a below-threshold close; historical = outside the live window; status is our resolved record (graduated / rugged / terminal_rs); onchain_only = no live tape and no history; status is the current bonding-curve account as read from RPC; not_pump_fun = no pump.fun bonding curve exists for this mint - risk_label: rug_flagged = at least one rug/close flag fired (see rug_flags and flags for mechanism + first-seen time); mayhem = mayhem-class launch with 2B supply; this classification does not predict its outcome; concentrated = holder structure dominated by few wallets: top-5 >= 50% of supply, or create-slot bundle >= 25%, or insider share >= 20%; stalled = no new buyer for 30 s after the first 2 minutes, or zero buys in the last 60 s past 2 minutes of age; active = none of the above fired at generation time; unknown = not enough data to label (thin coverage) - confidence: meaning = how much data the label rests on at generation time (coverage, trade count, feed lag) — NOT a measure of predictive accuracy; no label on this API is a forecast; high = full coverage, >= 20 trades observed, feed < 5 s behind the chain; medium = full coverage with 5-19 trades, or feed 5-30 s behind; low = thin coverage, or < 5 trades, or feed > 30 s behind — treat labels as weak priors - caveats: same_block_direct_cluster_share = wallets that bought directly from the curve in the same block as at least one other direct buyer; matching timing does not establish coordination or common ownership; terminal_buy_share = buys routed through terminal contracts (GMGN, Axiom, ...) — a route, not proof that a human placed the order; base_rates_vs_flags = base rates come from the RESOLVED history (rugged = >= 5 SOL peak then <= 25% of peak, or creator sold >= half); live rug_flags fire on partial evidence within seconds with their own thresholds — related, not the same measurement; labels = heuristics derived from public on-chain data; nothing here is a prediction or financial advice - rug_flags: creator_sold = the creator wallet sold tokens (share in flags.creator_sold.tokens_share); bundle_dumped = wallets that bought in the create slot have sold most of their tokens; curve_drained = curve SOL fell >= 80% from its peak (peak >= 1 SOL) before any migration; pool_drained = PumpSwap pool quote reserves fell >= 80% from the opening reserve; curve_closed_low = the curve completed below 84 SOL (a close, never a graduation); migrate_below_grad = a pool was created for a curve that never reached 84 SOL - history: graduated = 1 = the curve was observed at >= 84 SOL before migrating; this API uses observed reserves rather than the completion flag alone; rugged = 1 = DRAIN (curve held >= 5 SOL real and later fell to <= 25% of its running peak, before any migrate) or DEV DUMP (the creator sold at least half of its tokens); rug_dt_s = seconds after launch; terminal_rs = curve SOL when we stopped observing the mint (null = unresolved); peak_rs = highest curve SOL witnessed; dev_first_sell_dt_s = seconds after launch of the creator's first sell (null = never seen) - rhc: chain = Robinhood Chain, EVM chain id 4663 (eip155:4663), 100 ms blocks, FCFS sequencer; launchpad Pons V2 (constant-product curve, 4.2 ETH graduation); same_block_direct_cluster_share = share of circulating tokens held by wallets that bought DIRECTLY from the curve (not through a terminal router) in a 100 ms block where >= 2 direct buys landed; matching timing does not establish coordination or common ownership; terminal_holdings_share = share of circulating tokens held by wallets whose buys came through a terminal / aggregator router; routing does not identify a human or bot; router_join_resolved_share = share of buys linked to an observed sender address (direct buys, or router transactions joined to their sender); recent_flow = last_2s / last_6s count observed trade timestamps in (response time - window, response time]; new buyers count each resolved wallet's first observed buy. Timestamps use block time when present, otherwise receipt time. Counts expire without new events; a zero on a stale feed does not prove inactivity (check meta.is_stale); price_multiple_vs_launch = marginal curve price now / at launch for ETH-paired curves (constant product, virtual reserves 1.68 ETH / 1e9 tokens); null otherwise; snipe_tax = buys in the first 30 blocks (3 s) after launch pay a decaying tax; in_tax_window flags that period; status = live_curve | curve_complete (CurveCompleted seen) | graduated (PoolGraduated seen) | unknown (address not in our launch window); coverage = full = launched inside our event window, every trade observed; thin = launch facts + lifecycle only (older than the trade-retention window or launched before the window opened) - risk_checks: scope = pump.fun mints with full live coverage; all requested mints required; feed lag <= 5 s at evaluation; status = flags_observed = documented flags exist; no_flags_observed = none of those flags observed, not a safety verdict; insufficient data is unpaid; evidence = first_seen_at is the flag's original observation time; snapshot_slot is the overall snapshot slot, not necessarily the flag's event slot; watch = cursor advances for first-observed creator_sold, bundle_dumped, curve_drained, pool_drained, curve_closed_low, migrate_below_grad flags or lifecycle transitions; it does not report every trade, concentration change or flow fluctuation; cursor = opaque, bound to the exact set of mints, valid for 24 h; free watch initialization establishes a baseline; a paid check returns an updated cursor; retry = retry the exact signed payment and original arguments within 10 min to recover its original result; a replay is marked and its freshness ages; an uncertain settlement is reported explicitly and must be reconciled before another purchase ## Data sources and definitions - Solana source: public Solana on-chain activity and observed pump.fun / PumpSwap launch history. - Robinhood Chain source (rhc routes): public Robinhood Chain Pons V2 events and transactions. - Graduation = the curve observed at >= 84 SOL before migration; a completion or pool below that threshold is classified as a close. - Rug = drain (curve held >= 5 SOL and fell to <= 25% of peak before migrating) or dev dump (creator sold >= half); flags carry first-seen times. - coverage=thin cards (mints outside the live window) carry only our resolved record, the live on-chain bonding-curve state read from RPC, the creator prior and market base rates; confidence is low by construction. - Discovery: /.well-known/x402 (IETF x402 dns-discovery draft + x402scan shape), /openapi.json (x-payment-info), /v1/x402/resources. - Terms: https://api.loopholetape.com/terms. Nothing here is financial advice; labels are statistics, not guarantees.