analyst-tracker
You hand over a ticker. The skill pulls every analyst rating event
Benzinga has on record over the lookback window, buckets each firm's
raw rating string to a standard scale (buy / hold / sell), classifies
the event (upgrade / downgrade / initiation / reiteration / PT-change /
drop-coverage), aggregates the latest per firm, and reports the
consensus median price target plus buy/hold/sell distribution.
This is the sell-side lens the repo was missing. Pairs cleanly with
insider-flow (internal vs external sentiment on the same name)
and guidance-tracker (analyst reaction vs management's own
projections).
When to invoke
- A PM asks "how is sell-side positioning shifting on NVDA?"
- Fundamental analyst wants to see who's changed their view and by
how much
- Screening for consensus PT vs current price gap as a mean-reversion
cue
- The user says "analyst ratings", "sell-side", "upgrades",
"downgrades", "price target", "consensus"
Not for: analyst quality or track record (Benzinga returns the ratings,
not the historical accuracy). Not for real-time (Benzinga updates
within minutes but this is not a tick feed).
What you need
- A ticker (
--ticker, required)
MASSIVE_API_KEY exported
- Stocks Basic plan + Benzinga Analyst Ratings entitlement.
The endpoint returns NOT_AUTHORIZED without it; skill emits a
clean tier caveat rather than a raw error.
Optional:
--lookback-days (default 180): calendar-day window back from today.
What you get back
Two output layers from one run.
Layer 1: canonical JSON matching output-schema.json.
Per-event: date, firm, analyst, rating_raw, rating_bucket
(buy / hold / sell / other / unknown), previous_rating_raw,
event_label (upgrade / downgrade / initiation / reiteration /
price_target_change_only / drop_coverage / other), price_target,
previous_price_target, pt_direction, pt_delta_pct. Top-level
summary with event counts, per-firm latest rating distribution,
and consensus median / low / high price target.
Layer 2: rendered note. Header + summary line + rating
distribution + consensus PT, timeline of the last 25 events, one-line
Take. See references/rendering.md.
How it works
- Pull ratings via
GET /benzinga/v1/ratings?ticker={T}&date.gte={D}&limit=1000&sort=date.desc.
- Bucket rating strings using standard synonym sets. Buy set:
buy, strong buy, outperform, overweight, positive, add,
accumulate, top pick. Hold set: hold, neutral, market perform,
equal-weight, in-line. Sell set: sell, underperform, underweight,
reduce, negative. Anything else lands in "other".
- Classify each event. Rating actions like initiates_coverage_on,
upgrade, downgrade, maintains, reiterates map directly. When
Benzinga omits the action but the bucket changed, infer
upgrade/downgrade from the bucket transition.
- Detect price-target-only changes. Reiterated rating + changed
PT gets labeled
price_target_change_only.
- Aggregate latest per firm. Because ratings come newest-first,
the first row per firm gives the latest state. Median across
firms is the consensus PT; buy/hold/sell counts describe the
distribution.
Foundations used
Output mode: note
Narrative note with a timeline. A single-name analyst history is
typically 20-100 events over 6 months; note format reads better than
a wide table.
Endpoints used
GET /benzinga/v1/ratings?ticker={T}&date.gte={D} — every rating
event for the ticker in the window.
Doesn't handle (yet)
- Firm track record. No historical accuracy metric per firm or
analyst.
- Consensus rating vs consensus PT reconciliation. Firms often
raise PT while keeping a Hold rating (or vice versa); these are
reported separately, not reconciled.
- Guidance overlay. Pair with
guidance-tracker for a workflow
composite: "did the analyst move after management guided?"
- Bulls Bears Say text. The endpoint returns rating actions and
PTs; the narrative from Bulls Bears Say is a separate endpoint.
- Peer comparison. No "is NVDA's PT delta above peer set median?"
Queued as a composite.
These are clean PR extensions. Output schema is forward-compatible.
1---2name: analyst-tracker3description: Track sell-side analyst positioning on a name via Benzinga Analyst Ratings. Pulls every rating event over the lookback window, classifies each as upgrade / downgrade / initiation / reiteration / drop-coverage / PT-change, aggregates the latest rating and price target per firm, and reports the current consensus (median PT across firms plus buy/hold/sell distribution). Uses Massive's built-in Benzinga integration. Requires Stocks Basic + Benzinga Analyst Ratings entitlement.4---56# analyst-tracker78You hand over a ticker. The skill pulls every analyst rating event9Benzinga has on record over the lookback window, buckets each firm's10raw rating string to a standard scale (buy / hold / sell), classifies11the event (upgrade / downgrade / initiation / reiteration / PT-change /12drop-coverage), aggregates the latest per firm, and reports the13consensus median price target plus buy/hold/sell distribution.1415This is the sell-side lens the repo was missing. Pairs cleanly with16`insider-flow` (internal vs external sentiment on the same name)17and `guidance-tracker` (analyst reaction vs management's own18projections).1920## When to invoke2122- A PM asks "how is sell-side positioning shifting on NVDA?"23- Fundamental analyst wants to see who's changed their view and by24 how much25- Screening for consensus PT vs current price gap as a mean-reversion26 cue27- The user says "analyst ratings", "sell-side", "upgrades",28 "downgrades", "price target", "consensus"2930Not for: analyst quality or track record (Benzinga returns the ratings,31not the historical accuracy). Not for real-time (Benzinga updates32within minutes but this is not a tick feed).3334## What you need3536- A ticker (`--ticker`, required)37- `MASSIVE_API_KEY` exported38- Stocks Basic plan + **Benzinga Analyst Ratings** entitlement.39 The endpoint returns NOT_AUTHORIZED without it; skill emits a40 clean tier caveat rather than a raw error.4142Optional:4344- `--lookback-days` (default 180): calendar-day window back from today.4546## What you get back4748Two output layers from one run.4950**Layer 1: canonical JSON** matching [`output-schema.json`](./output-schema.json).51Per-event: `date`, `firm`, `analyst`, `rating_raw`, `rating_bucket`52(buy / hold / sell / other / unknown), `previous_rating_raw`,53`event_label` (upgrade / downgrade / initiation / reiteration /54price_target_change_only / drop_coverage / other), `price_target`,55`previous_price_target`, `pt_direction`, `pt_delta_pct`. Top-level56`summary` with event counts, per-firm latest rating distribution,57and consensus median / low / high price target.5859**Layer 2: rendered note**. Header + summary line + rating60distribution + consensus PT, timeline of the last 25 events, one-line61Take. See [`references/rendering.md`](./references/rendering.md).6263## How it works64651. **Pull ratings** via66 `GET /benzinga/v1/ratings?ticker={T}&date.gte={D}&limit=1000&sort=date.desc`.672. **Bucket rating strings** using standard synonym sets. Buy set:68 buy, strong buy, outperform, overweight, positive, add,69 accumulate, top pick. Hold set: hold, neutral, market perform,70 equal-weight, in-line. Sell set: sell, underperform, underweight,71 reduce, negative. Anything else lands in "other".723. **Classify each event.** Rating actions like initiates_coverage_on,73 upgrade, downgrade, maintains, reiterates map directly. When74 Benzinga omits the action but the bucket changed, infer75 upgrade/downgrade from the bucket transition.764. **Detect price-target-only changes.** Reiterated rating + changed77 PT gets labeled `price_target_change_only`.785. **Aggregate latest per firm.** Because ratings come newest-first,79 the first row per firm gives the latest state. Median across80 firms is the consensus PT; buy/hold/sell counts describe the81 distribution.8283## Foundations used8485- [`massive-api-patterns`](../massive-api-patterns) for REST auth,86 retry, and pagination.8788## Output mode: note8990Narrative note with a timeline. A single-name analyst history is91typically 20-100 events over 6 months; note format reads better than92a wide table.9394## Endpoints used9596- `GET /benzinga/v1/ratings?ticker={T}&date.gte={D}` — every rating97 event for the ticker in the window.9899## Doesn't handle (yet)100101- **Firm track record.** No historical accuracy metric per firm or102 analyst.103- **Consensus rating vs consensus PT reconciliation.** Firms often104 raise PT while keeping a Hold rating (or vice versa); these are105 reported separately, not reconciled.106- **Guidance overlay.** Pair with `guidance-tracker` for a workflow107 composite: "did the analyst move after management guided?"108- **Bulls Bears Say text.** The endpoint returns rating actions and109 PTs; the narrative from Bulls Bears Say is a separate endpoint.110- **Peer comparison.** No "is NVDA's PT delta above peer set median?"111 Queued as a composite.112113These are clean PR extensions. Output schema is forward-compatible.