Stock screeners, in SQL

Pass a SQL filter, get the tickers that match right now. Same flag vocabulary as Finviz, delivered as JSON and webhooks. 100+ queryable fields across ~12,000 tickers, recomputed every minute.

GET /v2/scan

Filter the live universe in SQL

Compose a WHERE clause using any of 100+ queryable fields: boolean flags (gap_up_3pct, volume_unusual_2x, breakout, rsi_oversold…) and numeric columns (market_cap, price, day_change_pct…). Hit the endpoint; get the list of tickers that match this minute.

WHERE clause
-- small caps gapping up on real volume
gap_up_3pct
  AND volume_unusual_2x
  AND market_cap < 2_000_000_000
response
200·6 matches · 142ms
tickergap_pctday_change_pctrelative_volume
RKLB+6.30%+8.20%3.1×
IONQ+8.40%+11.30%5.2×
RIOT+7.20%+8.41%4.7×
MARA+4.80%+5.74%2.1×
ACHR+5.10%+6.90%2.8×
BBAI+3.60%+5.20%2.3×

endpoints you’ll use

Endpoints in a screener workflow

Five endpoint families combine for the full pattern: scan, scope, save, subscribe.

/v2/scan

Pass a SQL WHERE clause, get matching tickers. The screen itself.

Docs →

/v2/universes

Scope a screen to your own ticker list. Reference by slug from /scan.

Docs →

/v2/rules

Save a screen by name. Run it from /scan?rule= or attach to a webhook.

Docs →

/v2/webhooks

Subscribe a screen for push delivery. We POST on every new match.

Docs →

why this works

Built for devs who screen in code

comparison

Finviz vs Tickerbot

Finviz

UI screener, manual workflow

  • Browser UI only; no programmatic access
  • Filter library is fixed; can’t define your own conditions
  • CSV export only; no webhooks, no JSON, no automation
  • No historical scans; can’t backtest a screen

Tickerbot

SQL API + webhooks, code-first

  • REST API: pass SQL, get JSON back
  • Compose any filter from 100+ queryable fields
  • Subscribe filters as webhooks for push notifications on match
  • Historical scans with ?asof=YYYY-MM-DD (plan-tier depth)

works with your agent

Agents are experts at SQL. Hand them the loop.

Your agent writes a SQL filter, runs it against the live universe, and iterates on the result. The grammar is restricted on purpose: flat WHERE clauses, no joins, no window functions, so the agent can’t paint itself into a corner.

See the agent integration →

ship it

Get started