Every alert bot has the same two halves: watching the market, and saying something when a condition trips. Tickerbot is the watching half as infrastructure — write the condition in SQL, get a push when it fires — so the half you build is just the message.
Free plan. Every ticker, every signal, real-time data, all-time history.
the recipe
1. Test the condition — run it as a scan first — the same grammar the alert will use, so you can see exactly who matches right now before subscribing anything:
curl -s -X POST https://api.tickerbot.io/v2/scan \
-H "Authorization: Bearer $TICKERBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "q": "volume_burst_3x AND day_change_pct > 5 AND market_cap > 1e9" }'2. Subscribe it — the same q becomes a webhook. Tickerbot evaluates it continuously and POSTs your endpoint when tickers enter or leave the match set — no polling loop, no scheduler, no missed minutes:
curl -s -X POST https://api.tickerbot.io/v2/scan/subscribe \
-H "Authorization: Bearer $TICKERBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "q": "volume_burst_3x AND day_change_pct > 5 AND market_cap > 1e9",
"target_url": "https://your-bot.example.com/hook" }'3. Or skip the server entirely — pass discord_url instead and Tickerbot posts a formatted embed straight to your Discord channel — a working alert bot with zero code and zero hosting:
curl -s -X POST https://api.tickerbot.io/v2/scan/subscribe \
-H "Authorization: Bearer $TICKERBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "q": "volume_burst_3x AND day_change_pct > 5 AND market_cap > 1e9",
"discord_url": "https://discord.com/api/webhooks/…" }'4. Write the bot — if you do run your own handler, the payload carries the matched tickers with the fields your condition referenced — format and forward to wherever your users live (Telegram, Slack, SMS, email):
app.post('/hook', async (req, res) => {
for (const row of req.body.matches) { // tickers that just tripped the condition
await telegram.send(
chatId,
`${row.ticker} up ${row.day_change_pct.toFixed(1)}% on ${row.volume_today.toLocaleString()} shares`,
)
}
res.sendStatus(200)
})
// Validate the receiver before it matters: POST /v2/webhooks/{id}/test
// sends a real-shape delivery with X-Tickerbot-Test: true.under the hood
POST /v2/scan/subscribe | Any SQL condition as an alert — fires when the match set changes |
POST /v2/tickers/{ticker}/subscribe | Single-ticker shorthand — alert on one symbol’s state |
GET /v2/webhooks | The registry — list, edit, disable, re-enable every alert |
POST /v2/webhooks/{id}/test | Fire a real-shape test delivery at your receiver |
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
Conditions are evaluated on the refresh cycle — every minute for equities during US market hours and 24/7 for crypto; fundamentals refresh daily. When the match set changes, the delivery goes out on that cycle. See refresh cadence for the per-signal detail.
Four channels: webhook (POST to your endpoint), discord (formatted embed, no server needed), in_app (the dashboard feed), and mobile_push (the Tickerbot companion app). One subscription, one channel; run several subscriptions to fan out.
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.