An algorithm is a condition and a loop: what to look for, and what to do when it appears. Tickerbot supplies the condition side as infrastructure — every ticker × every signal as one computed SQL table — so the loop becomes one query in three tenses. Your strategy, your broker; the data layer is done.
Free plan. Every ticker, every signal, real-time data, all-time history.
the recipe
1. Define the entry condition — a SQL WHERE clause over named, precomputed columns —421+ signals plus the fundamentals. This is the whole market evaluated in one call, right now:
curl -s -X POST https://api.tickerbot.io/v2/scan \
-H "Authorization: Bearer $TICKERBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "q": "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e9" }'2. Validate it historically — the same query with ?asof= reruns it against the market as it was at that moment — delisted tickers included, no survivorship bias, unlimited depth on every plan. Walk it across dates and you have a candidate history for your backtest:
curl -s -X POST "https://api.tickerbot.io/v2/scan?asof=2024-01-05" \
-H "Authorization: Bearer $TICKERBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "q": "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e9" }'3. Run it live — subscribe the same query as a webhook. It fires when the match set changes — a ticker entering your condition is your signal to decide; your handler runs the strategy and routes any order to your broker:
curl -s -X POST https://api.tickerbot.io/v2/scan/subscribe \
-H "Authorization: Bearer $TICKERBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "q": "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e9",
"target_url": "https://your-bot.example.com/hook" }'4. Write the algorithm — the strategy itself is a webhook handler — and this is the part that stays yours. The payload’s matches are the tickers that just entered your condition; current_matches is everything matching right now — so entries and exits both fall out of one delivery. (Payload lists cap at 100 rows; at scale, confirm any single position with GET /v2/tickers/{ticker}.)
// POST from Tickerbot whenever the match set changes:
// { "event": "webhook.fired",
// "q": "rsi_14 < 30 AND above_sma_200 AND market_cap > 1e9",
// "as_of": "2026-08-14T15:05:00Z",
// "matches": [ { "ticker": "RIOT", "rsi_14": 27.4, ... } ],
// "current_matches": [ /* every ticker matching right now */ ] }
app.post('/hook', async (req, res) => {
const { matches, current_matches } = req.body
const matching = new Set(current_matches.map((r) => r.ticker))
// ENTRIES — tickers that just entered the condition.
// Sizing, risk, portfolio state: your strategy, not Tickerbot's job.
for (const row of matches) {
if (!portfolio.has(row.ticker) && passesRisk(row)) {
await broker.buy(row.ticker, positionSize(row)) // your broker's API
}
}
// EXITS — held positions whose entry condition no longer holds
// (or subscribe a second webhook on your exit condition).
for (const pos of portfolio.positions()) {
if (!matching.has(pos.ticker) && exitRules(pos)) {
await broker.sell(pos.ticker, pos.qty)
}
}
res.sendStatus(200)
})under the hood
POST /v2/scan | The condition, evaluated across the whole market — live or ?asof= any past moment |
POST /v2/scan/subscribe | The same condition as a push — fires when tickers enter or leave the match set |
GET /v2/tickers/{ticker} | Everything about one ticker in one row — position context without extra calls |
GET /v2/series | Aligned time series, up to 50 tickers × 25 columns — the backtest’s data side |
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
No — Tickerbot is the data layer for your trading bot, not the bot. It tells you when the conditions you defined are met — live, at any past moment, or as a push. Deciding what to do and routing an order is your handler’s and your broker’s job. That boundary is deliberate: we sell the data layer, not the strategy and not execution.
The as-of mechanism reruns any query against the market as it was at a past moment — the same q, the same grammar, with delisted tickers still present, so there’s no survivorship bias in your candidate sets. It’s unlimited-depth on every plan, including Free. For the time-series side of a backtest, GET /v2/series returns aligned history for up to 50 tickers × 25 columns per call.
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.
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.
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
What people are saying.
“dude. whoah.”
“Tickerbot is insane. It turns Claude into a quant.”
“Best value for hobbyists and advanced traders alike.”
get started
Free plan. Every ticker, every signal, real-time data, all-time history.