FrameFetch
For agents → Try it free
Audience mood, not a per-comment label

Comment Sentiment API

Get the overall mood of a video's comment section in one call — positive/neutral/negative percentages, a plain-English summary, the recurring themes people bring up, and a representative quote per side. No NLP pipeline to build, host, or tune: send the same video URL you'd send for a transcript, add one field.

Read the docs Pricing

Why this is worth a dedicated field

"What do people think of this video" is a question every creator, brand-monitoring tool, and research pipeline asks — and today the honest answer is DIY: scrape the comments yourself, wire up a sentiment classifier (or ship every comment to an LLM one at a time), aggregate the labels, and hope your prompt handles sarcasm and thread noise reasonably. The tooling that exists for this is either a raw comment-scraping library with no sentiment layer at all, or a thin listing on an API marketplace that just proxies a generic classifier per comment. FrameFetch does the whole rollup — fetch, read, aggregate — in one priced call.

One call, an aggregated mood out

Add "comment_sentiment" to fields on /v1/extract (or /v1/batch) and FrameFetch auto-includes "comments" as its input — fetched via yt-dlp's info-json pass on YouTube. One Groq chat-completion call (llama-3.3-70b-versatile, temperature 0, JSON mode) then reads up to 100 of the fetched comments (each truncated to 280 characters) and judges the comment section as a whole — not by scoring each comment individually and averaging.

curl -X POST https://framefetch.net/v1/extract \
  -H "Authorization: Bearer <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "fields": ["comments", "comment_sentiment"],
    "comments_cap": 50
  }'
"comments": {
  "items": [ { "text": "This made my day!", "author": "@zoofan", "like_count": 42, "reply_count": 2 } ],
  "total_fetched": 50,
  "cap_applied": 50,
  "sort": "top"
},
"comment_sentiment": {
  "positive_pct": 78,
  "neutral_pct": 18,
  "negative_pct": 4,
  "summary": "Viewers overwhelmingly find the clip charming and nostalgic, with a few noting the low video quality.",
  "top_themes": ["nostalgia", "elephants", "video quality"],
  "representative": { "positive": "This made my day!" }
}

This is the real response shape from FrameFetch's docs — comments.items only ever carries the display author handle, never a user id, profile URL, or avatar.

What's in the response
FieldShapeWhat it captures
positive_pct / neutral_pct / negative_pctintegersSum to exactly 100 (renormalized server-side via largest-remainder rounding if the model's raw split is off by a point or two)
summarystring2-3 plain-English sentences characterizing how the audience reacted overall
top_themesstring[]Up to 5 short recurring themes across the comments, most common first
representative{ positive?, negative? }One short exemplar comment per polarity, quoted from the actual input, when the model found a good one for that side

No per-comment output: comment_sentiment is deliberately a rollup, not a labeled list of every comment — that keeps it a flat, predictable price regardless of how many comments were fetched, and keeps the answer skimmable instead of another wall of JSON.

YouTube only — stated up front

Comment sentiment needs comments to read, and FrameFetch's one reliable public comment source today is YouTube (via yt-dlp's info-json comments pass). Reddit's own public comment source — the unauthenticated thread JSON API — worked the same way until Reddit deprecated unauthenticated access to it on 2026-05-28; every request now returns a hard 403 regardless of proxy or user-agent, so comments and comment_sentiment on Reddit now degrade the same way TikTok, Instagram, and Pinterest already did (they never had a reliable public comment source to begin with). All four are simply omitted with a warning, never billed. Check GET /v1/platforms (the comments capability flag) before requesting it, rather than finding out from a warning after the fact.

A real floor: 5 comments minimum

comment_sentiment requires at least 5 fetched comments to run at all — a comment section that thin isn't statistically meaningful to summarize, and letting the model guess anyway would just manufacture a false sense of confidence. Fewer than 5 (or the underlying comments fetch having failed) omits comment_sentiment with a warning in the response's warnings array, and it is not charged. A model or parse failure — unparseable JSON, a degenerate all-zero percentage split — degrades the same way.

Flat, honest pricing

Priced flat rather than per-comment, because the model reads a fixed batch (up to 100 comments) regardless of how many were actually fetched: $0.006 per call for comment_sentiment, on top of the $0.0045 comments call it rides on — $0.0105 total when both are actually produced in the same call. Both are billed independently and additively: requesting comment_sentiment alone still bills the underlying comments fetch it depends on. See the full rate card.

Best-effort, never charged on failure

Treated exactly like digest and structured: best-effort, never a hard failure of the whole call. An unsupported platform, a fetch/parse failure on the underlying comments, fewer than 5 comments, or an unparseable model response all omit comment_sentiment, append a plain-English string to the top-level warnings array, and are not billed — the rest of the response (transcript, metadata, frames) stays intact. These degrade cases never surface as an HTTP error code, only as a warning string.

Use it from an AI agent (MCP)

FrameFetch ships an MCP server at POST https://framefetch.net/mcp. The framefetch_extract tool takes the same fields: ["comments", "comment_sentiment"] plus a top-level comments_cap argument — identical behavior to the HTTP API, no separate tool. See the MCP setup guide for a working client config.

FAQ
What is comment_sentiment?

An aggregated read of how a video's audience feels overall, derived from its top-level comments: positive_pct/neutral_pct/negative_pct (summing to 100), a 2-3 sentence summary, up to 5 recurring top_themes, and one representative quote per polarity when a good one exists. Add comment_sentiment to fields; it auto-includes comments as its input.

Which platforms does it work on?

YouTube only — the one platform FrameFetch has a reliable public comment source for. Reddit's unauthenticated comment API was deprecated by Reddit on 2026-05-28; TikTok, Instagram, and Pinterest never had a reliable public comment source. All four omit both comments and comment_sentiment with a warning, never a charge.

Do I need a minimum number of comments?

Yes — at least 5 fetched comments. Below that, a comment section is too thin to summarize meaningfully, so comment_sentiment is omitted with a warning and the call is not charged for it. This is a real floor, not a formality: a 2-comment thread would just make the LLM guess.

How does it work under the hood?

One Groq chat-completion call (llama-3.3-70b-versatile, temperature 0, JSON mode) reads up to 100 of the fetched comments (each truncated to 280 characters) and judges the comment section as a whole, not per-comment. The three percentages are renormalized server-side (largest-remainder rounding) so they always sum to exactly 100.

How is it priced?

A flat $0.006 per call for comment_sentiment, on top of the $0.0045 comments call it rides on ($0.0105 total when both are actually produced) — charged only when the sentiment rollup is actually produced.

Can I see individual comments too?

Yes — comments (which comment_sentiment auto-includes) returns up to comments_cap raw top-level comments with text, a display author handle, like_count, and reply_count. Request it directly if you want the list without the LLM rollup.