---
title: "Sentiment by topic (Growth plan or above)"
method: GET
path: "/reports/sentiment/topics"
tags: ["Sentiments"]
---

# Sentiment by topic (Growth plan or above)

`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`

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.

## Query parameters

- `project_id` integer, required
- `range` integer
- `from` string, date-time
- `to` string, date-time
- `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'
- `collection_id` string
- `country_code` string
- `language_code` string
- `brand_kind` 'brand' | 'brand_other' | 'non_brand'
- `analysis` string
- `topic` string
- `query` string
- `brand` string
- `sort` 'mentions' | 'name' | 'positive' | 'negative' | 'neutral' | 'net_score'
- `sort_dir` 'desc' | 'asc'
- `page` integer
- `per_page` integer
- `output` 'flat' | 'csv'

## Response `200`

Paginated topic rows

- SentimentTopicsResponse: Envelope shared by the paginated listings; each listing adds its own data rows
  - `project_id` integer, required
  - `page` integer, required
  - `per_page` integer, required
  - `total` integer, required: Rows matching the filters across every page
  - `request_id` string, required
  - `from` string, date-time, required
  - `to` string, date-time, required
  - `brand` SentimentBreakdownBrand, required
    - `type` 'project' | 'competitor' | 'all', required
    - `id` integer, nullable: The competitor id when type is competitor
    - `name` string, nullable
  - `sort` string, required
  - `sort_dir` string, required
  - `data` SentimentTopicRow[], required
    - `topic` string, required
    - `mentions` integer, required: Analyzed mentions
    - `positive` integer, required: Positive and very positive
    - `neutral` integer, required
    - `negative` integer, required: Negative and very negative
    - `positive_pct` number, required
    - `neutral_pct` number, required
    - `negative_pct` number, required
    - `net_score` number, required: Positive minus negative, divided by mentions, times 100

## Other responses

- `403`: Endpoint requires the Growth plan or above
- `422`: Invalid parameters

## Changes

- **2026-10-16** `dd090b1e1154`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/llmpulse/apis/llm-pulse-api/changes/reports/sentiment/topics/get.md)

---

[API](https://skmtc.dev/llmpulse/apis/llm-pulse-api.md) - [All operations](https://skmtc.dev/llmpulse/apis/llm-pulse-api/llms.txt) - [OpenAPI document](https://skmtc.dev/llmpulse/apis/llm-pulse-api/revisions/38a31f123641?raw)
