Sentiments

Sentiment by topic (Growth plan or above)

Changed on

One row per topic AI answers associate with the brand (topics are matched case-insensitively), with its analyzed mentions, the positive (very positive included), neutral and negative counts, their shares on a 0-100 scale and the net sentiment score ((positive - negative) / mentions x 100). The same rows and filters as the Topics tab of the Sentiment page: the window defaults to the last 28 days, brand empty counts your own brand, all every brand and a competitor id that competitor. Requires the Growth plan; lower tiers receive ERR_PLAN_REQUIRED.

get/reports/sentiment/topics

Request

  • Base URL
    https://api.llmpulse.ai/api/v1
  • URL
    https://api.llmpulse.ai/api/v1/reports/sentiment/topics
  • Auth
    API key in header Authorization

Query parameters

project_idinteger required

Project ID

rangeinteger

Number of days to look back, today included (default 28, like the Sentiment page). Ignored when from or to is given.

fromstring date-time
tostring date-time

End of the window. A date-only value such as 2026-09-01 covers that whole day. Pass a full timestamp to end the window earlier.

model'chatgpt' | 'perplexity' | 'ai_mode' | 'ai_overview' | 'gemini' | 'copilot' | 'amazon_rufus' | 'claude' | 'grok' | 'deepseek' | 'naver_ai' | 'baidu_ai' | 'meta_ai' | 'naver_ai_tab' | 'qwen' | 'doubao'

Filter by one AI model. It must be a model enabled for the API key's user: an unknown value, or a model the user has not enabled, returns 422 ERR_INVALID_PARAM with the valid values in the message.

collection_idstring

One collection/tag ID or a comma-separated list of IDs. A query value is always a string on the wire, so it is typed as one: the previous integer-or-string union made generators emit a wrapper type they could not serialize.

country_codestring

One ISO country code or a comma-separated list (e.g. US,GB,DE)

language_codestring

One ISO language code or a comma-separated list (e.g. en,es,de)

brand_kind'brand' | 'brand_other' | 'non_brand'

Filter by brand kind: brand (own brand/products), brand_other (competitors/other brands), non_brand (generic, no brand named). For fair 1:1 brand-vs-competitor comparisons (visibility, share of voice), use non_brand: brand-focused prompts skew results toward the brand they name. The in-app Overview page applies non_brand by default.

analysisstring

One sentiment level or a comma-separated list: very_positive, positive, neutral, negative, very_negative

topicstring

Only sentiments tagged with this topic (case-insensitive)

querystring

Only sentiments whose answer or prompt text contains this text

brandstring

Whose sentiment to count. Empty or omitted for your own brand, all for every brand, or a competitor id (an unknown id returns ERR_INVALID_PARAM).

sort'mentions' | 'name' | 'positive' | 'negative' | 'neutral' | 'net_score'

Sort column: mentions, name (the topic or tag), positive, negative or neutral (their shares) or net_score. Ties sort by name.

sort_dir'desc' | 'asc'
pageinteger
per_pageinteger
output'flat' | 'csv'

Rectangular output for BI tools (Tableau, Excel, Sheets, ELT). Omit for the default nested JSON. 'flat' returns the same metadata plus 'columns' and 'rows'; 'csv' returns those rows as text/csv. Errors are always returned as JSON.

Response

Paginated topic rows

project_idinteger required
pageinteger required
per_pageinteger required
totalinteger required

Rows matching the filters across every page

request_idstring required
fromstring date-time required
tostring date-time required
sortstring required
sort_dirstring required

Changes