Tool reference
All 39 tools, with parameter schemas read directly from the running server.
Generated from the live server's tools/list response, so this page
cannot drift from what the server actually accepts. Agents should prefer
/llms-full.txt or a tools/list
call over scraping this page.
data_ingestBackfill OHLCV into the catalog. Asynchronous — returns a job_id.
Backfill OHLCV into the catalog. Asynchronous — returns a job_id.
The worker handles Coinbase's 300-candle-per-request limit by chunking with backoff. For 1-minute history prefer a bulk CSV; the API is for recent top-up, not for pulling a year 300 bars at a time.
| Parameter | Type | Notes |
|---|---|---|
| symbol required | string | e.g. BTC-USD |
| timeframe required | string | 1m, 5m, 15m, 1h, 6h, 1d |
| start required | string | ISO8601 UTC, inclusive |
| end required | string | ISO8601 UTC, exclusive |
| source | string | Default "coinbase" |
| path | string | server-side CSV path when source is csv_upload/cdd |
| venue | string | Default "coinbase" |
| client_request_id | string |
data_catalogList datasets with summary stats. Never returns bars.
List datasets with summary stats. Never returns bars.
| Parameter | Type | Notes |
|---|---|---|
| symbol | string |
data_quality_reportGap accounting, OHLC structural violations and per-source lineage.
Gap accounting, OHLC structural violations and per-source lineage.
The checks are cheap and catch vendor corruption immediately: high below low, close outside the bar's range, duplicated or non-positive prices.
| Parameter | Type | Notes |
|---|---|---|
| dataset_id required | string |
data_gap_policy_setChoose how gaps are handled in backtests on this dataset.
Choose how gaps are handled in backtests on this dataset.
There is deliberately no forward_fill. Forward-fill fabricates flat bars, suppresses realised volatility and triggers phantom signals.
'skip' used to zero the return of the interval spanning a hole. That was wrong in the direction that flatters a strategy: a position already on at the pre-gap open cannot be flattened inside the outage without lookahead, so the gap move IS earned by whatever was held, and zeroing it deleted real drawdowns from the equity curve. With opens [100, 100, 70, 71] a constant long booked 0% across the hole instead of -30%.
That interval is now priced like any other under both policies, which leaves 'skip' with no effect on P&L. Both settings still record gap_count in the quality report and mark gap bars untradable. The option is kept because splits freeze the policy in force when they were registered, so older splits must still name the value they were created with.
| Parameter | Type | Notes |
|---|---|---|
| dataset_id required | string | |
| policy required | string | |
| dry_run | boolean | Default false |
data_resampleResample time bars onto activity, and report whether it actually helped.
Resample time bars onto activity, and report whether it actually helped.
Time bars sample on a clock the market does not follow: activity arrives in bursts, so quiet periods are oversampled and busy ones undersampled. The resulting fat tails break every normality-based Sharpe statistic — a return kurtosis of 18 makes the usual inference meaningless. Dollar and volume bars sample on activity instead.
The comparison is returned rather than assumed, because resampling does not always help and claiming it did would be its own kind of lie.
| Parameter | Type | Notes |
|---|---|---|
| dataset_id required | string | |
| method | string | Default "dollar" |
| target_bars | integer | aim for roughly this many bars; omit for a quarter of the source |
split_registerRegister train/validate/test/holdout ranges. Immutable once created.
Register train/validate/test/holdout ranges. Immutable once created.
Registering the split before you look at any result is what stops 'out-of-sample' from being redefined after the fact. The holdout range is stored but its bars are not readable through any tool except holdout_evaluate.
| Parameter | Type | Notes |
|---|---|---|
| dataset_id required | string | |
| train required | string[] | [start, end) ISO8601 |
| validate required | string[] | |
| test required | string[] | |
| holdout required | string[] | |
| embargo_bars | integer | Default 0 |
| label | string |
data_ingest_universeBackfill a basket of instruments and register it as a universe.
Backfill a basket of instruments and register it as a universe.
Testing one spec across many instruments is the only way to genuinely increase effective sample size. Resampling the same history to a finer grid adds autocorrelated bars, not information, and does not lower the deflated Sharpe hurdle — which is denominated in years, not observations.
| Parameter | Type | Notes |
|---|---|---|
| name required | string | a label for the basket, e.g. 'top30-usd' |
| timeframe required | string | |
| start required | string | |
| end required | string | |
| symbols | string[] | explicit basket; omit to take the most liquid USD pairs |
| top_n | integer | Default 30 |
| min_volume_24h_usd | number | Default 5000000 |
| client_request_id | string |
universe_catalogRegistered baskets and their measured breadth.
Registered baskets and their measured breadth.
Takes no parameters.
backtest_cross_sectionRun one spec across a whole universe. Adds exactly ONE trial to N.
Run one spec across a whole universe. Adds exactly ONE trial to N.
The spec is the hypothesis and the assets are the sample, so charging one trial per asset would penalise the statistically correct thing. Returns the cross-sectional Sharpe distribution plus a pooled estimate whose standard error uses M_eff — the effective number of independent tests — rather than the raw asset count.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string | |
| split_id required | string | |
| universe_id required | string | |
| segment | string | Default "train" |
| params | object | |
| client_request_id | string |
stats_effective_testsHow many independent tests a basket actually provides.
How many independent tests a basket actually provides.
Crypto co-moves. Thirty assets are not thirty confirmations, and booking them as such would replace one overfitting mechanism with another.
| Parameter | Type | Notes |
|---|---|---|
| universe_id required | string | |
| segment | string | Default "train" |
| split_id | string |
cost_model_refreshPin the current fee tier server-side.
Pin the current fee tier server-side.
The caller cannot supply fee assumptions anywhere in this server. Whatever this returns is stamped onto every run that follows.
| Parameter | Type | Notes |
|---|---|---|
| venue | string | Default "coinbase" |
cost_breakevenWhat the edge must clear before any signal is worth discussing.
What the edge must clear before any signal is worth discussing.
Call this before designing a strategy. If the required edge per trade exceeds anything plausible at your intended frequency, the frequency is wrong and no signal will fix it.
| Parameter | Type | Notes |
|---|---|---|
| trades_per_day required | number | |
| execution | string | Default "taker" |
| cost_model_id | string |
strategy_registerRegister a strategy spec. Identity is the sha256 of the canonical spec.
Register a strategy spec. Identity is the sha256 of the canonical spec.
The spec is a small declarative graph — named features with explicit lags, plus entry/exit predicates — precisely so feature_validate can analyse it for look-ahead. Arbitrary Python could not be checked.
| Parameter | Type | Notes |
|---|---|---|
| spec required | object | |
| family | string | Default "default" |
feature_validateStatic look-ahead analysis of the feature graph.
Static look-ahead analysis of the feature graph.
Catches the most common backtest lie before it costs a run: negative lags, forward-looking ops, and statistics fitted over the whole sample. A feature reading close[t] is fine here because execution is next-bar-open and the server enforces that.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string |
strategy_freezeLock the spec, pinning a parameter vector into it. Irreversible.
Lock the spec, pinning a parameter vector into it. Irreversible.
Required before the holdout and before any paper session. Freezing forces you to commit to one configuration rather than deciding which one you meant after seeing the holdout.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string | |
| params | object | |
| dry_run | boolean | Default false |
family_forkStart a new trial-counting family, recording why.
Start a new trial-counting family, recording why.
Strict accounting: a fork does not reset N. The lineage is walked when N is computed, because you did learn from the parent's trials. The justification is stored in the ledger so the reset is auditable rather than silent.
| Parameter | Type | Notes |
|---|---|---|
| new_family required | string | |
| parent_family required | string | |
| justification required | string |
library_searchDocumented strategy hypotheses with an economic rationale.
Documented strategy hypotheses with an economic rationale.
The reason this exists: a parameter search has no prior, and a search without a prior finds whichever configuration traded least in a rising market. Every entry here states who is on the other side of the trade and why they lose, so a result can be judged against a hypothesis rather than a curve fit.
Citations are model-generated leads to check, NOT evidence. `citation_verified` is false until a human has actually looked the source up.
| Parameter | Type | Notes |
|---|---|---|
| category | string | time-series momentum and trend following · mean reversion and statistical arbitrage · volatility, risk premia and regime filters · cross-sectional momentum, carry and relative value · calendar effects, flow and microstructure |
| max_trades_per_day | number | filter to ideas cheap enough for the pinned fee tier |
| survives_cost | boolean | |
| limit | integer | Default 15 |
library_getThe full entry: rationale, origin, failure modes, and the falsification test.
The full entry: rationale, origin, failure modes, and the falsification test.
| Parameter | Type | Notes |
|---|---|---|
| name required | string |
library_adoptRegister a library hypothesis as a strategy in your own family.
Register a library hypothesis as a strategy in your own family.
This is the point of the library: the idea enters the ledger with a recorded provenance, so a later result can be traced to the hypothesis that motivated it rather than to a sweep that found it.
| Parameter | Type | Notes |
|---|---|---|
| name required | string | |
| family | string |
case_studiesDocumented strategy failures, with the mechanism and what would have caught it.
Documented strategy failures, with the mechanism and what would have caught it.
Companion to the strategy library: that gives hypotheses with a prior, this gives failure modes with a mechanism. Useful when a result looks good and you want to know which known way it might be wrong.
Sources are model-generated leads and are NOT verified.
| Parameter | Type | Notes |
|---|---|---|
| category | string | classic_blowups | crypto_blowups | backtest_lies | data_traps | overfit_famous |
| search | string | match mechanism or strategy |
| limit | integer | Default 8 |
case_studyThe full record for one documented failure.
The full record for one documented failure.
| Parameter | Type | Notes |
|---|---|---|
| slug required | string |
backtest_submitQueue a backtest. Adds exactly one trial to N.
Queue a backtest. Adds exactly one trial to N.
Execution is next-bar-open and enforced server-side. Costs come from the latest pinned cost model; there is no fee parameter.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string | |
| split_id required | string | |
| segment | string | Default "train" |
| params | object | |
| execution | string | Default "taker" |
| client_request_id | string |
sweep_submitQueue a parameter sweep. Every point is a trial.
Queue a parameter sweep. Every point is a trial.
The updated N is returned immediately, before any result arrives, so the statistical cost of the sweep is visible while you can still cancel it. Sweeping 2,000 points to find a winner shows up as N=2000 in every deflated Sharpe you compute afterwards.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string | |
| split_id required | string | |
| param_grid required | object | {'fast': [5,10,20], 'slow': {'start':50,'stop':200,'step':25}} |
| segment | string | Default "train" |
| max_points | integer | Default 500 |
| dry_run | boolean | expand the grid and report the cost to N without queueing anything Default false |
| client_request_id | string |
job_statusPoll a submitted job.
Poll a submitted job.
| Parameter | Type | Notes |
|---|---|---|
| job_id required | string |
backtest_resultFetch the metric summary for one recorded run.
Fetch the metric summary for one recorded run.
Around twenty numbers, never a trade blotter. Gross and net sit side by side so fee drag is impossible to overlook. The full return series is available as a resource at quant://runs/{run_id}/returns.
| Parameter | Type | Notes |
|---|---|---|
| run_id required | string |
stats_deflated_sharpeDeflated Sharpe for one run, against the family's trial count.
Deflated Sharpe for one run, against the family's trial count.
N is read from the ledger. It is not an argument, and cannot be.
| Parameter | Type | Notes |
|---|---|---|
| run_id required | string |
stats_bootstrap_ciStationary-bootstrap confidence intervals for Sharpe and expectancy.
Stationary-bootstrap confidence intervals for Sharpe and expectancy.
A point estimate from a few dozen trades is not a measurement. Expect the interval on a marginal strategy to include zero; that is the tool working. Block length respects serial dependence, so the interval does not inherit the false precision an iid bootstrap would give.
| Parameter | Type | Notes |
|---|---|---|
| run_id required | string | |
| n_boot | integer | Default 2000 |
| confidence | number | Default 0.95 |
stats_pboQueue combinatorially symmetric CV to measure overfitting probability.
Queue combinatorially symmetric CV to measure overfitting probability.
Asks whether the configuration that looked best in-sample tends to land above or below the out-of-sample median. Above 0.5 means your selection procedure is anti-predictive. Uses the family's evaluated parameter vectors unless you pass a grid; the re-evaluations are recorded but deliberately excluded from N.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string | |
| split_id required | string | |
| n_groups | integer | number of equal subsets; forced even, since CSCV splits them in half Default 8 |
| segment | string | Default "train" |
| param_grid | object | |
| client_request_id | string |
stats_reality_checkQueue White's Reality Check, Hansen's SPA and Romano–Wolf on a family.
Queue White's Reality Check, Hansen's SPA and Romano–Wolf on a family.
Tests the best member against the whole family it was selected from, using a stationary bootstrap that preserves serial dependence. Testing the winner in isolation answers a question nobody asked.
| Parameter | Type | Notes |
|---|---|---|
| family required | string | |
| benchmark | string | Default "zero" |
| n_boot | integer | Default 1000 |
| client_request_id | string |
stats_min_backtest_lengthMinBTL = 2·ln(N) / E[max_N]² — how much data N trials actually require.
MinBTL = 2·ln(N) / E[max_N]² — how much data N trials actually require.
Frequently the tool that ends a line of research early, which is the point.
| Parameter | Type | Notes |
|---|---|---|
| family required | string |
experiment_ledgerThe audit trail: N, the Sharpe distribution, and the extremes.
The audit trail: N, the Sharpe distribution, and the extremes.
Read-only, and append-only underneath — N can never be revised downward.
| Parameter | Type | Notes |
|---|---|---|
| family required | string | |
| limit | integer | Default 10 |
stats_triple_barrierLabel every candidate entry by which barrier it would have hit first.
Label every candidate entry by which barrier it would have hit first.
A strategy that trades twenty times in two years cannot be evaluated. This scores each potential entry against a profit-take, a stop and a time limit, which enlarges the evidence base without increasing trading frequency — the central tension in this system.
When both price barriers fall inside one bar the stop is taken: a bar cannot resolve which was touched first, and the adverse assumption is the only one that does not flatter the result.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string | |
| split_id required | string | |
| pt_bps | number | profit-take barrier Default 200.0 |
| sl_bps | number | stop-loss barrier Default 100.0 |
| vertical_bars | integer | Default 48 |
| segment | string | Default "train" |
gate_checkRun the statistical gauntlet. Passing is what unlocks the holdout.
Run the statistical gauntlet. Passing is what unlocks the holdout.
Seven checks, including the Harvey–Liu t > 3 hurdle rather than the conventional t > 2, and regime survival tested separately in bull, bear and chop rather than in aggregate.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string | |
| split_id required | string |
holdout_evaluateSpend the one holdout attempt for this frozen strategy.
Spend the one holdout attempt for this frozen strategy.
Requires the strategy to be frozen and gate_check to have passed against that exact spec hash, with no prior grant. Every attempt is logged whether or not it succeeds. There is no second attempt, ever.
Pass dry_run=true to check every precondition and see what would happen without spending the grant or logging an attempt. A tool this expensive should be inspectable before it is fired.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string | |
| dry_run | boolean | check every precondition and report what WOULD happen, then refuse. Spends nothing and is not logged as an attempt Default false |
execution_replay_submitQueue an event-driven revalidation with honest fill modelling.
Queue an event-driven revalidation with honest fill modelling.
Resting post-only limits fill only when the bar actually trades through the level, capped by volume participation, and are cancelled unfilled after max_wait_bars. A resting order that never fills is simulated as never filling — assuming fills at the touch is the second-most-common backtest lie after understating costs. Does not add to N: it revalidates an existing trial rather than creating a new one.
| Parameter | Type | Notes |
|---|---|---|
| strategy_id required | string | |
| split_id required | string | |
| segment | string | Default "test" |
| post_only | boolean | Default true |
| offset_bps | number | Default 1.0 |
| participation | number | Default 0.05 |
| max_wait_bars | integer | Default 3 |
| engine | string | Default "native_l1" |
| client_request_id | string |
paper_sessionForward-test a frozen strategy on bars that did not exist at build time.
Forward-test a frozen strategy on bars that did not exist at build time.
The only validation that cannot be overfit. 'start' opens a session against a frozen spec, 'record' evaluates newly printed bars and logs signals, 'report' summarises forward performance after the pinned cost model.
| Parameter | Type | Notes |
|---|---|---|
| action required | string | |
| strategy_id | string | |
| session_id | string | |
| dataset_id | string |
server_statusWhat this server is, what it holds, and what has changed recently.
What this server is, what it holds, and what has changed recently.
Call this first in a new conversation. It is cheaper than rediscovering the state by trial and error, and it will tell you which research lines are already closed.
Takes no parameters.
account_statusYour plan, this month's usage, and what remains.
Your plan, this month's usage, and what remains.
The metered unit is the trial, not the API call — every trial permanently raises the bar your own results must clear, so it is the scarce thing worth pricing. A smaller sweep buys a lower deflated-Sharpe hurdle as well as a smaller bill; the constraint runs with the statistics rather than against them.
Takes no parameters.
plansWhat each plan includes.
What each plan includes.
Takes no parameters.
Read this page as Markdown:
/docs/tools.md