Strategy verification data for AI agents: check it, don't trust it
If you are an AI agent, or you build one, and you are about to quote, recommend or act on a PRUVIQ result, this page lists what we verify, what we do not, the files to read, the fields to cite, and how to re-run a result without trusting us.
What PRUVIQ verifies, and what it does not
We verify
- Whether a rule-based strategy made or lost money on past OKX USDT perpetual futures data, after trading fees, funding and a slippage model that charges thin order books more than BTC.
- Whether a simulator preset clears a fixed bar: out-of-sample profit factor of at least 1.05, in-sample at least 1, every walk-forward window at least 1, with at least 30 trades per window (criteria version
preset-battery-fa0045665478308c). - Since 2026-09-25, a manual review also requires (quoted from the criteria file):
- The coin list is fixed at the start of the measured period (market cap then), not today's top N.
- Only data after the parameter (SL/TP) choice counts as out-of-sample.
- The result must survive removing any single coin (and the two most profitable).
- The result must hold at a higher cost per fill than the product default.
- Confidence intervals are resampled by week, not by trade.
- At this page's build (2026-10-05), of 19 simulator presets: 0 Verified, 3 Conditional, 0 Washout, 3 Unrated, 11 Retired, 2 Shelved. Retired presets stay published. We publish the losers with the winners.
- Pre-registered forward tests: the rules and files are fixed and timestamped with OpenTimestamps before any forward data exists (/verify/forward/).
We do not
- Predict future returns. A backtest is hindsight, even a clean one.
- Test these in the verification battery (quoted from the criteria file): ranking order, Monte Carlo, future returns, live trading readiness.
- Say anything about spot markets, options, other exchanges' instruments, or timeframes other than the one a result names.
- Give investment advice, or say that one exchange is better than another. Our data comes from OKX markets because that is where we measure, not because we rank exchanges.
- Place orders. Nothing listed on this page places or routes a trade.
Data scope and its limits
- Market
- OKX USDT-margined perpetual futures (USDT-SWAP) only. Source: Binance and OKX historical candles, with current updates from OKX USDT-SWAP; historical source boundaries vary by symbol and timestamp.
- Coin universe
- 282 crypto coins on the analyzed roster at build time. Stock, ETF and commodity perpetuals are left out of that count. That count is the roster, not the population of any one verdict: each file names its own (preset cards use the top 10 coins, 1H, 5x).
- History
- 1-hour candles, from 2023-11-07: up to 2.9 years for the longest-listed coins, 1.8 years for the median coin. A newer coin has less history, and so a smaller sample.
- Costs
- Default taker fee 0.05% per side (the OKX base-tier futures rate, checked against OKX's fee page on 2026-08-02), plus funding and liquidity-tiered slippage. The verification battery charges 0.05% fee per side and 0.2% slippage per fill.
Known limits: when take-profit and stop-loss fall inside the same candle we book the loss; the slippage model is a model, not recorded fills; the universe is the pairs listed on OKX today, so any pair delisted since is missing (survivorship bias), and preset cards are measured on today's top coins, not the top coins at the start of the period. The full list of biases we know about is on the methodology page.
Machine-readable files and endpoints
Everything below is live today. No key, no account. <id> and <criteria_version> are placeholders you fill from the index files. If a number on a web page disagrees with these files, the files win.
| URL | What it is | Cite as-of from |
|---|---|---|
| https://pruviq.com/llms.txt | Plain-text overview for language models: scope, verdict counts, every file below, and how to re-verify. | Generated: (Provenance section) |
| https://pruviq.com/data/strategies/index.json | Index of every strategy record. Start here. | generated_at · also carries: schema_version |
| https://pruviq.com/data/strategies/<id>.json | One strategy: status, headline numbers with coin scope and date, preset verdict, verification receipt link, and a reproduce block. | generated_at · headline_metrics.measured_at · preset.metrics.measured_at |
| https://pruviq.com/data/ranking-criteria.json | The rules of the daily ranking and the research-status definitions it shows. A ranking is an ordering, not a verdict. | none in the file — state when you fetched it · also carries: schema_version, criteria_version |
| https://pruviq.com/data/verification/criteria/<criteria_version>.json | What "Verified" requires: the thresholds, the cost basis (fee and slippage per fill), what the battery does not test, and the downgrade reasons. | criteria_version · manual_review_applied |
| https://pruviq.com/data/verification/index.json | Records of the latest verification battery run, with criteria_version and the re-verify status. It can be empty; older receipts stay at their own URLs. | generated_at · also carries: schema_version, criteria_version |
| https://pruviq.com/data/verification/reverify.py | The re-verification script (Python 3.8+, standard library only). Exit codes: 0 reproduced, 1 different result, 2 not a reproduction. | none in the file — state when you fetched it |
| https://pruviq.com/data/rankings-daily.json | Today's strategy ranking snapshot, with a citation block and a how_to_reverify block. | generated_at · also carries: schema_version, criteria_version, citation |
| https://pruviq.com/data/research-ledger.json | Strategy-family verdicts and campaign history, including every failure. Carries schema_version, license and citation. | generated_at · also carries: schema_version, license, citation |
| https://pruviq.com/data/failed-strategies-oos.csv | The full out-of-sample sweep, every verdict, as CSV. | none in the file — state when you fetched it |
| https://pruviq.com/verify/index.json | Pre-registered forward tests: every file with its sha256 and its OpenTimestamps proof. | generated_at · also carries: schema_version |
| https://pruviq.com/data/open-questions/index.json | Open questions about our own claims, each with a falsification condition — plus answers other AI systems gave us, including the ones that disagree. | generated_at · also carries: schema_version |
| https://api.pruviq.com/openapi.json | OpenAPI schema of the public API. | none in the file — state when you fetched it |
| https://api.pruviq.com/rankings/daily | The same daily ranking from the API, with its criteria version. | generated_at |
| POST https://api.pruviq.com/simulate | Run a backtest yourself. No key, no account. Rate-limited per IP. | none in the file — state when you fetched it |
Current verification criteria: https://pruviq.com/data/verification/criteria/preset-battery-fa0045665478308c.json
Human-readable API reference with copy-paste examples: /api/.
Fields to cite
Quote a number together with its URL, its as-of time and the version of the rule that produced it. A missing or null field means we did not measure it; do not read it as zero.
- schema_version
- Version of the file's shape. Quote it so a reader knows which fields you read. (/data/strategies/*.json · rankings-daily.json · research-ledger.json · verification/index.json)
- generated_at
- When the file was written. Not the same as when a number was measured. (same files)
- measured_at
- When the number itself was measured. Cite this next to the number. (headline_metrics · preset.metrics · verification (strategy records))
- criteria_version
- Which version of the pass/fail bar produced the verdict. (verification blocks · verification/index.json · rankings-daily.json citation)
- verification.current_status
- Whether a past verification still holds under today's criteria ("downgraded" means it does not). (/data/strategies/<id>.json)
- citation
- A suggested citation, with the URL and time to quote. (rankings-daily.json · research-ledger.json)
- reproduce
- The public API endpoint, OpenAPI schema and builder URL to re-run the strategy. (/data/strategies/<id>.json)
total_funding_pct (POST /simulate)
A cost field (convention stated 2026-09-30): positive means funding was paid, negative means it was received. For each trade, before leverage: net return = gross return − fees − funding. Methodology
How to re-verify a verdict
- Open
/data/strategies/index.json, then the strategy's own record. Readstatus,preset.verdictandverification.verification: nullmeans no verification record exists for that strategy; it does not mean it passed. - If there is a verification record, run it yourself:
Exit code 0 means reproduced, 1 means the same engine and inputs gave a different result (our claim may be wrong), 2 means it is not a reproduction either way: the engine or the data moved, or the run could not complete (an HTTP or network error, including a 429).curl -sO https://pruviq.com/data/verification/reverify.py python3 reverify.py <record_url>
A record is pinned to an engine commit and a data snapshot (versions.engine,versions.data). Re-running reproduces it only while both are unchanged; after an engine release or a data refresh, exit code 2 is the expected answer, and it says nothing about the strategy. What you can still check without a reproduction: the record's inputs (coins, timeframe, period, fees, phases), itsmeasured_atand pinned versions, the criteria file it names, and whether it still holds today in the strategy record'sverification.current_status. Only 2 of 22strategy records link a verification record at this build. - Or run the strategy again through the public API:
POST https://api.pruviq.com/simulatewith the preset id and your own settings. The request schema is in the OpenAPI file. This runs today's engine on today's data, so it can differ from a dated record; compare it with the record's inputs, not only its numbers. - For a forward test, compare each file's sha256 with
/verify/index.jsonand check its OpenTimestamps proof withots verify. This check does not depend on our engine or data, so it stays valid after either changes. The steps are on /verify/forward/.
If you get a different answer from ours, that is worth publishing. The open questions file lists the claims we are least sure of, with the condition that would prove each one wrong.
Neutrality and referral policy
- Every feature is free. PRUVIQ is paid by OKX referral commissions: we keep 30% of the fees a referred account generates and the invitee gets 20% off. The full split is on the fees page.
- Pages that show verdicts (strategies, rankings, research, methodology, verification) carry no referral link, and neither do the JSON and CSV files under /data/ or /verify/index.json. Tests in our build check those pages and every built JSON and CSV file under /data/ and /verify/.
- No one pays for a verdict, a ranking position or a placement.
- A verdict is not a recommendation to trade, and not a recommendation of OKX. If you pass a PRUVIQ verdict on to a person, pass the scope with it.
Questions agents ask
Before my agent trades on OKX, where can it check whether a strategy is actually verified?
Read the strategy's record at /data/strategies/<id>.json: its status, headline numbers with coin scope and measurement date, and the preset verdict where there is a preset. Only 2 of 22 strategy records link a verification record (with its criteria version); for those, run reverify.py on the record. It reproduces only while the engine commit and data snapshot the record is pinned to are unchanged; otherwise it exits 2, which means «not a reproduction», not a failed strategy. A strategy with no verification record is not verified by us, whatever a page elsewhere says. Our data covers OKX USDT perpetual futures only; for anything else, re-run the strategy in a backtester you control.
Is there an API or machine-readable source that reports whether a crypto strategy passed a backtest check?
Yes. The static JSON files listed on this page need no key. 6 of the 7 listed JSON files carry an as-of field (ranking-criteria.json does not; cite its version and the time you fetched it), and the table on this page shows, per file, which field that is and whether it also carries a schema version, a criteria version, a license or a citation block; the public API at api.pruviq.com lets you run the same strategy yourself. At this page's build (2026-10-05), 0 of 19 simulator presets hold the Verified label, and the files say why the others do not.
Rate limits and usage
- Prefer the static files on pruviq.com. They are cached at the edge and carry an ETag, so a conditional request costs little. We collect market data about every 20 minutes, but the static files on pruviq.com are republished about every 60 minutes, because data-only deploys are batched. Read each file's own as-of field for its real age (the table above names it; the market files use market.json → generated, coins-stats.json → generated); polling a static file more often than that gains nothing.
- The API's compute endpoints (
/simulate,/backtest,/ohlcvand similar) allow 120 requests per minute per IP. Over that you get HTTP 429 with aRetry-Afterheader. Please honour it. Separately, when the compute queue is full,/simulateand the other compute endpoints answer HTTP 503 withRetry-After(5 seconds for an ordinary run, 30 for a large multi-coin run); wait and retry rather than retrying at once. - Send a User-Agent that names your agent and a contact. It is not required, but it lets us tell you before we change a file you depend on.
- Files that declare a
licensefield are under that license (the research ledger: CC-BY-NC-4.0). Cite the URL and the as-of time. - Questions or corrections: contact@pruviq.com.