Get Theme Sentiment
curl --request GET \
--url https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions \
--header 'Authorization: <authorization>'import requests
url = "https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"themeId": "<string>",
"positiveSentiment": 123,
"neutralSentiment": 123,
"negativeSentiment": 123,
"positiveSentimentDelta": 123,
"neutralSentimentDelta": 123,
"negativeSentimentDelta": 123,
"totalKeywords": 123
}Sentiment
Get Theme Sentiment
Retrieve sentiment breakdown grouped by theme.
GET
/
ai-analytics-service
/
api
/
public
/
v1
/
sentiment
/
theme
/
mentions
Get Theme Sentiment
curl --request GET \
--url https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions \
--header 'Authorization: <authorization>'import requests
url = "https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"themeId": "<string>",
"positiveSentiment": 123,
"neutralSentiment": 123,
"negativeSentiment": 123,
"positiveSentimentDelta": 123,
"neutralSentimentDelta": 123,
"negativeSentimentDelta": 123,
"totalKeywords": 123
}Returns sentiment data grouped by theme. Each theme shows positive, neutral, and negative mention counts and the number of keywords in the theme.
Parameters
string
required
Bearer token. Format:
Bearer slat_<your-token>.integer
Number of days for the analysis window. Range: 1–365. Default:
30.string
Start of date range. RFC 3339 timestamp (e.g.,
2026-02-01T00:00:00Z). Send together with to.string
End of date range. RFC 3339 timestamp. Send together with
from. Data through the end of this date (UTC) is included. The range can’t exceed 366 days.number
Filter by topic ID.
number
Filter by brand ID. If omitted, uses the brand of the workspace’s most recently updated prompt.
string
Filter by mentioned brand name. Case-insensitive exact match.
string[]
Filter by one or more platforms:
CHATGPT, PERPLEXITY, GOOGLE_AI_OVERVIEW, GOOGLE_AI_MODE, GEMINI, CLAUDE.string
Filter by ISO country code for region.
string
Filter by sentiment label. One of:
positive, neutral, negative (case-insensitive).number
Filter by a single prompt ID.
number[]
Filter by multiple prompt IDs. Maximum 500 values.
Response
Returns200 OK with a JSON array of theme sentiment objects, most-mentioned themes first. Each object has these fields:
string
required
Unique identifier for the theme.
integer
required
Positive mention count for the theme.
integer
required
Neutral mention count.
integer
required
Negative mention count.
integer
Always
null. This endpoint doesn’t calculate period-over-period change.integer
Always
null. This endpoint doesn’t calculate period-over-period change.integer
Always
null. This endpoint doesn’t calculate period-over-period change.integer
required
Number of distinct keywords mentioned in the theme.
Example
curl -s "https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions?dateRange=30&topicId=42" \
-H "Authorization: Bearer slat_YOUR_TOKEN"
import requests
response = requests.get(
"https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions",
headers={
"Authorization": "Bearer slat_YOUR_TOKEN",
},
params={
"dateRange": 30,
"topicId": 42,
},
)
themes = response.json()
for theme in themes:
total = theme["positiveSentiment"] + theme["neutralSentiment"] + theme["negativeSentiment"]
print(f"Theme {theme['themeId']}: {total} mentions")
const params = new URLSearchParams({
dateRange: "30",
topicId: "42",
});
const response = await fetch(
`https://api.slatehq.ai/ai-analytics-service/api/public/v1/sentiment/theme/mentions?${params}`,
{
headers: {
"Authorization": "Bearer slat_YOUR_TOKEN",
},
}
);
const themes = await response.json();
console.log(themes.length, "themes found");
Response
[
{
"themeId": "theme-abc-123",
"positiveSentiment": 45,
"neutralSentiment": 30,
"negativeSentiment": 5,
"positiveSentimentDelta": null,
"neutralSentimentDelta": null,
"negativeSentimentDelta": null,
"totalKeywords": 12
},
{
"themeId": "theme-def-456",
"positiveSentiment": 28,
"neutralSentiment": 42,
"negativeSentiment": 10,
"positiveSentimentDelta": null,
"neutralSentimentDelta": null,
"negativeSentimentDelta": null,
"totalKeywords": 8
}
]
The delta fields are always
null. To compare periods, call this endpoint once for each date range.Status codes
| Status | Description |
|---|---|
200 | Theme sentiment data returned. |
400 | A filter is invalid, such as more than 500 promptIds, an unsupported platform, dateRange outside 1–365, an invalid from/to range, or a sentiment value other than positive, neutral, or negative. |
401 | Missing or invalid Bearer token. See Authentication. |
500 | Internal server error. |
503 | The analytics store is temporarily unavailable (analytics store unavailable). |
What’s next
- Get Overall Sentiment — View aggregated sentiment across all themes.
- Get Citations — View citation sources.
Was this page helpful?