Build a portfolio tracker

Model the holdings as a universe and the pricing grind disappears: one call prices every holding with all 421+ signals attached, one call charts the history, and alerts scope to exactly what you hold. Positions and cost basis stay yours.

The recipe

1. Model the holdings

A universe is a named ticker list — one per portfolio, or per user. Update it as positions change.

curl -s -X POST https://api.tickerbot.io/v2/universes \
  -H "Authorization: Bearer $TICKERBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "id": "my_portfolio", "name": "My Portfolio", "tickers": ["AAPL","MSFT","NVDA","RIOT"] }'

2. Price everything in one call

A scan scoped to the universe returns every holding's current row: price for the P&L math, plus the computed state most trackers never show.

curl -s -X POST https://api.tickerbot.io/v2/scan \
  -H "Authorization: Bearer $TICKERBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "q": "price > 0", "universe": "my_portfolio",
        "columns": "ticker,price,day_change_pct,rsi_14,above_sma_200" }'

# P&L is your arithmetic on your cost basis:
# value = qty * row.price;  pnl = value - qty * cost

3. Chart the history

/v2/series puts every holding's price path on one aligned daily grid.

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

4. Watch what you own

Alerts scoped to the same universe: the tracker stops being a page you check and starts telling you when a holding needs attention.

curl -s -X POST https://api.tickerbot.io/v2/scan/subscribe \
  -H "Authorization: Bearer $TICKERBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "q": "day_change_pct < -0.05 OR rsi_overbought",
        "universe": "my_portfolio",
        "target_url": "https://your-app.example.com/hook" }'

Endpoints used

EndpointRole in this build
POST /v2/universesThe holdings list: named, updatable, referenced everywhere by slug
POST /v2/scanCurrent value + computed state for every holding, one call
GET /v2/seriesPrice history for every holding on one aligned grid
POST /v2/scan/subscribeAlerts scoped to the portfolio: pushed, not polled

More guides