Skip to main content
POST
Per-brand sentiment as percentages from either AI responses or the pages those responses cite. asset is required because sentiment is calculated for one brand at a time.
  • source: "response" (default): sentiment in AI responses. Metrics are positive_sentiment, negative_sentiment, and opt-in occurrence.
  • source: "citation": one row per cited page, with positive_sentiment, negative_sentiment, and model-balanced citation_share. It defaults to sorting by citation_share; explicitly set sort.field to positive_sentiment to sort by page sentiment instead.
  • Comparison dates: add comparison_start_date and comparison_end_date. Response rows include previous sentiment metrics. Citation rows include the page’s previous citation_share.
Response sentiment supports up to two group_by dimensions from topic, region, model, prompt, persona, tag, theme, claim, run, and competitor, plus date. Citation sentiment is page-only and rejects group_by; use filters to narrow the page population. Both sources accept prompt-layer filters such as model, topic, region, persona, prompt, and tag, plus top-level theme / claim filters. Citation sentiment additionally accepts these top-level filters:
  • citation_category: is or in. Values can be built-in categories (owned, competition, social, earned_media, earned_institutions, pr_wire, other) or a custom category value.
  • page: contains_case_insensitive with one non-empty value. This searches the normalized page URL.
include_cited_websites: true applies only to response sentiment grouped by theme and/or claim.
Citation sentiment describes the cited page. A model filter changes which models’ citations contribute to page eligibility and citation share; it does not turn page sentiment into a model-specific sentiment score.
New to the v2 reports? See Filtering & concepts for the shared request shape, filter tree, grouping, and pagination.
POST /v2/reports/sentiment/stream supports both response and citation sentiment and returns Server-Sent Events: one summary event (the info block), then one result event per row. limit/cursor are ignored; it returns everything by default. Pass max_results to cap. With source: "citation", each result is the same page-level shape returned in data by the paginated endpoint.
Response (text/event-stream)

Citation-page example

This request returns owned pages containing tryprofound.com, ordered by their current citation share. Combine citation-layer leaves with other filters under a top-level and.
cURL
200

Authorizations

X-API-Key
string
header
required

Body

application/json
category_id
string<uuid>
required
asset
string
required

The brand name to analyze (sentiment is extracted on name, not id).

start_date
string
required

YYYY-MM-DD, ET, inclusive

end_date
string
required

YYYY-MM-DD, ET, inclusive

comparison_start_date
string | null

YYYY-MM-DD, ET, inclusive (with end).

comparison_end_date
string | null

YYYY-MM-DD, ET, inclusive (with start).

source
enum<string>
default:response
Available options:
response,
citation
group_by
enum<string>[]
Available options:
date,
model,
topic,
region,
prompt,
persona,
tag,
theme,
claim,
run,
competitor
metrics
enum<string>[] | null
Available options:
positive_sentiment,
negative_sentiment,
occurrence,
citation_share
interval
enum<string>
default:day
Available options:
day,
week,
month
filter
FilterNode · object | null

A leaf (field/op/value) or an and/or/not group.

sort
SortSpec · object
include_cited_websites
boolean
default:false

Return cited websites per row (only when grouping by theme/claim).

limit
integer | null

Page size; default 10, max 50.

Required range: 0 < x <= 50
max_results
integer | null

Stream endpoint only: cap the number of streamed rows (default: all).

Required range: x > 0
cursor
string | null

Response

Successful Response

info
SentimentV2Info · object
required
data
SentimentRow · object[]
required