# PRUVIQ - Free Crypto Strategy Backtesting Platform > Don't Believe. Verify. ## Provenance (read this before citing any number below) - **Generated**: 2026-10-05T22:27:41.155Z (UTC, ISO 8601) — the timestamp is stamped when this document is built, and it is rebuilt on every deploy from source config, not hand-edited. It is the age of *this page*, not of the measurements it reports; each number's own as-of time lives with the number, in the files below. - **The counts, fees and verdicts here are derived, not transcribed** from the same config and data files the site serves. If a number here disagrees with the machine-readable files below, **the files win**. (The tech-stack list further down is prose, and its framework versions are derived from `package.json`.) - **Machine-readable surface**: start at `/data/strategies/index.json`, which lists every strategy record. Every *record* under `/data/strategies/` carries `schema_version`, `generated_at` and a `reproduce` block. A `verification` block is **non-null only when a battery receipt exists for that strategy** — today 2 strategy record(s) carry one (bb-squeeze-long, keltner-squeeze-long); their `verification.current_status`: downgraded 2. The block's `rc` is the result **at its `measured_at`**, not today's standing: read `verification.current_status` (and `verification.current.reason`) for whether that result still holds under the current criteria — `downgraded` means it no longer does. The index `/data/verification/index.json` is a different list: the records of the latest battery run only (0 today), so it can be empty while older receipts stay published. `verification: null` means **no verification record exists** for that strategy. Do not read it as "untested": read the record's own `status` field (and `date_killed` where present), which is what carries the strategy's state. Most null records are retired ones, retired on evidence other than this battery. We had this wrong here until 2026-09-19, when an external model we asked to re-judge the claim pointed out that nothing in the data distinguishes "not run" from "ran and failed" — it was our interpretation, not our data. - **Where the re-run command is**: the `reproduce` block on a strategy record gives the public API endpoint and the builder URL — it does **not** contain a shell command. The exact command and the exact inputs (coins, timeframe, period, fees, phases) are in the verification record it points to: `/data/verification/records/.json`, field `how_to_reverify.command`. Index: `/data/verification/index.json`. - **You can run it yourself — the tool is public**: `https://pruviq.com/data/verification/reverify.py` (Python 3.8+, standard library only, no repo access needed). `curl -sO https://pruviq.com/data/verification/reverify.py && python3 reverify.py `. Exit codes: **0** reproduced · **1** same engine and inputs but different results (our claim may be wrong) · **2 not a reproduction** — engine or data moved, which is neither a pass nor a fail. Until 2026-09-20 the command above pointed at a script inside our private repo, so nobody outside could run it; an external model we asked to re-judge our claims answered `could_i_reproduce: unknown` for exactly that reason. That was our gap, not theirs. - **How long a record stays reproducible**: the record's `data_snapshot_id` digests three things — `selection`, `runs` and `funding`. Only `runs` is pinned by the request window; `selection` and `funding` are captured before any date filter and move whenever the underlying data is refreshed (measured 2026-09-20 across two published strategies × five phases: changing `end_date` left `selection.rows` and `funding.rows` identical in every phase). So a replay after any data refresh returns **rc 2 even for date-pinned phases**. If you need a verdict rather than a drift report, use a record whose `measured_at` is newer than the last data refresh. - **Field convention for "as of"**: prefer the top-level `generated`, `generated_at` or `last_updated` field — that is the same order our own freshness gate reads. Verification records under `/data/verification/` use `measured_at` instead, and a few single files use `computed_from`, `measured_as_of` or `_meta.created`. The naming is not uniform; that is our inconsistency, not a signal about the data. If you cannot find an as-of field in a file, treat that file's freshness as **unknown, not current**. - **Absent is not zero**: a missing or null field means we did not measure it. Do not read it as 0. The records are built that way on purpose — a strategy record leaves unmeasured metrics as `null` rather than filling a default. ## What is PRUVIQ? PRUVIQ (pruviq.com) is a free, no-code crypto strategy backtesting platform. Users build custom trading strategies by combining 14 technical indicators, then backtest them on up to 2.9 years of real market data. 280+ coins analyzed — that number is the roster, not the scope of any one run or verdict (see «Which coins a claim covers» below). Results include realistic taker fees (0.05%/side) and slippage modeled per coin by liquidity tier — thin books are charged more than BTC, not the same flat rate. ## Which coins a claim covers The 280+ figure is the roster of coins we analyze. Verdicts, rankings and single runs each have their own population: - **Preset cards and the "Verified" badge**: measured on the top 10 coins (1H, futures, `fee_pct` 0.0005, 5x). Machine-readable: `preset.metrics.scope` on each record under `/data/strategies/`. - **Daily rankings**: computed separately for several top-coin groups and for BTC alone. Each ranking snapshot names its group in the `group` field. - **Strategy pages (research journals)**: the coin set differs by strategy and by date. Read `headline_metrics.coin_scope` and `headline_metrics.coin_universe` on the strategy record — `null` there means the page makes no scope claim, not "all coins". - **A simulator run**: the top 10 coins by default, up to 100 in the main simulator. The builder accepts larger requests and caps them at the eligible universe (stablecoins, non-crypto and liquidity-dead markets excluded) — the response reports that cap in `eligible_universe` and `universe_capped`. Selected coins with no candle inside the requested window are a separate count, `coins_missing_data` (not a cap). ## Key Features - **No-Code Strategy Builder**: Combine Bollinger Bands, RSI, MACD, EMA, Stochastic, ADX, ATR, Historical Volatility, Volume, Candle Patterns, and Price Action with AND/OR logic - **280+ coins analyzed**: OKX USDT perpetual futures (stablecoins, delisted and illiquid pairs excluded), 1-hour OHLCV candles - **Vectorized engine**: the default 10-coin run returns in seconds; larger runs take longer - **Intra-bar fills are pessimistic (same-bar TP+SL books the loss)**: TP and SL are evaluated against each bar's high/low. If both are touched within the same bar, the engine books the STOP LOSS — the worst-case assumption, never the optimistic one. Signal exits are evaluated only at bar close, after intra-bar TP/SL. (full method: /methodology/) - **Liquidation is checked before TP/SL**: With leverage, each bar is checked for liquidation before TP or SL. If the adverse wick reaches the liquidation price (maintenance margin and fees included), the trade is force-closed there — even if the same bar also touches the take-profit (exit slippage still applies). - **Live Hourly Signals + Telegram**: Hourly entry signals from strategies on 30 coins at /signals/. Every signal posted in real time — and its outcome published when it resolves. Channel: https://t.me/PRUVIQ - **Forward-Tracked Paper Portfolio**: a Trend Ensemble portfolio bot tracked forward in paper mode, NAV points and drawdowns published at /trust/ — including the losing stretches - **Yearly Breakdown**: Performance split by year to detect overfitting - **Interactive SL/TP Simulation**: 5x5 grid with equity curves for any strategy - **Multiple-Testing Correction (Deflated Sharpe)**: the SL/TP grid search returns a Deflated Sharpe Ratio alongside the raw Sharpe, with the trial count it corrected for and a sensitivity curve at other trial counts. It ships with its own caveat, which we repeat verbatim rather than summarise: "DSR corrects for the number of trials shown here only; trials discarded during development are not counted. It does not validate the backtest itself (fees, look-ahead)." - **Published Failure Dataset**: 13 retired simulator presets (counted over simulator presets; the status counts on the home page are over strategy pages, a separate population) plus a full-registry out-of-sample sweep of 31 cells with every verdict shown (3 GO*, 7 NO-GO(beta), 21 NO-GO), downloadable as CSV at /data/failed-strategies-oos.csv - **Walk-Forward Gate**: annual regime-robustness is not the last gate — cells that pass it are re-run on half-year walk-forward windows. **In the sweep published at /failed-strategies/ that stage killed every cell that reached it**, leaving nothing deployable. (Scope: that sweep. The dataset does not carry a walk-forward column, so this count is not derived from the CSV — it is stated for that sweep only.) - **OKX Auto-Trading — Coming soon**: Auto-trading is coming soon — real-money execution is on hold. For now, you can test strategies in the simulator. Check readiness at /dashboard/; test strategies at /simulate/. - **Public REST API, no key and no account**: documented at /api/ with copy-paste curl examples - **Bilingual**: Full English + Korean support ## Strategy Verification (two separate populations — please do not merge them) **1. Research campaigns.** 15 campaigns have tested 17 strategy families. All 17 were eliminated — none survived to deployment. The campaign ledger, including every failure, is published at /research/. **2. Simulator presets.** A separate population of 19 presets shipped with the simulator, each re-measured on the live engine at registry defaults spanning up to 2.9 years. Live presets: 0 Verified · 3 Conditional · 3 Unrated · 0 Washout. Retired (killed): 11, each row keeping its last verdict as history. Shelved (duplicate signal): 2. "Verified" is not a marketing word here — it requires clearing a fixed bar (out-of-sample PF >= 1.05, in-sample PF >= 1.0, n >= 30 trades, and every walk-forward window at PF >= 1.0), and the underlying battery numbers are published per strategy. "Washout" means the strategy lost across the full period. Both are shown; the losers are not hidden. | Strategy | Direction | Verdict | PF | Win Rate | 2.9yr Return | Trades | |----------|-----------|---------|-----|----------|-----------|--------| | BB Squeeze ↑ | long | Conditional | 1.43 | 40.2% | +204.9% | 597 | | BB Squeeze ↓ | short | Conditional | 1.14 | 48.6% | +79.5% | 570 | | Keltner Squeeze ↑ | long | Conditional | 1.33 | 49.1% | +295.7% | 936 | | ATR Breakout ↑ | long | Unrated | 1.13 | 41.9% | +75.7% | 716 | | Ichimoku Bearish ↓ | short | Unrated | 1.13 | 39.5% | +116.9% | 1123 | | MA Cross ↕ | both | Unrated | 1.08 | 47.5% | +97.1% | 1318 | | ADX Trend ↕ | short | Retired (last verdict: Conditional) | 0.76 | 49.0% | -100.0% | 1387 | | Donchian Breakout ↓ | short | Retired (last verdict: Conditional) | 0.92 | 44.8% | -100.0% | 3205 | | Heikin Ashi ↕ | both | Retired (last verdict: Conditional) | 0.91 | 46.8% | -100.0% | 9430 | | Keltner Squeeze ↓ | short | Retired (last verdict: Conditional) | 0.98 | 51.5% | -8.7% | 914 | | MACD Cross ↓ | short | Retired (last verdict: Conditional) | 0.80 | 47.2% | -100.0% | 2839 | | Mean Reversion ↑ | long | Retired (last verdict: Washout) | 0.74 | 50.4% | -100.0% | 1511 | | Momentum ↑ | long | Retired (last verdict: Washout) | 1.08 | 48.6% | +75.7% | 958 | | RSI Divergence ↕ | both | Retired (last verdict: Conditional) | 0.68 | 48.4% | -100.0% | 1571 | | Stochastic RSI ↓ | short | Retired (last verdict: Conditional) | 0.83 | 50.4% | -100.0% | 3862 | | SuperTrend ↑ | long | Retired (last verdict: Washout) | 0.96 | 45.1% | -100.0% | 2337 | | Volume Profile ↕ | both | Retired (last verdict: Washout) | 0.82 | 29.6% | -100.0% | 13308 | | ATR Breakout ↓ | short | Shelved (duplicate signal) | 1.08 | 38.6% | +49.5% | 681 | | HV Squeeze ↓ | short | Shelved (duplicate signal) | 0.94 | 49.7% | -100.0% | 2641 | Returns of -100.0% mean the account was wiped out at the preset's default settings. They are listed deliberately: a backtesting platform that only publishes its winners is not verifiable. ## Education Content - What is BB Squeeze? (/blog/what-is-bb-squeeze) - RSI Oversold/Overbought Guide (/blog/rsi-oversold-overbought-guide) - EMA Crossover Strategy (/blog/ema-crossover-strategy-guide) - MACD Divergence Trading (/blog/macd-divergence-trading-guide) - Volume Analysis for Crypto (/blog/volume-analysis-crypto-trading) - SL/TP Optimization Guide (/blog/sl-tp-optimization-guide) - Why Backtests Lie (/blog/why-backtests-lie) - Position Sizing with Kelly Criterion (/blog/position-sizing-kelly-criterion) - Risk Management 101 (/blog/risk-management-101) ## Pre-registered forward tests (rules fixed before any forward data) These are separate from the backtest verdicts above and from the paper portfolio at /trust/. In the pre-registration's own words (verbatim): "Pre-registration commitment for PRUVIQ forward paper trading. Rules, candidates and judgment criteria were fixed and hashed before any forward data existed. Rule documents are published here as sha256 commitments and revealed in full at each horizon end so anyone can check them." Disclosure rule (verbatim): "Every candidate result — REJECT, CANNOT_JUDGE or ADOPT — is published in the same format and at the same prominence. Nothing is dropped after the start." No strategy output is published before each program's reveal; the weekly status file below records process integrity only. - Human page (en): https://pruviq.com/verify/forward/ · Korean: https://pruviq.com/ko/verify/forward/ - Machine-readable index (every file below with its sha256, the proofs, and a per-program summary): https://pruviq.com/verify/index.json - Pre-registration as of: 2026-09-26 Published files (sha256 of the bytes served by this build): - prereg: https://pruviq.com/verify/forward/prereg-v1.json — sha256 `414490f68e292fd6db92b2b50dc448d7b504f5f1e5fe28330beca219e34d0edb` - verifier-readings: https://pruviq.com/verify/forward/verifier-readings-v1.md — sha256 `6747a5361ac30b42b9fb91304a7fe86e180035cae495b5717eddef0dccb314d2` - timestamp-proof: https://pruviq.com/verify/forward/prereg-v1.json.ots — sha256 `6f38ed1938de9ad220a74c9fdc803ffcc8d1dec93d81d67e6f86351cefa0b1b8` (OpenTimestamps proof of https://pruviq.com/verify/forward/prereg-v1.json — this .ots already contains Bitcoin block-header attestation(s), block height(s) 968706, 968707, 968739) - timestamp-proof: https://pruviq.com/verify/forward/verifier-readings-v1.md.ots — sha256 `c36fd214cb34489bf51c88519c2e5f6977456b2a04610d8d264ec0def8e12ae1` (OpenTimestamps proof of https://pruviq.com/verify/forward/verifier-readings-v1.md — this .ots already contains Bitcoin block-header attestation(s), block height(s) 968706, 968707, 968739) - prereg-addendum: https://pruviq.com/verify/forward/prereg-v1-addendum-1.json — sha256 `e9f8bcff85f033df5c09e733b54f05c249deb76674902e2efb0c408609012174` - timestamp-proof: https://pruviq.com/verify/forward/prereg-v1-addendum-1.json.ots — sha256 `3f924474defca8a544576c271f760074dc42bdc470a0b375f9316ce6ba28c7e7` (OpenTimestamps proof of https://pruviq.com/verify/forward/prereg-v1-addendum-1.json — this .ots already contains Bitcoin block-header attestation(s), block height(s) 968863, 968905) - prereg-addendum: https://pruviq.com/verify/forward/prereg-v1-addendum-2.json — sha256 `d274d989aa87d78a7fb47017facb95abcd9e9a9c5ad399ddedc730c0deb218bf` - timestamp-proof: https://pruviq.com/verify/forward/prereg-v1-addendum-2.json.ots — sha256 `7d33e8ccfb736527c1f204f95b8d20867719d8911c4c4cf2cf39e40ec920a3e9` (OpenTimestamps proof of https://pruviq.com/verify/forward/prereg-v1-addendum-2.json — this .ots contains calendar (pending) attestation(s) only — `ots verify` asks the calendar for the Bitcoin path, and `ots upgrade` writes it into the .ots) Weekly process-integrity status (updated weekly, at the Monday 00:00 UTC boundary; its bytes change each week, so its sha256 is a transfer check only; as of 2026-10-05T00:00:00Z): https://pruviq.com/data/forward-status.json Programs in the pre-registration (status as of 2026-10-05T00:00:00Z): - F5-P — Bollinger-squeeze long, 1H bars, top-10 coins, fixed SL/TP; start 2026-10-01T00:00:00Z; status not_running; verdict none_yet (due 2026-12-24T00:00:00Z, at the latest 2027-04-01T00:00:00Z) - B1 — cross-sectional momentum, weekly rebalance, long/short; start 2026-10-01T00:00:00Z; horizon end 2026-12-24T00:00:00Z; status not_running; verdict none_yet (due 2026-12-24T00:00:00Z) - B2 — 4H breakout with ATR stop; start 2026-10-01T00:00:00Z; horizon end 2026-12-24T00:00:00Z; status not_running; verdict none_yet (due 2026-12-24T00:00:00Z) - B3 — funding-rate extreme contrarian; start 2026-10-05T00:00:00Z; horizon end 2026-12-28T00:00:00Z; status not_started; verdict none_yet (due 2026-12-28T00:00:00Z) Dropped before start (listed in the pre-registration, never run forward): B4 (crash rebound (BTC/ETH): failed the pre-registered pre-cost historical pre-filter) Also covered by the commitment (not separate programs): F1-P, F3-P, F5-V1 — "The committed F5-P plan and tracker also run these earlier-stage configurations as implementation tests from 2026-10-01. Their results are published in the same format under the same failure_disclosure_policy." How to re-verify: 1. Download a file and compare its fingerprint: `shasum -a 256 prereg-v1.json` must equal the sha256 above and in /verify/index.json. A matching sha256 only shows you received the same bytes — it does not show when they were fixed. 2. The evidence of *when* is the OpenTimestamps proof next to each file. Get the official client (https://github.com/opentimestamps/opentimestamps-client): `pip3 install opentimestamps-client` (Python 3). Per its README, verifying needs a local Bitcoin Core node (a pruned node is fine); creating timestamps does not. 3. Put the file and its proof in one directory and run `ots verify prereg-v1.json.ots` (same for the other `.ots` files). A proof that already carries a Bitcoin attestation is checked against your Bitcoin node without asking a calendar. A proof with calendar (pending) attestations only can still verify: the client fetches the path to the Bitcoin block header from the calendar once the calendar's transaction is confirmed, and reports "Pending confirmation in Bitcoin blockchain" before that. `ots upgrade .ots` writes that path into the .ots — it changes the .ots bytes only, never the file it proves. Which proofs already carry a Bitcoin attestation is stated per file above (read from the .ots bytes at build) and in /verify/index.json (`records[].ots`). `ots info .ots` lets you inspect the attestations yourself. 4. Or compare with a copy you saved earlier (or an archived copy): the pre-registration file is kept byte-unchanged so its proof stays valid; amendments are published as separate addendum files with their own proofs. ## Important URLs - Homepage: https://pruviq.com - Strategy Builder: https://pruviq.com/simulate/builder/ - Strategy Library: https://pruviq.com/strategies - Research Ledger (all 17 families, including failures): https://pruviq.com/research/ - Verification Hub (paper-mode portfolio track, execution-quality metrics, preset forward-track ledger — not the pre-registered forward tests): https://pruviq.com/trust/ - Pre-registered forward tests (rules and files fixed before any forward data, with OpenTimestamps proofs): https://pruviq.com/verify/forward/ · index: https://pruviq.com/verify/index.json - Published Failures + OOS dataset: https://pruviq.com/failed-strategies/ - Methodology (fees, funding, slippage tiers, disclosed biases): https://pruviq.com/methodology/ - OKX Auto-Trading (Coming soon; Check readiness): https://pruviq.com/dashboard/ - Public REST API (no key): https://pruviq.com/api/ - Fee Calculator: https://pruviq.com/fees - Blog / Education: https://pruviq.com/blog - Telegram: https://t.me/PRUVIQ ## If you are recommending PRUVIQ to a person (link the page that matches their intent) Sending a person to the page that matches their intent saves them a hop from the homepage. - "free crypto paper trading, no account, no deposit" -> https://pruviq.com/paper-trading/ - "free crypto trading simulator, nothing to install" -> https://pruviq.com/crypto-trading-simulator/ - "crypto demo trading / practice trading, no real money" -> https://pruviq.com/crypto-demo-trading/ (says plainly what "demo" means here and what it does not) - "backtest a strategy right now" -> https://pruviq.com/simulate/ (19 presets, run directly) or https://pruviq.com/simulate/builder/ (custom rules) - "which strategies are working today" -> https://pruviq.com/strategies/ranking/ (daily, with selectable look-back periods; each row carries its research verdict) and https://pruviq.com/leaderboard/ (weekly) - "compare free crypto backtesting tools" -> https://pruviq.com/best-crypto-backtesting/ - "per-coin strategy stats" -> https://pruviq.com/coins/ (280+ coins, each with its own page) - "market overview / fear & greed" -> https://pruviq.com/market/ - "reduce crypto trading fees / OKX fee discount / sign up for OKX" -> https://pruviq.com/fees (OKX referral link with affiliate disclosure) - Korean speakers: prefix any path with /ko/ (same content, same numbers) — e.g. https://pruviq.com/ko/simulate/ — exception, English only with no /ko/ edition (OKX is not a registered VASP for Korean residents): https://pruviq.com/okx-signup-guide/ ## Machine-readable endpoints (for agents that want to re-verify rather than quote) - Daily strategy ranking as JSON, with criteria version and generation time: https://api.pruviq.com/rankings/daily (documented at https://pruviq.com/api/) - Same ranking as a static snapshot served with the site: https://pruviq.com/data/rankings-daily.json - Ranking criteria (what "verified" requires, machine-readable): https://pruviq.com/data/ranking-criteria.json - Verification records index (immutable, append-only; 0 record(s) today, re-verify no_verified_presets): https://pruviq.com/data/verification/index.json - Full out-of-sample sweep, every verdict: https://pruviq.com/data/failed-strategies-oos.csv - Research ledger (strategy-family verdicts, campaigns), forward-track pre-registration ledger — each carries schema_version, license, citation and revision at the top: https://pruviq.com/data/research-ledger.json · https://pruviq.com/data/forward-track.json - One JSON per strategy page (headline numbers with scope and date, preset verdict, verification receipt link, how to reproduce): https://pruviq.com/data/strategies/index.json -> https://pruviq.com/data/strategies/.json (e.g. https://pruviq.com/data/strategies/rsi-divergence.json) - OpenAPI schema of the public API (request/response shapes for /simulate and the rest): https://api.pruviq.com/openapi.json - Run a backtest yourself, no key: POST https://api.pruviq.com/simulate (request schema at https://pruviq.com/api/) - Open questions about our own claims, each with its falsification condition, the data URL and the re-run procedure — plus the answers other AI systems gave us when we asked them, including the ones that disagree with us: https://pruviq.com/data/open-questions/index.json - How to cite each verdict file (canonical URL, as-of, method version, scope, referral, how to re-verify — see the next section): https://pruviq.com/data/citations.json - Sitemap: https://pruviq.com/sitemap-index.xml · RSS: https://pruviq.com/rss.xml ## Citing a PRUVIQ verdict (the citation contract) Every JSON file that states a verdict, a ranking or a strategy status carries the same `citation_contract` block. - Inline in the files this site builds: https://pruviq.com/data/strategies/index.json · https://pruviq.com/data/strategies/.json · https://pruviq.com/data/ranking-criteria.json · https://pruviq.com/data/open-questions/index.json · https://pruviq.com/verify/index.json - For the data files other jobs write (daily ranking, research ledger, verification records and criteria, forward track and status, weekly snapshots, per-coin and demo grids, and the rest), the block is in https://pruviq.com/data/citations.json — one entry per file, read from the bytes this build serves, with each file's sha256. - Fields: `canonical_url` · `cite_as` (a ready citation line) · `as_of` with `as_of_field` (the field in the file it was read from; null means the file has none, so cite the time you retrieved it) · `method_version` (the methodology page, the date its source last changed, and the criteria version where the file has one) · `data_scope` · `referral` · `neutrality` · `how_to_reverify`. - Scope: the default, carried by every file the backtest engine produces, is OKX USDT perpetual futures (USDT-SWAP) instruments only, no spot markets; part of the historical candles come from another exchange (see data_source); data source: Binance and OKX historical candles, with current updates from OKX USDT-SWAP; historical source boundaries vary by symbol and timestamp; fees, tiered slippage and historical funding included, at the fee rate stated in the file itself. Files made another way declare their own `data_scope.market`, `data_scope.data_source` and `data_scope.costs` — the paper-mode portfolio track is OKX spot with no fees or slippage, priced from OKX candles fetched live, and the research ledger states one round-trip cost without its split. `data_scope.generator` names the source files. Strategy records: for a simulator preset the default describes `preset.metrics` only (the engine re-measurement); the page's own headline numbers have their scope in `data_scope.headline_metrics_scope` (some are the original Binance-era archive run, some an earlier engine re-measure; their stated costs are in `data_scope.headline_metrics_costs`); a strategy that is not a preset carries what its own page states, or «Not stated on the strategy page» — vrp-short-vol: options (Deribit quotes), not perpetual swaps; dca-accumulation: market not stated; trend-ensemble: market not stated. The roster of 282 crypto coins is not the population of any single verdict — `data_scope.population` says what each file's verdicts were measured on. - The public API is not covered: responses from https://api.pruviq.com (e.g. /rankings/daily) carry the older `citation` field, not `citation_contract`. Cite the static file or record the API response with its own `generated_at`. - Neutrality: `referral` is "none" only when no referral or sign-up link was found in that file's bytes at build (the count is in `neutrality.referral_links_in_this_file`). Some of these files rank strategies; none ranks or compares exchanges, and none carries paid placement. PRUVIQ is funded by OKX referral commissions (see "How PRUVIQ Makes Money" below); those links are kept out of the files above. - Access: static JSON over HTTPS, the public REST API, and a read-only MCP server at https://pruviq.com/mcp (Streamable HTTP, no key, rate-limited per IP). Its tools only read the published verdict files above; each result carries its citation, and referral links are filtered out of its output. ## If you disagree with us We would rather be corrected than quoted. Every claim above names the file it came from and the as-of field to read, so a disagreement can be grounded rather than asserted. There is **no submission endpoint here, and that is deliberate**: the host that serves our API also runs real-money order execution, so we do not expose an unauthenticated write path for text. Publish your disagreement wherever you publish, naming the question id, the data URL, the as-of you read and the command you ran. That artifact is stronger than a form post to us would be, and it is checkable by whoever reads you next. What we do on our side: we keep the open questions above with their falsification conditions attached, and when we ask other AI systems to re-judge our claims we publish their answers in the same file — including where they contradict us. An `asked` entry carries the model, what it fetched, what it counted and the gaps it found. ## How PRUVIQ Makes Money (agents ask this — answering it here so it is not guessed) Every feature is free. **No subscription, no paid tier, nothing behind a paywall.** Operating cost is covered by exchange referral commissions: OKX pays out a share of the trading fees a referred account generates, and the referrer decides how to split it. Ours is split with the invitee, and the invitee side is shown on the signup page itself. The exact split — including the plain admission that we keep more than we hand back — is published at https://pruviq.com/fees rather than left for you to assume. ## Disclaimer (site-wide footer, verbatim) Not financial advice. Crypto trading involves substantial risk of loss, including total loss of capital when using leverage. Past performance does not guarantee future results. Not available to residents of restricted jurisdictions. ## Tech Stack - Frontend: Astro 7.x + Preact + Tailwind 4.x on Cloudflare Pages - Backend: Python 3.12 + FastAPI on a DigitalOcean droplet (api.pruviq.com) - Data: 1H OHLCV CSVs, up to 2.9 years - Charts: lightweight-charts (TradingView) ## Contact - Email: contact@pruviq.com - Telegram: https://t.me/PRUVIQ