tickerbot.io
View as markdown

Screener

Tickerbot is the stock market API designed for agents. A stock screener is a few queries on it, in sequence: the screen, a saved universe, the row click, and a subscription.

How it works

A screener is one question asked of every ticker at once, exactly the shape of the computed table. The screen you'd otherwise assemble from a feed, a warehouse and indicator math is one SQL call; the screener around it is three more.

1. Write the screen

A SQL WHERE clause over 452+ signals. 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" }'

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"] }'
Show responseHide response
Response
{
  "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"

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" }'
Show responseHide response
Response
{
  "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

CallWhat it does here
POST /v2/scanThe screen itself: q, columns, order, dir, limit; one call, every ticker
POST /v2/universesThe watchlist as a resource: create once, scope any screen with universe=
GET /v2/tickers/{ticker}The row click: every signal for one ticker in one row
POST /v2/scan/subscribeThe saved screen as an alert: fires when the match set changes