Back to the notebook

Analyst Coverage API: Who Covers a Stock, What They Say, and Which Desks the Feeds Leave Out

Analyst coverage is the set of research firms publishing ratings or price targets on a stock. SentiSense now returns it in one call for about a thousand US names: each firm's latest target and rating where it has one, the analysts it names, and the notes that arrived with no byline.

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

Analyst coverage is the set of research firms that publish ratings or price targets on a stock. SentiSense now returns it in one call for about a thousand US names: each firm's latest price target and rating where it has one, the analysts it names, and how many of its notes arrived without a byline. The same view sits on every covered stock's page in the app, on the Analyst tab next to Financials.

What does the coverage endpoint return?

GET /api/v1/analyst/{ticker}/coverage groups the window's activity by firm, most recently active first. lookbackDays sets the window, default 365 and up to 1825. For NVDA on September 1 that is 41 firms, 27 named analysts and 97 price-target notes. Each row carries:

  • the firm, the named analysts on its desk, and a per-analyst note count and latest target
  • the firm's most recent price-target note when it has one in the window, with the target, the price at publication, and a link to the publisher's article
  • the firm's most recent rating action when it has one: the grade, the prior grade, and the date

Two counts at the top of the response describe the shape of what you are reading. firmCount is every firm that covered the ticker in the window. ratingOnlyFirmCount is how many of them are there on a rating action alone.

curl -H "X-SentiSense-API-Key: ss_live_YOUR_KEY" \
  "https://app.sentisense.ai/api/v1/analyst/NVDA/coverage"

One row from data.coverage[]; the response is wrapped in the usual { isPreview, previewReason, data } envelope:

{
  "firm": "DA Davidson",
  "analysts": [{ "slug": "gil-luria", "name": "Gil Luria", "noteCount": 3, "latestPriceTarget": 300 }],
  "noteCount": 4,
  "unattributedNoteCount": 1,
  "latestNote": { "publishedDate": "2026-08-27", "priceTarget": 300, "priceWhenPosted": 225.64, "newsPublisher": "StreetInsider" },
  "firmRating": { "rating": "Buy", "priorRating": "Buy", "actionType": "REITERATE", "date": "2026-06-01" }
}

Why do some firms show a rating but no price target?

Because the two arrive on different feeds, and the feeds do not move together. A desk's price-target notes can stop appearing for months while its upgrades and downgrades keep flowing. Citigroup, J.P. Morgan and Bank of America are in that state on NVDA and Apple right now. Coverage built from price targets alone would list none of them.

So a firm with a rating action and no target in the window is an ordinary row: noteCount is zero, firmRating is set, and the firm counts toward firmCount. The app shows the same row with the note "No price target in window".

What does "Not named" mean?

In the trailing twelve months, more than half of price-target notes reach us without the analyst's name, and the rate depends on which publisher reported the note, not on the note itself. On NVDA on September 1 it was 44 of 97. Those notes are counted under their firm and marked as unattributed. A firm that appears with a note count and no names covered the stock; the publisher did not say who wrote the note.

The response says this in its own words in attributionNote, so an agent rendering the data can pass the caveat through.

How do I look up one analyst?

A named analyst we hold a profile for carries a slug; a spelling we cannot resolve to one person comes back with slug: null and the name intact. Two endpoints hang off the slug, and both answer 404 for one we do not know:

  • GET /api/v1/analyst/people/{slug} returns the firms the analyst has published under, with first and last note dates for each, and their coverage book across tickers.
  • GET /api/v1/analyst/people/{slug}/calls returns their price-target notes, newest first, paged with limit and offset and a totalCount, each linked to the publisher's article.

In the app, clicking a name on the coverage card opens the same profile in a side panel, and each ticker in the coverage book links to that stock's analyst tab.

What changed on the stock page?

Under the price-target chart, the Analyst tab now leads with Rating Changes, a timeline of upgrades, downgrades and initiations with the grade transition written out (Neutral → Buy), filterable by action. Below it, Analyst Coverage opens on the four counts (firms covering, firms with a price target, named analysts, notes without a byline) and lists the firms with their analysts, current stance and latest target. The tab now sits between News and Financials.

Coverage rows and calls link to the article that reported each note, and profiles are built from those notes. There are no accuracy scores or analyst rankings on any of these surfaces.

How do agents use it?

The SDKs wrap all three endpoints as of today: get_analyst_coverage, get_analyst_profile and get_analyst_calls in Python (sentisense 0.46.0 on PyPI), and analyst.coverage, analyst.profile and analyst.calls in Node (sentisense 0.49.0 on npm). The MCP connector's get_analyst_ratings tool takes view=coverage for a ticker and view=analyst with a name or slug for a person, so an assistant can answer "who covers AMD and what do they say" in one call. The sentisense skill carries the three endpoints with the same caveats, and the API reference documents the fields and the tier rules.

For a covered stock, a free key returns the five most recently active firms with all of the counts intact, the first five tickers of a profile's coverage book, and the first 25 calls; PRO returns the full book and the full history. An ETF has no analyst desk of its own, so its coverage call answers with a pointer to the fund's own endpoints instead.

Get a free API key and pull coverage for any covered stock →