Build an ML dataset, with Tickerbot.

The quiet killer of financial ML isn’t the model — it’s the dataset. Lookahead leakage, survivorship bias, restated fundamentals: features that quietly know the future make backtests brilliant and production humiliating. Tickerbot is point-in-time by construction — ?asof= returns what was knowable at that moment, dead tickers included — so the dataset is honest before the first epoch.

Free plan. Every ticker, every signal, real-time data, all-time history.

the recipe

Features from the past, honestly.

1. Features at time Tan as-of scan is a feature vector factory: every ticker that existed at that moment, with 421+ computed columns as they stood — not as they were later revised:

curl -s -X POST "https://api.tickerbot.io/v2/scan?asof=2023-06-01" \
  -H "Authorization: Bearer $TICKERBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "q": "market_cap > 1e9",
        "columns": "ticker,price,rsi_14,pe_ratio,volume_change_vs_avg,day_change_pct" }'

2. Labels at T+nforward outcomes come from /v2/series — pull the price path after your feature date and compute the label your task needs (forward return, drawdown, hit a threshold):

curl -s "https://api.tickerbot.io/v2/series?tickers=AAPL,MSFT,RIOT\
&columns=close&interval=1d&from=2023-06-01&to=2023-07-01" \
  -H "Authorization: Bearer $TICKERBOT_API_KEY"

3. The dataset loopwalk the calendar: features as-of each date, labels from the window after it. The temporal boundary between the two is enforced by the API, not by your discipline:

rows = []
for date in feature_dates:                        # e.g. monthly, 2018 → today
    feats = scan(asof=date, q="market_cap > 1e9", columns=FEATURES)
    prices = series(tickers=[f["ticker"] for f in feats],
                    columns="close", interval="1d",
                    frm=date, to=date + HORIZON)
    for f in feats:
        rows.append({ **f, "label": forward_return(prices, f["ticker"]) })

train, test = split_by_time(rows)                 # never randomly — by time

4. Check what the data can supportbefore trusting depth, ask for it — per-ticker, per-field measured coverage, so a thin column becomes a known limitation instead of a silent one:

curl -s https://api.tickerbot.io/v2/tickers/AAPL/coverage \
  -H "Authorization: Bearer $TICKERBOT_API_KEY"

under the hood

The calls behind it.

POST /v2/scan?asof=Point-in-time feature vectors — what was knowable, when it was knowable
GET /v2/seriesThe label side — forward price paths on one aligned grid
GET /v2/tickers/{ticker}/coverageMeasured per-field depth — know your dataset’s limits up front
GET /v2/tickers/symbolsThe universe, including tickers that later delisted

Every read runs in three tenses: live, as of any past moment (add ?asof= — no survivorship bias), or on push — the same query as a webhook that fires when the answer changes. Under all of it sits the computed table: every US equity plus rates, FX and crypto, every signal precomputed and refreshed continuously, with all-time history. That pipeline — warehouse, indicator math, refresh, point-in-time storage — is the part you’d otherwise build before writing your first line of product. Buy it as a table instead — data included; there’s no feed to bring.

questions

FAQ

What makes this dataset leakage-free?

?asof= is a point-in-time read: features are the values that existed at the query’s moment, and the universe is the market as it stood — companies that later delisted are present, so your training set isn’t secretly conditioned on survival. The feature/label boundary is enforced by the API’s timestamps rather than by careful bookkeeping on your side. What a model learns from it is your research — the data just won’t lie to you.

How much history is there to train on?

All-time, on every plan including Free — as-of queries are unlimited-depth and the series endpoints carry full history. Depth varies by field (fundamentals begin when issuers filed them), which is exactly what the coverage endpoint reports per ticker and field.

Why does a trading system need computed state?

Because every action it takes — an alert, a screen result, an order, a row in a user-facing app — is a condition over derived values: RSI below 30, price above the 200-day average, volume three times normal. Raw data doesn’t contain those. Something has to compute and refresh them for every symbol, continuously, and keep the history so past answers are reproducible. That’s a data pipeline, not a feature — you either build and operate it, or query one that already runs.

How does Tickerbot work with AI agents?

Every call here is also a native tool call: install the MCP server and Claude, ChatGPT, Cursor, or any MCP runtime queries the market directly. Computed state is what makes that work well — hand a model raw data and its context window fills with math to do; hand it computed answers and the context goes to decisions. A scan returns the tickers matching your condition — a list, not a workload.

How does Tickerbot pricing work?

The Free plan needs no card and carries the full data side: every ticker, every signal, real-time data, all-time history and as-of queries. Paid plans start at $29/mo and add real-time webhooks, websocket streaming, and higher rate limits. Data depth is never a tier lever — every plan sees the same table.

in the wild

900K+ calls served, and counting.

What people are saying.

“dude. whoah.”
President, ShopifyHarley Finkelstein
“Tickerbot is insane. It turns Claude into a quant.”
Quantitative Finance MScLounes Vennema
“Best value for hobbyists and advanced traders alike.”
AI Engineer, ImergeRon Reid

get started

Get a key. Run a scan.

Free plan. Every ticker, every signal, real-time data, all-time history.