Analyst actions
https://api.tickerbot.io/ v2/ events?kind=analystUpgrades, downgrades, initiations, and price-target changes — the freshest kind on the stream.
Query parameters
stringrequiredfixed by this pageFix to analyst for this view (comma-combine kinds to merge timelines).
stringSingle symbol. Beats tickers when both are passed.
string[]Comma-separated symbols, up to 50. Not combinable with universe; ticker wins when both are passed.
stringSystem or caller-owned universe slug.
stringStructured filter: exact firm-name match on the ratings feed. ANDs with q.
enumStructured filter over the action vocabulary (upgrades, downgrades, initiates_coverage_on, maintains, reiterates, assumes, reinstates, suspends, terminates_coverage_on).
upgrades | Rating raised. |
downgrades | Rating lowered. |
initiates_coverage_on | First rating from this firm. |
maintains | Rating unchanged, restated. |
reiterates | Rating unchanged, emphasized. |
assumes | Coverage transferred to a new analyst at the firm. |
reinstates | Coverage resumed after a pause. |
suspends | Rating suspended — coverage paused without being dropped. |
terminates_coverage_on | Coverage dropped entirely. |
stringYYYY-MM-DD or ISO timestamp (inclusive). since is accepted as an alias.
stringYYYY-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.
stringSQL 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.
enumstate widens q to ticker-state signals evaluated as of each event's timestamp. Never gated.
state | Widen the grammar to ticker-state columns, evaluated as of each event’s timestamp. Resolves at daily grain. |
enumdefault autoGrain 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.
1m | One minute. The finest stored tier; carries the intraday column subset and ~1,100 of ~13,700 tickers. |
1h | One hour. Stored tier, intraday column subset, full universe. |
1d | One day. The full-history, full-column tier — the only grain that carries daily-only columns (SMAs, RSI, fundamentals). |
autodefault | Let the server pick the finest grain whose columns and ticker coverage both work out, resolving upward on a miss. Reported in _meta.interval. |
integerdefault 50Rows per page. Max 1000.
stringOpaque cursor from the previous response.
Returns
as_ofstringServer time this response was assembled (ISO 8601).
queryobjectYour filters, echoed.
countnumberRows in this page.
next_cursorstringOpaque token for the next page; `null` on the last page. Pass it back as `cursor`.
resultsarrayOne row per event, newest first.
tickerstringSymbol the action targets.
tsstringWhen the action landed (timestamp-grained).
kindstringAlways `analyst` on this view.
payloadobjectThe action.
event_idstringStable id for the action.
firmstringResearch firm.
analyststringoptionalAnalyst name, where attributed.
actionstring`upgrades`, `downgrades`, `maintains`, `reiterates`, `initiates_coverage_on`, `assumes`, `reinstates`, `terminates_coverage_on`, `suspends`.
ratingstringoptionalNew rating label; `previous_rating` carries the prior one.
price_targetnumberoptionalNew target (USD); `previous_price_target` carries the prior one.
price_target_actionstringoptionalHow the target moved (`raises`, `lowers`, …).
importancenumberoptionalVendor-assigned salience, 0–5.
Notes
- This is
GET /v2/eventswithkind=analyst; it has its own page because the payload is its own contract. The full query grammar lives there and applies here unchanged, includingjoin=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/eventsreturns 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 carryDeprecation/Sunsetheaders until then. - The ticker object carries live analyst signals (
last_rating_date/last_rating_firm/last_rating_action) andrecent_*booleans for scans. - To be pushed instead of polling, create an event-trigger webhook:
POST /v2/webhookswithtrigger.kinds=analyst.
More examples
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"// Same envelope; query echo carries join: "state" and state_resolution: "1d".