Back to the notebook

Street vs Crowd: What Analysts Say, What the Market Feels, and Who Moved After the Print

Every stock page now opens its Analyst tab with two readings side by side: the share of covering firms at Buy, Hold and Sell, and the SentiSense Score and Sentiment for the same name, today. The coverage API returns the firm counts as ratingBuckets, rating grades come back in one spelling, and a new Analyst Reaction insight names the firms that moved in the five sessions after earnings.

SentiSense Team
SentiSense Team
September 3, 2026 · 5 min read

Two questions get asked about the same stock on the same day, and until now you had to answer them in two places. What does Wall Street say about it? What does everyone else feel about it? The Analyst tab on every SentiSense stock page now opens with both, in one card, in the same tense.

What is the Street vs Crowd card?

The left half is the Street: how many firms currently cover the stock, and what share of them sit at Buy, Hold and Sell, with the consensus price target set against the current price. The right half is the Crowd: the SentiSense Score and the Sentiment reading for the same name, each with its label and the Score's direction over the last seven days.

Above both sits one sentence from a closed set. "Street and crowd lean the same way." "The Street is more positive than the crowd." "The crowd is more positive than the Street." Or, when fewer than five firms rate the stock, "Not enough coverage to compare." There is no fifth sentence, and none of the four says anything about tomorrow. The Score is a nowcast of social and news tone: it describes today, and the card says so under the numbers.

On NVDA this afternoon the card read 31 firms at 97% Buy, 3% Hold and 0% Sell, a consensus target 43% above the current price, a Score in the strong bullish band and rising over the week, and a sentiment reading that agreed. Street and crowd lean the same way. On Robinhood, the same afternoon, the picture was less tidy: the stock ran through eight of the twenty published targets in a single session while the crowd's tone read flat under a spike in mentions.

Every number on the card is available on the free plan.

Where do the firm counts come from?

From the coverage endpoint, which now returns them directly:

curl -H "X-SentiSense-API-Key: ss_live_YOUR_KEY" \
  "https://app.sentisense.ai/api/v1/analyst/NVDA/coverage"
{
  "firmCount": 41,
  "ratingOnlyFirmCount": 6,
  "ratingBuckets": { "buy": 30, "hold": 1, "sell": 0, "unrated": 10, "total": 41 },
  "coverage": [ ... ]
}

ratingBuckets counts every covering firm by the tier of its current rating. Buy is the Buy family (Buy, Overweight, Outperform, Sector Outperform, Strong Buy and the rest of that tier), Hold is the Hold family (Hold, Neutral, Equal-Weight, Market Perform, Sector Weight), Sell is the Sell family. unrated is the firms that publish price targets without a rating we hold, or a grade string we do not recognise. The four always sum to total.

Two details matter if you are building on it. The counts are taken over the whole coverage book before the free-tier preview truncates the firm list, so a free key reads the same ratingBuckets as a paid key even though it sees five firm rows. And these are a different population from the consensus endpoint's strongBuy through strongSell fields, which come from the research vendor's survey rather than from the firms in the book. Use one or the other for a bar; do not mix them.

What changed in the rating data itself?

Three things an agent reading the actions feed will notice.

Grades now come back in one spelling per rating. "Equal Weight" and "Equal-Weight" were two strings in the data and one rating on the desk; the same was true of "In Line", "Mkt Perform" and a few others. Every stored grade is now the majority spelling, so grouping by toGrade groups by rating. A firm's own scale word is kept on purpose: Outperform stays Outperform and Overweight stays Overweight, because that is what the desk said, and both land in the Buy bucket.

An initiation never carries a prior grade. actionType: INITIATE now always has fromGrade: null, at ingest and in the history, so a first Buy renders as "Initiated at Buy" and never as an upgrade from a rating that did not exist.

And a rating action's type agrees with its grades, so filtering on actionType and rendering fromGrade to toGrade from the same row never produces "UPGRADE: Buy to Buy".

Who moved after the print?

Earnings are when most rating changes happen, and the useful question the day after is not "what is the consensus" but "who just changed their mind". A new insight, analyst_reaction, answers it for each print. It watches the five sessions after a company reports, counts the covering firms that raised or lowered a target or changed a rating in that window, and writes one sentence when at least three firms moved or at least one rating changed:

After the Aug 28 print (after close), 6 of 31 covering firms moved in the next five sessions: 4 raised their target, 1 downgraded, 1 lowered a target. 25 firms have not published since.

The unit is the firm, because about half of research notes reach us without the analyst's name and a count that depended on names would be wrong half the time. The denominator is always printed, including in the unflattering case where one firm of thirty moved. A stock carries one reaction per print, refreshed as the window fills in, and it appears in the stock's insights feed, in the earnings dossier, and through the insights API. The five-session window and the three-firm floor were measured on two earnings seasons before they were set: five sessions hold 93% of a firm's first post-print move.

Two calls to reproduce the card

The card is two endpoints, and an agent can build the same comparison for any covered name. The Street half is the coverage call above. The Crowd half is the metrics API, whose {entityId} segment accepts a ticker directly:

curl -H "X-SentiSense-API-Key: ss_live_YOUR_KEY" \
  "https://app.sentisense.ai/api/v1/analyst/HOOD/coverage"
curl -H "X-SentiSense-API-Key: ss_live_YOUR_KEY" \
  "https://app.sentisense.ai/api/v2/metrics/entity/HOOD/metric/sentisense"

Through the MCP connector it is get_analyst_ratings with view=coverage and get_stock_snapshot. In the SentiSense skill, the coverage section documents ratingBuckets and the grade contract above. Both SDKs expose the field as ratingBuckets on the coverage response.

The financial disclaimer applies with unusual force here. A share of firms at Buy is a fact about the firms. A Score in the bullish band is a fact about today's tone. Neither is a recommendation, and the card is built so that it cannot read as one.

The endpoint reference is on the Analyst Ratings API page. No sign-up wall on the docs; the calls above run on a free key: get an API key.