← tickerbot.io
View as markdown

Analyst actions

GEThttps://api.tickerbot.io/v2/events?kind=analyst

Upgrades, downgrades, initiations, and price-target changes — the freshest kind on the stream.

stringrequiredfixed by this page

Fix to analyst for this view (comma-combine kinds to merge timelines).

string

Single symbol. Beats tickers when both are passed.

string[]

Comma-separated symbols, up to 50. Not combinable with universe; ticker wins when both are passed.

string

System or caller-owned universe slug.

string

Structured filter: exact firm-name match on the ratings feed. ANDs with q.

enum

Structured filter over the action vocabulary (upgrades, downgrades, initiates_coverage_on, maintains, reiterates, assumes, reinstates, suspends, terminates_coverage_on).

upgradesRating raised.
downgradesRating lowered.
initiates_coverage_onFirst rating from this firm.
maintainsRating unchanged, restated.
reiteratesRating unchanged, emphasized.
assumesCoverage transferred to a new analyst at the firm.
reinstatesCoverage resumed after a pause.
suspendsRating suspended — coverage paused without being dropped.
terminates_coverage_onCoverage dropped entirely.
string

YYYY-MM-DD or ISO timestamp (inclusive). since is accepted as an alias.

string

YYYY-MM-DD or ISO timestamp — a bare YYYY-MM-DD means through the end of that day; timestamps are exclusive. until is accepted as an alias.

string

SQL filter. This kind's payload fields are first-class typed columns here: firm, analyst, action, rating, previous_rating, price_target_action (text), price_target, previous_price_target, importance (numeric) — e.g. firm = 'Goldman Sachs' AND price_target > previous_price_target. payload->>'…' works too. Base columns: ticker, ts, kind, payload. See the signals catalog for columns + flags you can compose.

enum

state widens q to ticker-state signals evaluated as of each event's timestamp. Never gated.

stateWiden the grammar to ticker-state columns, evaluated as of each event’s timestamp. Resolves at daily grain.
enumdefault auto

Grain the per-event state is reconstructed at, when join=state: 1m, 1h, 1d, or auto (default). auto resolves to 1d — the event set's tickers are not known before the query runs, and 1d is the only tier covering the whole universe, so it is the only grain guaranteed to satisfy every event. An explicit 1m/1h trades coverage for precision: events on tickers absent from that tier join to null. A referenced column the grain does not store is a 400. Reported back as _meta.state_interval.

1mOne minute. The finest stored tier; carries the intraday column subset and ~1,100 of ~13,700 tickers.
1hOne hour. Stored tier, intraday column subset, full universe.
1dOne day. The full-history, full-column tier — the only grain that carries daily-only columns (SMAs, RSI, fundamentals).
autodefaultLet the server pick the finest grain whose columns and ticker coverage both work out, resolving upward on a miss. Reported in _meta.interval.
integerdefault 50

Rows per page. Max 1000.

string

Opaque cursor from the previous response.

as_ofstring

Server time this response was assembled (ISO 8601).

queryobject

Your filters, echoed.

countnumber

Rows in this page.

next_cursorstring

Opaque token for the next page; `null` on the last page. Pass it back as `cursor`.

resultsarray

One row per event, newest first.

tickerstring

Symbol the action targets.

tsstring

When the action landed (timestamp-grained).

kindstring

Always `analyst` on this view.

payloadobject

The action.

event_idstring

Stable id for the action.

firmstring

Research firm.

analyststringoptional

Analyst name, where attributed.

actionstring

`upgrades`, `downgrades`, `maintains`, `reiterates`, `initiates_coverage_on`, `assumes`, `reinstates`, `terminates_coverage_on`, `suspends`.

ratingstringoptional

New rating label; `previous_rating` carries the prior one.

price_targetnumberoptional

New target (USD); `previous_price_target` carries the prior one.

price_target_actionstringoptional

How the target moved (`raises`, `lowers`, …).

importancenumberoptional

Vendor-assigned salience, 0–5.

  • This is GET /v2/events with kind=analyst; it has its own page because the payload is its own contract. The full query grammar lives there and applies here unchanged, including join=state, which evaluates ticker-state signals as of each event's timestamp.
  • A rating change lands within the hour, 24/7, with history back to 2012.
  • The legacy specialized route GET /v2/analyst/events returns the same payloads with firm/action as plain params. It is deprecated with a 2026-10-31 sunset and this view is its successor; it is no longer listed in the OpenAPI spec or the endpoint index; responses are unchanged and carry Deprecation/Sunset headers until then.
  • The ticker object carries live analyst signals (last_rating_date / last_rating_firm / last_rating_action) and recent_* booleans for scans.
  • To be pushed instead of polling, create an event-trigger webhook: POST /v2/webhooks with trigger.kinds=analyst.
Downgrades on stocks above their 200-day (join=state)
curl -G "https://api.tickerbot.io/v2/events" \
  -H "Authorization: Bearer YOUR_KEY" \
  --data-urlencode "kind=analyst" \
  --data-urlencode "join=state" \
  --data-urlencode "from=2026-08-17" \
  --data-urlencode "q=payload->>'action'='downgrades' AND above_sma_200 = true"
Response
// Same envelope; query echo carries join: "state" and state_resolution: "1d".