Screener
Tickerbot is the stock market, in SQL. A stock screener is one WHERE clause on it, sent to /v2/scan.
A screener is one question asked of every ticker at once — exactly the shape of the computed table. The screener you'd otherwise assemble from a feed, a warehouse, and indicator math is a single SQL call.
1. Write the screen
A SQL WHERE clause over 421+ named signals and fundamentals — here: above the 200-day average, under 20× earnings, over $1B market cap, largest first.
curl -X POST "https://api.tickerbot.io/v2/scan" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "q": "above_sma_200 AND pe_ratio < 20 AND market_cap > 1e9",
"order": "market_cap", "dir": "desc", "limit": 50,
"columns": "ticker,price,pe_ratio,market_cap,rsi_14" }'{
"as_of": "2026-08-21T10:50:32Z",
"query": { … },
"_meta": { "null_coverage": { … } },
"count": 50,
"results": [
{ "ticker": "GOOGL", "name": "Alphabet Inc. Class A Common Stock",
"price": 342.98, "pe_ratio": 17.27, "market_cap": 4215903134942, "rsi_14": 45.83, … },
{ "ticker": "BRK.A", "name": "Berkshire Hathaway Inc.",
"price": 843327.07, "pe_ratio": 14.77, "market_cap": 1070597613800, "rsi_14": 74.07, … },
…
]
}2. Save as a universe
A universe is a named ticker list — a user's watchlist as a resource. Reference it across the API by passing "universe": "my_watchlist" to various endpoints.
curl -X POST "https://api.tickerbot.io/v2/universes" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "id": "my_watchlist", "name": "My watchlist",
"tickers": ["AAPL","NVDA","JPM","CVX"] }'{
"id": "my_watchlist",
"name": "My watchlist",
"tickers": ["AAPL", "NVDA", "JPM", "CVX"],
"size": 4,
…
}3. The row click
The table's rows come from the scan; a click on one wants the detail view. One call returns everything about that ticker.
curl "https://api.tickerbot.io/v2/tickers/AAPL" \
-H "Authorization: Bearer YOUR_KEY"{
"as_of": "2026-08-21T10:50:59Z",
"ticker": "AAPL",
"data": {
"ticker": "AAPL",
"name": "Apple Inc.",
"exchange": "NASDAQ",
"price": 311.77,
"day_change_pct": 0.0015,
"rsi_14": 49.36,
"above_sma_200": true,
"pe_ratio": 37.72,
"at_52w_high": false,
"market_cap": 4623874049400,
…
}
}4. The screen that watches itself
Subscribe the same q and the saved screen stops being something you rerun — a webhook fires whenever the match set changes.
curl -X POST "https://api.tickerbot.io/v2/scan/subscribe" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "q": "above_sma_200 AND pe_ratio < 20 AND market_cap > 1e9",
"target_url": "https://your-app.example.com/hook" }'{
"id": "wh_z1E8FUA-8ZE",
"q": "above_sma_200 AND pe_ratio < 20 AND market_cap > 1e9",
"channel": "webhook",
"target_url": "https://your-app.example.com/hook",
"signing_secret": "whsec_…",
"status": "active",
"test_url": "/v2/webhooks/wh_z1E8FUA-8ZE/test",
…
}The calls behind it
POST /v2/scan— The screen itself: q, columns, order, dir, limit — one call, every tickerPOST /v2/universes— The watchlist as a resource: create once, scope any screen with universe=GET /v2/tickers/{ticker}— The row click: every computed signal for one ticker in one rowPOST /v2/scan/subscribe— The saved screen as an alert: fires when the match set changes