curl --request GET \
--url https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment \
--header 'Authorization: Bearer <token>'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment', 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://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment",
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: Bearer <token>"
],
]);
$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://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"window": {
"windowDays": 30,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25",
"dataFrom": "2023-12-25"
},
"overall": {
"averageScore": 0,
"label": "positive",
"positive": 1,
"neutral": 1,
"negative": 1,
"coverage": {
"responses": 1,
"scoredResponses": 1,
"daysWithheld": 1
}
},
"trend": [
{
"averageScore": 0,
"label": "positive",
"positive": 1,
"neutral": 1,
"negative": 1,
"coverage": {
"responses": 1,
"scoredResponses": 1
},
"date": "2023-12-25"
}
]
},
"meta": {
"timestamp": "2023-11-07T05:31:56Z",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}Get brand sentiment
Returns the sentiment of AI answers towards the project’s primary brand over a fixed window of completed UTC days ending yesterday: overall and for each day, across every platform. Each answer that mentions the primary brand is scored from -1 to 1 for its stance towards that brand. Sentiment uses an LLM scorer, or Jev where enabled, with LLM fallback when Jev abstains (below 0.5 confidence), fails, or is unavailable. The score is about the primary brand only, never competitors, and answers that do not mention it are not scored. Each answer counts once, including answers whose brand has since stopped being primary. There is no per-platform breakdown. Days before 20 September 2026 are withheld: they were stored by an earlier version that scored a different subject and counted failed attempts. overall leaves withheld days out, window.dataFrom is the first day it counts and overall.coverage.daysWithheld how many days it left out; a withheld trend day has every figure null. averageScore and label are null when no answer was scored, never 0. coverage says how many answers were in the window and how many were scored.
curl --request GET \
--url https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment \
--header 'Authorization: Bearer <token>'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment', 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://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment",
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: Bearer <token>"
],
]);
$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://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/visibility/sentiment")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"window": {
"windowDays": 30,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25",
"dataFrom": "2023-12-25"
},
"overall": {
"averageScore": 0,
"label": "positive",
"positive": 1,
"neutral": 1,
"negative": 1,
"coverage": {
"responses": 1,
"scoredResponses": 1,
"daysWithheld": 1
}
},
"trend": [
{
"averageScore": 0,
"label": "positive",
"positive": 1,
"neutral": 1,
"negative": 1,
"coverage": {
"responses": 1,
"scoredResponses": 1
},
"date": "2023-12-25"
}
]
},
"meta": {
"timestamp": "2023-11-07T05:31:56Z",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}Authorizations
API key with dtk_live_ prefix. Obtain it from API Keys in the account sidebar. New keys start with all supported scopes selected for the chosen project, and you can narrow them to specific read/write scopes as needed.
Path Parameters
Query Parameters
Fixed rolling window in days. Supported values are 30 and 90. Defaults to 30.
30, 90