Build a custom indicator, with Tickerbot.

Most custom indicators live inside a charting platform — brilliant for eyes on a chart, invisible to everything else you build. A Tickerbot custom signal is an indicator that lives in the API: define it once as a SQL predicate and it becomes a named column everywhere — screens, alerts, webhooks, time series, and history.

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

the recipe

Define once. Use everywhere.

1. Define ita custom signal is a boolean SQL predicate over the 421+ built-in columns — and over other custom signals you own, so indicators compose:

curl -s -X POST https://api.tickerbot.io/v2/signals \
  -H "Authorization: Bearer $TICKERBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "oversold_quality",
        "expr": "rsi_14 < 30 AND above_sma_200 AND pe_ratio < 20",
        "description": "Oversold pullback in a profitable uptrend" }'

2. Use it like a built-infrom the moment it exists, the name works anywhere a column works — here, screening the whole market for it and composing it with other conditions:

curl -s -X POST https://api.tickerbot.io/v2/scan \
  -H "Authorization: Bearer $TICKERBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "q": "oversold_quality AND market_cap > 1e9" }'

3. Ask for its historythis is the part a chart-bound indicator can’t do: custom signals mix freely into /v2/series, and transitions_only returns just the rows where your indicator flipped — its full on/off history, as if it had always existed:

curl -s "https://api.tickerbot.io/v2/series?tickers=AAPL,MSFT\
&columns=close,oversold_quality&interval=1d&from=2024-01-01\
&transitions_only=true" \
  -H "Authorization: Bearer $TICKERBOT_API_KEY"

4. Wire it to a pushand because it’s a column, it subscribes like one — the indicator you defined an hour ago is now watching the whole market for you:

curl -s -X POST https://api.tickerbot.io/v2/scan/subscribe \
  -H "Authorization: Bearer $TICKERBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "q": "oversold_quality AND market_cap > 1e9",
        "target_url": "https://your-app.example.com/hook" }'

under the hood

The calls behind it.

POST /v2/signalsCreate the indicator — name + SQL predicate; composes with other customs
POST /v2/scanScreen on it across the whole market, mixed with any built-in
GET /v2/series?transitions_only=trueIts flip history — every on/off edge on an aligned grid
POST /v2/scan/subscribeThe indicator as a push — fires when a ticker starts matching

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

How is this different from Pine Script?

Context. Pine Script is a full scripting language whose indicators live inside the TradingView chart — excellent when a human is looking at that chart. A custom signal is a one-line SQL predicate whose indicator lives in the API: the same definition drives screens, alerts, webhooks, and history, and anything you build can read it. Different homes for different jobs — and the SQL version is usually less to learn.

Does a custom indicator work on historical data?

Yes — custom signals compile per-row wherever they are referenced, so they mix into /v2/series history and evaluate in as-of queries like any built-in column. Define an indicator today and you can read its value at any past moment, as if it had always been in the table.

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.